学习了学单片机必会学到的流水灯设计,分享给大家:
一个为普通的,一个为个人小创意;
普通的:
普通版:
- #include <reg51.h>
- void delay1s() //延时函数(利用空循环延时1s)
- {
- int i ,j;
- //定义循环变量
- for(i = 0;i<110; ++i) //循环1
- {
- for(j = 0;j<1000;++j) //循环2
- {
- ;
- }
- }
- }
- void main() //主函数
- {
- unsigned char a = 0x01; //0000 0001的十六进制形式
- while(1) //无限循环
- {
- if(a == 0x00) //如果高位溢出(逻辑移位结果为0000 0000)
- {
- a = 0x01; //则恢复
- }
- P2 = a; //循环点亮led灯
- a = a<<1; //逻辑移位语句
- delay1s();
- }
- }
- 通过数组实现版:
- #include<reg51.h>
- char LEDChar[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- void delay_ms(unsigned int time)
- {
- unsigned int j=0;
- for(;time>0;time--)
- for(j=0;j<125;j++);
- }
- void main()
- {
- char i=0;
- while(1)
- {
- for(i=0;i<8;i++)
- {
- P0=LEDChar[ i];
- delay_ms(1000);
- }
- }
- }
复制代码
个人创意的(提供两种实现方式,通过有无“//”来转换):
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char //定义无符号字符型变量uchar
- #define uint unsigned int //定义无符号整型变量uint
- void DelayMs(uint x)
- { uchar t ;
- while(x--)
- { for(t=0;t<120;t++);
- }
- }
- void main()
- {
- uchar i;
- P0=0xfe;
- while(1)
- {
- // P0=0xf7;
- // DelayMs(500);
- // P0=0xfd;
- // DelayMs(500);
- // P0=0x7f;
- // DelayMs(500);
- // P0=0xfb;
- // DelayMs(500);
- // P0=0xfe;
- // DelayMs(500);
- // P0=0xbf;
- // DelayMs(500);
- // P0=0xef;
- // DelayMs(500);
- // P0=0xdf;
- // DelayMs(500);
- // P0=0xf7;
-
- for(i=0;i<7;i++)
- {
- P0=_crol_(P0,1); //P0端口向左循环移动一位
- DelayMs(150);
- }
-
- for(i=0;i<7;i++)
- {
- P0=_cror_(P0,1); //P0端口向右循环移动一位
- DelayMs(150);
- }
- }
- }
复制代码
|