为什么我这个单片机闹钟程序闹铃功能无法使用?
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include"lcdzf.h"
sbit pdd=P3^7; //调节时间
sbit LS138A=P3^4;
sbit LS138B=P3^5;
sbit LS138C=P3^6;
sbit bee=P2^0; //闹铃
unsigned char code monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //每月天数
unsigned char code tap1[]={"0123456789"};//数字字模
unsigned char code tap2[]={":- "};//基本符号字模
unsigned char code season[4][6]={{"Spring"},{"Summer"},{"Autumn"},{"Winter"}}; //季节字模
unsigned char code week[7][3]={{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; //星期几字模
unsigned int year; //年
unsigned char num1,shi,fen,miao,day,month,shadow,wek,rea,cr; //日期与时间
unsigned char second2,minute2,hour2;//闹钟
unsigned int ham;
/*全部中断初始化*/
void InitTimer0(void)
{
TMOD = 0x11;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
PX1=1;
PX0=1;
PT1=1;
TH1 = 0x0FC;
TL1 = 0x18;
ET1 = 0;
TR1 = 0;
}
void lcd()//1602写数据函数
{
/*日期*/
write_com(0x80);
write_date(tap1[(year+1)/1000]);
write_date(tap1[(year+1)%1000/100]);
write_date(tap1[(year+1)%100/10]);
write_date(tap1[(year+1)%10]);
write_date(tap2[1]);
write_date(tap1[(month+1)/10]);
write_date(tap1[(month+1)%10]);
write_date(tap2[1]);
write_date(tap1[(day+1)/10]);
write_date(tap1[(day+1)%10]);
write_date(tap2[2]);
write_date(week[wek][0]);
write_date(week[wek][1]);
write_date(week[wek][2]);
/*时钟星期*/
write_com(0x80+0x40);
write_date(tap1[shi/10]);
write_date(tap1[shi%10]);
write_date(tap2[0]);
write_date(tap1[fen/10]);
write_date(tap1[fen%10]);
write_date(tap2[0]);
write_date(tap1[miao/10]);
write_date(tap1[miao%10]);
write_date(tap2[2]);
write_date(season[cr][0]);
write_date(season[cr][1]);
write_date(season[cr][2]);
write_date(season[cr][3]);
write_date(season[cr][4]);
write_date(season[cr][5]);
}
void main()
{
/*初始化定义*/
rea=0;
cr=3;
InitTimer0();
write_init();
year=2016;
month=0;
day=5;
shi=8;
fen=0;
miao=0;
ham=0;
minute2=0;
hour2=0;
second2=5;
/*死循环*/
while(1)
{
lcd();//显示函数
if(pdd==0) //日期调节
{
switch(rea)
{
case 0:miao=0;break;
case 1:fen++;break;
case 2:shi++;break;
case 3:wek++;break;
case 4:day++;break;
case 5:month++;break;
case 6:year++;break;
case 7:year--;break;
}
while(pdd==0);
}
}
}
/*控制调节按钮*/
void zhongduan() interrupt 0
{
EX0=0;
rea++;
if(rea==8)
{
rea=0;
}
switch(rea)
{
case 0:LS138A=0;LS138B=0;LS138C=0; break; //秒
case 1:LS138A=1;LS138B=0;LS138C=0; break; //分
case 2:LS138A=0;LS138B=1;LS138C=0; break; //时
case 3:LS138A=1;LS138B=1;LS138C=0; break; //星期
case 4:LS138A=0;LS138B=0;LS138C=1; break; //日
case 5:LS138A=1;LS138B=0;LS138C=1; break; //月
case 6:LS138A=0;LS138B=1;LS138C=1; break; //年+
case 7:LS138A=1;LS138B=1;LS138C=1; break; //年-
}
EX0=1;
}
/*闹钟按钮*/
void clock() interrupt 2
{
EX1=0;
hour2=shi;
minute2=fen;
second2=miao;
EX1=1;
}
/*定时器,每10ms产生一次中断*/
void Time0() interrupt 1
{
TH0 = 0x0D8;
TL0 = 0x0F0;//定时器置位
shadow++;
if(shadow==100)
{
shadow=0;
miao++;
}
if(miao==60) //分进位
{
miao=0;
fen++;
}
if(fen==60) //时进位
{
fen=0;
shi++;
}
if(shi==24) //日进位
{
shi=0;
wek++;
day++;
}
if(wek==7) //星期进位
{
wek=0;
}
if(day==monthdays[month]) //月进位
{
day=0;
month++;
}
switch(month) //季节
{
case 2: cr=0;break;
case 5: cr=1;break;
case 8: cr=2;break;
case 11: cr=3;break;
}
if(month==12)//年进位
{
month=0;
year++;
}
/*闹铃判断*/
if(shi=hour2)
{
if(fen=minute2)
{
if(miao=second2-1)
{
ET1=1;
TR1=1;
}
}
}
}
/*闹铃中断*/
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x0FC;
TL1 = 0x18;
ham++;
bee=~bee;
if(ham==5000)
ham=0;
bee=0;
TR1=0;
ET1=0;
//add your code here!
}
#include"lcdzf.h"
sbit pdd=P3^7; //调节时间
sbit LS138A=P3^4;
sbit LS138B=P3^5;
sbit LS138C=P3^6;
sbit bee=P2^0; //闹铃
unsigned char code monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //每月天数
unsigned char code tap1[]={"0123456789"};//数字字模
unsigned char code tap2[]={":- "};//基本符号字模
unsigned char code season[4][6]={{"Spring"},{"Summer"},{"Autumn"},{"Winter"}}; //季节字模
unsigned char code week[7][3]={{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}}; //星期几字模
unsigned int year; //年
unsigned char num1,shi,fen,miao,day,month,shadow,wek,rea,cr; //日期与时间
unsigned char second2,minute2,hour2;//闹钟
unsigned int ham;
/*全部中断初始化*/
void InitTimer0(void)
{
TMOD = 0x11;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
PX1=1;
PX0=1;
PT1=1;
TH1 = 0x0FC;
TL1 = 0x18;
ET1 = 0;
TR1 = 0;
}
void lcd()//1602写数据函数
{
/*日期*/
write_com(0x80);
write_date(tap1[(year+1)/1000]);
write_date(tap1[(year+1)%1000/100]);
write_date(tap1[(year+1)%100/10]);
write_date(tap1[(year+1)%10]);
write_date(tap2[1]);
write_date(tap1[(month+1)/10]);
write_date(tap1[(month+1)%10]);
write_date(tap2[1]);
write_date(tap1[(day+1)/10]);
write_date(tap1[(day+1)%10]);
write_date(tap2[2]);
write_date(week[wek][0]);
write_date(week[wek][1]);
write_date(week[wek][2]);
/*时钟星期*/
write_com(0x80+0x40);
write_date(tap1[shi/10]);
write_date(tap1[shi%10]);
write_date(tap2[0]);
write_date(tap1[fen/10]);
write_date(tap1[fen%10]);
write_date(tap2[0]);
write_date(tap1[miao/10]);
write_date(tap1[miao%10]);
write_date(tap2[2]);
write_date(season[cr][0]);
write_date(season[cr][1]);
write_date(season[cr][2]);
write_date(season[cr][3]);
write_date(season[cr][4]);
write_date(season[cr][5]);
}
void main()
{
/*初始化定义*/
rea=0;
cr=3;
InitTimer0();
write_init();
year=2016;
month=0;
day=5;
shi=8;
fen=0;
miao=0;
ham=0;
minute2=0;
hour2=0;
second2=5;
/*死循环*/
while(1)
{
lcd();//显示函数
if(pdd==0) //日期调节
{
switch(rea)
{
case 0:miao=0;break;
case 1:fen++;break;
case 2:shi++;break;
case 3:wek++;break;
case 4:day++;break;
case 5:month++;break;
case 6:year++;break;
case 7:year--;break;
}
while(pdd==0);
}
}
}
/*控制调节按钮*/
void zhongduan() interrupt 0
{
EX0=0;
rea++;
if(rea==8)
{
rea=0;
}
switch(rea)
{
case 0:LS138A=0;LS138B=0;LS138C=0; break; //秒
case 1:LS138A=1;LS138B=0;LS138C=0; break; //分
case 2:LS138A=0;LS138B=1;LS138C=0; break; //时
case 3:LS138A=1;LS138B=1;LS138C=0; break; //星期
case 4:LS138A=0;LS138B=0;LS138C=1; break; //日
case 5:LS138A=1;LS138B=0;LS138C=1; break; //月
case 6:LS138A=0;LS138B=1;LS138C=1; break; //年+
case 7:LS138A=1;LS138B=1;LS138C=1; break; //年-
}
EX0=1;
}
/*闹钟按钮*/
void clock() interrupt 2
{
EX1=0;
hour2=shi;
minute2=fen;
second2=miao;
EX1=1;
}
/*定时器,每10ms产生一次中断*/
void Time0() interrupt 1
{
TH0 = 0x0D8;
TL0 = 0x0F0;//定时器置位
shadow++;
if(shadow==100)
{
shadow=0;
miao++;
}
if(miao==60) //分进位
{
miao=0;
fen++;
}
if(fen==60) //时进位
{
fen=0;
shi++;
}
if(shi==24) //日进位
{
shi=0;
wek++;
day++;
}
if(wek==7) //星期进位
{
wek=0;
}
if(day==monthdays[month]) //月进位
{
day=0;
month++;
}
switch(month) //季节
{
case 2: cr=0;break;
case 5: cr=1;break;
case 8: cr=2;break;
case 11: cr=3;break;
}
if(month==12)//年进位
{
month=0;
year++;
}
/*闹铃判断*/
if(shi=hour2)
{
if(fen=minute2)
{
if(miao=second2-1)
{
ET1=1;
TR1=1;
}
}
}
}
/*闹铃中断*/
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x0FC;
TL1 = 0x18;
ham++;
bee=~bee;
if(ham==5000)
ham=0;
bee=0;
TR1=0;
ET1=0;
//add your code here!
}
第一个include是<reg52.h>,复制没复制到
已经成功了
