51单片机学习总结系列(一)之驱动流水灯(1)
2014-12-26 11:27
190 查看
51单片机驱动流水灯可以更好的理解IO口,这一节就主要来用查表法和移位法来实现流水灯,首先先看电路图。
电路比较简单,发光二极管正极接5V电源,负极接470Ω限流电阻,接单片机P0口,限流电阻470Ω怎么计算?来看看,普通发光二极管正向饱和电压为1.6~2.1V,正向饱和电流为5~20mA,但不同颜色的发光二极管参数有所差异。这里没必要精确计算,我们取中间值电压1.8V,电流10mA。由欧姆定律,解得R=(5-1.8)/10=320Ω,图中电阻选用常用的470Ω。
由电路图可以知道,单片机P0口只需要输出低电平,就可以点亮LED灯。图中采用低电平驱动,主要是P0口低电平驱动能力比较好。
现在先来看个闪烁灯的程序。
这个程序比较简单,但同时也说明了51单片机可以对单个位定义操作,在16位MSP430单片机中就不能单独操作一个位。在程序的编写中就比较方便。
流水灯程序以下用两种方法,首先先看查表法,部分程序说明在代码中解释。
移位法:
电路比较简单,发光二极管正极接5V电源,负极接470Ω限流电阻,接单片机P0口,限流电阻470Ω怎么计算?来看看,普通发光二极管正向饱和电压为1.6~2.1V,正向饱和电流为5~20mA,但不同颜色的发光二极管参数有所差异。这里没必要精确计算,我们取中间值电压1.8V,电流10mA。由欧姆定律,解得R=(5-1.8)/10=320Ω,图中电阻选用常用的470Ω。
由电路图可以知道,单片机P0口只需要输出低电平,就可以点亮LED灯。图中采用低电平驱动,主要是P0口低电平驱动能力比较好。
现在先来看个闪烁灯的程序。
/********************************************* **程序名称:LED闪烁灯 **程序功能:一个LED闪烁,频率为2HZ **编写:李松泽 **时间:2014-12-25 **********************************************/ #include <reg52.h> sbit LED=P0^0;//位定义 #define uchar unsigned char #define uint unsigned int /********************************************* **函数名称:void delay_ms(uint x) **函数功能:延时xms **入口参数:uint x **出口参数: *********************************************/ void delay_ms(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } /********************************************* **函数名称:void main() **函数功能:主函数 **入口参数: **出口参数: *********************************************/ void main() { while(1) { LED=0;//LED亮 delay_ms(500); LED=1;//LED灭 dealy_ms(500); } }
这个程序比较简单,但同时也说明了51单片机可以对单个位定义操作,在16位MSP430单片机中就不能单独操作一个位。在程序的编写中就比较方便。
流水灯程序以下用两种方法,首先先看查表法,部分程序说明在代码中解释。
/********************************************* **程序名称:驱动流水灯 **程序功能:8个LED依次从左到右,从右到左点亮,频率为500ms **编写:李松泽 **时间:2014-12-25 **********************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//赋给P0口的数据 /********************************************* **函数名称:void delay_ms(uint x) **函数功能:延时xms **入口参数:uint x **出口参数: *********************************************/ void delay_ms(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } /********************************************* **函数名称:void main() **函数功能:主函数 **入口参数: **出口参数: *********************************************/ //查表法: void main() { while(1) { uchar i; for(i=0;i<16;i++) { P0=tab[i]; delay_ms(500); } } }
移位法:
/********************************************* **程序名称:驱动流水灯 **程序功能:8个LED依次从左到右,从右到左点亮,频率为500ms **编写:李松泽 **时间:2014-12-25 **********************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int /********************************************* **函数名称:void delay_ms(uint x) **函数功能:延时xms **入口参数:uint x **出口参数: *********************************************/ void delay_ms(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } /********************************************* **函数名称:void main() **函数功能:主函数 **入口参数: **出口参数: *********************************************/ //移位法: void main() { uchar i,j; while(1) { P0=0xfe; for(i=0;i<8;i++) { delay_ms(500);//进入循环,先延时500ms P0<<=1; //P0口数据左移 P0|=0x01; //将低位置1 } P0=0x7f; for(i=0;i<8;i++) { delay_ms(500);//进入循环,先延时500ms P0>>=1; //P0口数据左移 P0|=0x80;//将高位置1 } } }
相关文章推荐
- 【原创】关于wince os开发面试的总结系列之驱动
- 暑假学习总结——AVR系列(一)
- http协议学习和总结系列——协议详解篇
- http协议学习和总结系列——协议详解篇
- http协议学习和总结系列--深入了解篇
- c++学习总结系列--序言
- linux设备驱动学习笔记7------led流水灯的驱动编写
- 步步为营 .NET 设计模式学习笔记系列总结
- 步步为营 .NET 设计模式学习笔记系列总结
- http协议学习和总结系列——深入了解篇
- [C++再学习系列] STL容器删除操作总结
- 字符设备驱动的学习总结
- http协议学习和总结系列——基础概念篇
- 步步为营 .NET 设计模式学习笔记系列总结
- [C++再学习系列] STL容器删除操作总结
- windows CE驱动开发学习 总结
- http协议学习和总结系列1
- ASP.NET AJAX深入浅出系列课程(学习总结二)
- 步步为营 SharePoint 开发学习笔记系列总结
- 学习VFS总结系列1