这是一个单片机定时控制器,数码的大神帮我写的。想要加入蜂鸣器功能,按键时响一下,定时结束时长响一下,另外继电器控制部分不能用,时什么原因?
- /********************************************************
- *
- *proteus仿真中晶振电路及复位电路自行添加
- *晶振:12M
- *
- *
- *********************************************************/
- #include <reg51.h>
- sbit K1=P2^0; // 开始
- sbit K2=P2^1; // 加
- sbit K3=P2^2; // 减
- sbit relay=P2^7;
- sbit wei1=P3^6;
- sbit wei2=P3^7;
- bit flag=0; //
- int L[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选数据 根据实际电路修改
- int wei[8]={0xbf,0x7f}; //数码管位选信号 根据实际电路修改
- unsigned char dat[2];
- unsigned char remaining_time=30;
- /************延时***************/
- void delay(int i)
- {
- int x,y;
- for(x=i;x>0;x--)
- for(y=125;y>0;y--);
- }
- void main(void)
- {
- relay=1;
- TMOD = 0x01; //定时器0 方式一
- TH0 = 0x0FC; //10ms计时高8位
- TL0 = 0x18; //10ms计时低8位
- EA = 1; //开启总中断
- ET0 = 1; //开启定时器0中断
- TR0 = 1; //开启定时器0计数
- while(1)
- {
- if(!K1) //判断K1键 //开始计时
- {
- delay(10); //按键去抖
- if(!K1)
- {
- flag=~flag;
- if(flag){
- remaining_time=remaining_time/10*10;
- }else remaining_time=30;
- while(!K1); //等待按键弹起
- }
- }
-
- if(!K2) //判断K2键 +10
- {
- delay(10); //按键去抖
- if(!K2)
- {
- remaining_time=remaining_time/10*10+10;
- if(remaining_time>60) remaining_time=10;
- while(!K2); //等待按键弹起
- }
- }
-
- if(!K3) //判断K3键 -10
- {
- delay(10); //按键去抖
- if(!K3)
- {
- remaining_time=remaining_time/10*10-10;
- if(remaining_time<10) remaining_time=60;
- while(!K3); //等待按键弹起
- }
- }
- }
- }
- void Timer0Interrupt(void) interrupt 1 //10ms中断
- {
- static unsigned int timer0_num=0;
- static unsigned char show_flag=0;
-
- TH0 = 0x0D8; //中断初值重装
- TL0 = 0x0F0;
-
- if(flag){
- flag=1;
- if(++timer0_num>=600){ //6000次中断为6000*10ms=1min
- timer0_num=0;
- if(--remaining_time==0){
- remaining_time=30;
- relay=0;
- flag=0;
- }
- }
- }
-
-
- dat[0]=L[remaining_time%100/10];
- dat[1]=L[remaining_time%10]| (flag?0x80:0);
- P3=0xff; //去重影
- P1=dat[show_flag]; //P1段选 根据实际电路修改
- wei1=show_flag;
- wei2=!show_flag;
- show_flag=!show_flag;
- }
复制代码
|