博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51单片机学习总结系列(一)之驱动流水灯(1)
阅读量:4125 次
发布时间:2019-05-25

本文共 2982 字,大约阅读时间需要 9 分钟。

       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口低电平驱动能力比较好。

        现在先来看个闪烁灯的程序。

/***********************************************程序名称:LED闪烁灯**程序功能:一个LED闪烁,频率为2HZ**编写:李松泽**时间:2014-12-25**********************************************/#include 
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 
#define uchar unsigned char#define uint unsigned intuchar 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 
#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 } }}

你可能感兴趣的文章
Remove Duplicates from Sorted Array--从有序数组中移除重复元素
查看>>
Count and Say
查看>>
Gas Station
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
Valid Palindrome 简单的回文判断
查看>>
Pascal's Triangle -- 生成杨辉三角
查看>>
Pascal's Triangle II 生成杨辉三角中的某行
查看>>
Minimum Depth of Binary Tree -- 二叉树的最小深度 DFS 加剪枝
查看>>
Climbing Stairs 爬楼梯方法 动态规划
查看>>
Merge Two Sorted Lists 合并两个有序链表
查看>>
pow(x,n) 为什么错这么多次
查看>>
Jump Game 动态规划
查看>>
Binary Tree Maximum Path Sum 自底向上求解(重重重重)
查看>>
Subsets 深搜
查看>>
Subsets II
查看>>
Edit Distance 字符串距离(重重)
查看>>
Gray Code 格雷码
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
web.py 0.3 新手指南 - 如何用Gmail发送邮件
查看>>
web.py 0.3 新手指南 - RESTful doctesting using app.request
查看>>