我在做一个用按键来控制数码管倒数,当小时、分钟、秒都为零时,报警响起,大佬们帮忙看一下哪里错了吧,,写到后面我自己都乱了。。
#include<reg52.h>
sfr P0M0=0x93;
sfr P0M1=0x94;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P2M0=0x95;
sfr P2M1=0x96;
sfr P3M0=0xb1;
sfr P3M1=0xb2;
#define fosc 11059200L
#define TO_50ms(65536-50000*(fosx/12000000L)) //50ms定时参数
sbit en1=P2^6; //个位 秒
sbit en2=P2^7; //十位 秒
sbit en3=P2^5; //个位 分
sbit en4=P2^4; //十位 分
sbit en5=P2^3; //个位 时
sbit en6=P2^2; //十位 时
sbit clear=P1^0; //清零
sbit char display_num,count_in_TO; //计数值、进入定时器的次数
sbit alert=P3^2; //报警输入
sbit speaker=P0^2; //报警输出
sbit led=P0^0; //工作指示
/*
共阴级数码管0~9的字形码
*/
coust unsigned char seg7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int init_port()
{
//配置P0模式为开漏输出
P0M1=0xff;
P0M0=0xff;
P1M1 |=0x01; //P1.0输入
P1M0 |=0x00;
P2M1 |=0xc0;
P2M0 |=0xc0;
clear=1;
}
bit run_flag; //工作标志
int ms_delay(unsigned int t)
{
unsigned int i;
for(t;t>0;t--) //外层循环t次
for(i=110;i>0;i--); //内层循环110次
}
//INTO中断服务程序
int INTO_interrupt() interrupt 0
{
EXO=0; //关INTO中断
run_flag=0;
}
int init_int()
{
ITO=1; //设置INTO为下降沿触发
EXO=1; //允许INTO中断
}
int INTO_interrupt() interrupt 1
{
running=~running; //切换暂停/计时
if(running)
{ //切换为运行
TRO=1;
}
else
{ //切换为暂停
TRO=0;
}
}
int TimerO_interrupt() interrupt 2
{
THO=TO_50ms >>8; //重新初值
TLO=TO_50ms;
if((++ count_in_TO)==20) //count_in_TO自加到20.计时1s
{
count_in_TO=0;
if((++display_num)==60)
{ //display_num自加1后判断是否等于60
dispaly_num=0;
}
}
}
int init_timer()
{
TMOD=0x09; //定时器0模式1,16bit
THO=TO_50ms >>8; //THO=TO_50ms/256
TLO=TO_50ms; //TLO=TO_50ms%256
ETO=1;
}
int display1(unsigned char c2,unsigned char c1)
{
P0=seg7[c2]; //送入秒十位的段码
en2=0; //显示DS2
ms_delay(10);
en1=1; //关闭DS2
P0=seg7[c1]; //送入秒个位的段码
en1=0; //显示DS1
ms_delay(100);
en1=1; //显示DS1
}
int display2(unsigned char c3,unsigned char c4)
{
P0=seg7[c3]; //送入分个位的段码
en3=0; //显示DS2
ms_delay(10);
en1=1;
P0=seg7[c4]; //送入分十位的段码
en4=0; //显示DS2
ms_delay(10);
en1=1;
}
int display3(unsigned char c5,unsigned char c6)
{
P0=seg7[c5]; //送入时个位的段码
en5=0; //显示DS2
ms_delay(10);
en1=1;
P0=seg7[c6]; //送入时十位的段码
e6=0; //显示DS2
ms_delay(10);
en1=1;
}
int while(1) //报警程序
{
if(display3_num=0)
{ //正常运行
if(display2_num=0)
{
if(display1_num=0)
speaker=1;
}
}
}
int while(2)
{
TR1=0; //若按下K1键,则定时器T1关闭,时钟暂停
if(K2==0) //若按下K2键
{
Delay_ms(10); //延时去抖
if(K2==0)
{
while(!K2); //等待K2键释放
hour++; //小时调整
if(hour==24)
{
hour = 0;
}
}
}
if(K3==0) //若按下K3键
{
Delay_ms(10);
if(K3==0)
{
while(!K3); //等待K3键释放
min++; //分钟调整
if(min==60)
{
min = 0;
}
}
}
if(K4==0) //若按下K4键
{
Delay_ms(10);
if(K4==0)
{
while(!K4); //等待K4键释放
sec++;
if(sec==60)
{
sec=0;
}
TR1=1; //调整完毕后,时钟恢复走时
K1_FLAG=0; //将K1键按下标志位清0
}
}
}
int while(3) //按键
{
shi=display1_num/10;
ge=display1_num%10;
display1(shi,ge);
shi=ge=0;
shi=display2_num/10;
ge=display2_num%10;
display2(shi,ge);
shi=ge=0;
shi=display3_num/10;
ge=display3_num%10;
display3(shi,ge);
//检测清零按键
if(clear==0)
{
ms_delay(10)
if(clear==0)
{ //确认按下清零按钮
if(!running) //如果处于暂停状态
display=0;
}
}
}
int while(4)
{
int num;
num=display3*3600+display*60+display;
if(num==0)
{
speaker=1;
}
else
{
display3_num=num/3600;
display2_num=(num%3600)/60;
display1_num=(num%3600)%60;
}
}
main()
{
//配置端口模式
P0M1=0x03; //P0.1、P0.0输出
P0M0=0x03;
P3M1=0x04; //P3.2输入
P3M0=0x00;
unsigned char shi,ge; //定义十位、个位要输出的数据
init_port();
init_int();
init_timer();
display1_num=0;
display2_num=0;
display3_num=0;
count_in_TO=0;
running=0;
//把两个数码管都关闭
en2=1;
en1=1;
ITO=0; //设置INTO为低电平触发
EXO=1; //允许INTO中断
EA=1; //开总中断
while(2) //按键
while(4) //倒数
while(3) //暂停
alert=1;
speaker=1;
while(1)
}
|