- //按键按一次一分钟定时再按一次是3分钟定时控制P3^3口
- //单片机是STC15F104W
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key = P3^2; // 按键连接在P3.2引脚
- sbit led = P3^3; // LED连接在P3.3引脚
- uchar key_press_count = 0; // 按键按下次数
- //bit timer_running = 0; // 定时器运行状态
- uint timer_count = 0; // 定时计数
- //uchar timer_mode = 0; // 定时模式,0表示未设置,1表示1分钟,2表示3分钟
- // 定时器初始化函数
- void Timer0Init()//50ms
- {
- TMOD = 0xF0;
- TH0 = (65536 - 50000) / 256;
- TL0 = (65536 - 50000) % 256;
- EA = 1;
- ET0 = 1;
- TF0 = 0;
- TR0 = 0;
- }
- // 延时函数50MS
- void delay()
- {
- unsigned char data i, j, k;
- i = 3;
- j = 72;
- k = 161;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- // 按键扫描函数
- void key_scan()
- {
- if(key == 0) // 检测按键是否按下
- {
- delay(); // 消抖
- if(key == 0)
- while(!key); // 等待按键释放
- {
- key_press_count++; // 增加按键次数
- if(key_press_count==1){
- timer_count=1200;
- led = 1;
- TR0 = 1;
- }
- else if(key_press_count==2){
- timer_count=3600;
- led = 1;
- TR0 = 1;
- }
- else {
- key_press_count=0;
- timer_count = 0;
- led = 0;
- TR0 = 0;
- }
- }
- }
- }
- void main()
- {
- Timer0Init(); // 初始化定时器
- led = 0; // 初始化LED状态为关闭
- while(1)
- {
- key_scan(); // 按键扫描
- }
- }
- // 定时器0中断服务函数
- void Timer0Interrupt(void) interrupt 1
- {
- timer_count--;
- if(timer_count==0)
- {
- TR0=0;
- led=0;
- }
- }
复制代码
代码BUG有点多,定时器是50ms中断一次,1min=60S=1200x50ms,不是120000啊!还有你中断一直没关,就这样吧,我这个是调试时用的,按第二次一直有个短脉冲,可能是杜邦线当按键的原因,你可以把延时消抖可以改小点。然后感觉思路有点问题,中断函数应该尽可能短,建议把定时器设置为16位自动重装模式,使用标志位或者像我那样控制,然后用switch把值给timer_count,定时器的开关一定要准,不然会软件定时一样误差比较大,然后记得给定时器中断关掉,最后建议重构。 |