可调延时关断时间
单片机源程序如下:
- /*****************************************************************************************************************************
- 1.开机,外接触摸开关K1为高电平,定时器正常倒计时,继电器吸合接通LED点亮,如中途无操作,定时40分钟后断开继电器, LED熄灭。
- 2.如果开机正常倒计时过程中,用户不需要LED点亮,则按下触摸开关K1,K1为低电平,定时器停止工作并恢复初始定时状态,继电器断开
- 等待下次K1出现高电平时,再正常倒计时工作。
- *******************************************************************************************************************************/
- #include<reg52.h>
- unsigned int time; //中断次数变量
- unsigned char second10, second1,minute10,minute1; //定义十分、个分、十秒、个秒
- unsigned char min=40,sec=59; //设置倒计时时间
- sbit jdq=P1^4; //继电器为P1.4口
- sbit fmq=P1^3; //蜂鸣器为P1.3口
- sbit K0=P3^2; //定义外中断INT0为P3.2口
- sbit min10=P1^0;
- sbit min1=P1^1;
-
- unsigned char code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管0至9段码
- //unsigned char code wiema[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //8位共阳数码管 0x7f为最右侧的数码管
- /********************************************
- 延时子程序0.25MS
- ******************************************/
- void delay(unsigned int i)
- {
- unsigned char j;
- while(i--)
- {
- for(j=25;j>0;j--);
- }
- }
- /***********************************************
- 数码管显示子程序
- **********************************************/
- void display(minute10,minute1,second10, second1)
- {
- min10=1;
- min1=1;
- P0=duanma[minute10];
- min10=0;
- delay(6);
- min10=1;
- min1=1;
- P0=duanma[minute1];
- min1=0;
- delay(6);
- }
- /****************************************************
- 蜂鸣器发声函数,每1次大约响1秒
- ****************************************************/
- void beep(unsigned char a) //
- {
- unsigned int b;
- while(a--)
- {
- for(b=0;b<1000;b++)
- {
- fmq=0;
- delay(1);
- fmq=1;
- delay(1);
- }
- }
- }
- /**********************************************/
- main()
- {
- TMOD=0x01; //T0工作模式是方式1
- TH0=0x49; //定义初始值为50ms 此初值用11.0592MHZ晶振,实测40分钟误差3秒
- TL0=0x44;
- EA=1; //开总中断
- ET0=1; //允许定时器T0中断
- TR0=1; //开启T0计时
- EX0=1;
- IT0=1;
- delay(800);
- while(1)
- {
- if(K0==1)
- {
- TR0=1;
- jdq=0;
- if(K0==1&&min==0)
- {TR0=0;min=0;sec=0;jdq=1;
- }
- }
- display(min/10,min%10,sec/10,sec%10);
- }
- }
- /****************************************************/
- void int0() interrupt 0 //外中断0
- {
- if(K0==0)
- {
- delay(500);
- if(K0==0)
- {
- TR0=0;
- jdq=1;
- beep(1);
- min=40;sec=59;
- }
- }
- }
- /*********************************************/
- void timer0() interrupt 1 //T0中断
- {
-
- TH0=0x49;
- TL0=0x44;
- time++;
- if(time==20) //50ms*20=1秒
- {
- time=0;
- sec--;
- if(sec==0)
- {
- sec=59;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
yskz.rar
(1.36 KB, 下载次数: 18)
|