能够实现一下功能:
1、按下模式1按钮时,实现如下功能:
D2亮(其它灯不亮)→D4亮(其它灯不亮)→D6亮(其它灯不亮)→D8亮(其它灯不亮)并且以此循环,每个等亮1S(用定时器实现延时)。
2、按下模式2按钮时,实现如下功能:
D1不亮(其它灯亮)→D3不亮(其它灯亮)→D5不亮(其它灯亮)→D7不亮(其它灯亮)并且以此循环,每个灯点亮1S(用定时器实现延时)。
3、当按下停止按钮时,停止工作,所有等熄灭。(适合初学者参考学习)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真放大图
仿真图
实现的功能(题目要求u)
程序的一部分
单片机源程序如下:
- #include <reg51.h>
- sbit key1 = P3^2;//给P3_2重命名
- sbit key2 = P3^4;//给P3_4重命名
- sbit key3 = P3^6;//给P3_6重命名
- unsigned char LED_shift[8] = {0xfd, 0xf7, 0xdf, 0x7f, 0x01, 0x04, 0x10, 0x40};
- void delay()//延时函数
- {
- unsigned int i = 1000;
- while(i--);
- }
- void main()//主函数
- {
- unsigned char cnt= 0;//设置标志位
- unsigned char tmp = 0;
- unsigned char sec = 0;
- unsigned char shift = 0;
-
- TMOD = 0x01;//设置定时器0为定时模式,方式1
- TH0 = (65536 - 10000)/256;
- TL0 = (65536 - 10000)%256;//初值计算
- TR0 = 1;
-
- while(1)//死循环
- {
- if(key1 == 0)//按键检测
- {
- delay();//防抖
- if(key1 == 0)
- {
- shift = 1;
- }
- while(!key1);
- }
- if(key2 == 0)//按键检测
- {
- delay();//防抖
- if(key2 == 0)
- {
- while(!key2);
- }
- shift = 2;
- }
- if(key3 == 0)//按键检测
- {
- delay();//防抖
- if(key3 == 0)
- {
- while(!key3);
- }
- shift = 0;
- }
- if(TF0 == 1)
- {
- TF0 = 0;
- TH0 = (65536 - 10000)/256;
- TL0 = (65536 - 10000)%256; //初值重装
-
- tmp++;
- if(tmp >= 99)//定时1秒
- {
- tmp = 0;//重新清零
- if(shift == 0)
- {
- P1 = 0xff;
- }
- else if(shift == 1)
- {
- if(sec < 4)
- {
- P1 = LED_shift[sec];
- sec++;
- }
- else
- {
- sec = 0;
- }
- }
- else if(shift == 2)
- {
- if(sec < 4)
- {
- P1 = LED_shift[sec+4];
- sec++;
- }
- else
- {
- sec = 0;
- }
- }
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
定时计数器控制流水灯.zip
(53.8 KB, 下载次数: 72)
|