单片机电子闹钟程序亲自编写-可用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机电子闹钟程序(亲自编写-可用)
————————————————————————————————作者:————————————————————————————————日期:
学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52
程序:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定义显示段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar code
bbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};
uchar clock1[]={12,30,0};
uchar weikong[6];
uchar bbduration=4;
uchar lingtime=9;
//学校打铃时间组
uchar shangwu1[]={8,30};
uchar shangwu2[]={10,0};
uchar shangwu3[]={10,20};
uchar shangwu4[]={11,50};
uchar xiawu1[]={13,30};
uchar xiawu2[]={15,00};
uchar xiawu3[]={15,15};
uchar xiawu4[]={16,45};
//按键定义
sbit mode=P1^7;
sbit sec_clr=P1^0;
sbit min_set_add=P1^3;
sbit min_set_sub=P1^4;
sbit hour_set_add=P1^1;
sbit hour_set_sub=P1^2;
sbit bb_set_add=P1^5;
sbit bb_set_sub=P1^6;
sbit speaker=P2^6;
//延时函数
void delay(unsigned int t)
{
while(t--);
//时钟进位函数
void clockjinwei()
{
clock[0]++;
if(clock[0]==20)
{
clock[1]++;
clock[0]=0;
if(clock[1]==60)
{
clock[2]++;
clock[1]=0;
if(clock[2]==60)
{
clock[3]++;
clock[2]=0;
if(clock[3]==24)
clock[3]=0;
}
}
}
}
//定时器0中断服务函数
void timer0(void) interrupt 1 using 1 {
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
clockjinwei();
}
//时钟分位显示函数
void fenwei()
{
weikong[0]=clock[3]/10;
weikong[1]=clock[3]%10;
weikong[2]=clock[2]/10;
weikong[3]=clock[2]%10;
weikong[4]=clock[1]/10;
weikong[5]=clock[1]%10;
}
//闹钟分位显示函数
void naofen()
{
weikong[0]=clock1[0]/10;
weikong[1]=clock1[0]%10;
weikong[2]=clock1[1]/10;
weikong[3]=clock1[1]%10;
weikong[4]=clock1[2]/10;
weikong[5]=clock1[2]%10; }
//闹钟定时显示函数
void naozhongdisplay()
{
uchar z,s;
uchar x=0x01;
naofen();
for(z=0;z<6;z++)
{
P2=0;
P0=table[weikong[z]];
P2=x;
x=_crol_(x,1);
for(s=0;s<255;s++);
}
}
//时钟显示函数
void display()
{
uchar i,j;
uchar x=0x01;
fenwei();
for(i=0;i<6;i++)
{
P2=0;
P0=table[weikong[i]];
P2=x;
x=_crol_(x,1);
for(j=0;j<255;j++);
}
}
//总显示函数
void zhongxian()
{
if(mode==1)
delay(100);
if(mode==1)
display();
if(mode==0)
delay(100);
if(mode==0)
naozhongdisplay();
}
//按键处理程序
void key_set()
{
zhongxian();
P1=0xff;
if(min_set_add==0)
{
delay(100);
if(min_set_add==0)
{
if(mode==1)
{
clock[2]++;
if(clock[2]==60)
{
clock[2]=0;
}
while(min_set_add==0)
zhongxian();
}
}
if(mode==0)
{
clock1[1]++;
if(clock1[1]==60)
{
clock1[1]=0;
}
while(min_set_add==0)
zhongxian();
}
}
//
if(min_set_sub==0)
{
delay(100);
if(min_set_sub==0)
{
if(mode==1)
{
clock[2]--;
if(clock[2]==0)
clock[2]=59;
}
while(min_set_sub==0)
zhongxian();
if(mode==0)
{
clock1[1]--;
if(clock1[1]==0)
clock1[1]=59;
}
while(min_set_sub==0)
zhongxian();
}
}
//
if(hour_set_add==0)
{
delay(100);
if(hour_set_add==0)
{
if(mode==1)
{
clock[3]++;
if(clock[3]==24)
{
clock[3]=0;
}
while(hour_set_add==0)
zhongxian();
}
if(mode==0)
{
clock1[0]++;
if(clock1[0]==24)
{
clock1[0]=0;
}
while(hour_set_add==0)
zhongxian();
}
}
}
//
if(hour_set_sub==0)
{
delay(100);
if(hour_set_sub==0)
{
if(mode==1)
{
clock[3]--;
if(clock[3]==0)
clock[3]=23;
}
while(hour_set_sub==0)
zhongxian();
if(mode==0)
{
clock1[0]--;
if(clock1[0]==0)
clock1[0]=23;
}
while(hour_set_sub==0)
zhongxian();
}
}
//
if(sec_clr==0)
{
delay(100);
if(sec_clr==0)
{
clock[1]=0;
}
while(sec_clr==0)
zhongxian();
}
}
//闹钟响铃函数
void bb()
{
if(clock[1]<=bbduration)
{
speaker=1;delay(100);speaker=0;
}
else speaker=0;
}
//打铃函数
void daling()
{
if(clock[1]<=lingtime)
{
speaker=1;delay(100);speaker=0;
}
else speaker=0;
}
//时间比较函数
void bijiao()
{
if(clock[3]==shangwu1[0])
{
if(clock[2]==shangwu1[1])
daling();
}
if(clock[3]==shangwu2[0])
{
if(clock[2]==shangwu2[1])
daling();
}
if(clock[3]==shangwu3[0])
{
if(clock[2]==shangwu3[1])
daling();
}
if(clock[3]==shangwu4[0])
{
if(clock[2]==shangwu4[1])
daling();
}
if(clock[3]==xiawu1[0])
{
if(clock[2]==xiawu1[1])
daling();
}
if(clock[3]==xiawu2[0])
{
if(clock[2]==xiawu2[1])
daling();
}
if(clock[3]==xiawu3[0])
{
if(clock[2]==xiawu3[1])
daling();
}
if(clock[3]==xiawu4[0])
{
if(clock[2]==xiawu4[1])
daling();
}
}
//闹钟比较
void naobijiao()
{
if(clock[3]==clock1[0])
{
if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();
}
}
//响铃时长显示函数
void bbtimeshow()
{
P3=bbtime[bbduration];
if(bbduration>15)
bbduration=0;
}
//响铃按键处理函数
void bbtime_set()
{
bbtimeshow();
if(bb_set_add==0)
{
delay(100);
if(bb_set_add==0)
bbduration++;
while(bb_set_add==0)
bbtimeshow();
}
if(bb_set_sub==0)
{
delay(100);
if(bb_set_sub==0)
bbduration--;
while(bb_set_sub==0)
bbtimeshow();
}
}
//主程序
void main()
{
EA=1;
ET0=1;
TR0=1;
while(1)
{
key_set();
bijiao();
bbtime_set();
naobijiao();
}
}
电路图:
分四部分显示:
如果在学习这个程序过程中有什么问题,可以发邮件到询问。