问题遇到的现象和发生背景
问题遇到的现象和发生背景
pretous做定时闹钟,keil的C语言程序下载到pretous仿真图中可以运行,但是运行结果不太对,麻烦哪位大神帮忙调一下。
“强调以下,写这么多文字主要是想描述清楚问题,12月4号15点截止,觉得麻烦或者没时间的可以直接划走,谢谢,”
以下功能基本都能实现,遇到的问题是:
1,计时的时候跳转太快,感觉像分和秒的计时,但是我要实现的是时和分的计时;
2,按下按钮后有时候数字会跳好几个;
3,复位处按钮无法确定电平。
pretous仿真:https://wwqv.lanzout.com/i3B9u0hp9nqb
1、原理及工作过程说明
(1)定时闹钟的基本功能如下:
(a)使用LCD液晶显示器来显示现在的时间。
(b)程序执行之后显示“Time;00:00m并且LED 闪烁,表示开始已经计时。
(c)由LED 闪动来做秒计数表示。
(2)按键功能如下:
按键 K1 设置现在的时间和时调整:按键K2 显示闹钟设置的时间和分调整:按键K3设置闹铃的时间和设置完成:按键K4闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为 0FF 发出“哗”的一声和闹铃时间到时,发出一阵声响,按下本键可以停止声响。
(3)调整计时器时间如下:
按下K1键,然后按K1调整小时,K2调整分钟,按下K3 表示时间设置完成。
(4)调整闹钟时间设置如下:
再次按下K3开始闹中设置,LCD下一行显示“Alarm:00:00”按下K1设置小时,按一下K2 设置分钟,再次按下K3设置完成,并且设置时间消失,当再次按一下K2时“Alarm:00:00再次显示并马上消失。按一下K4关闭闹钟,再次按下打开闹钟。
用代码块功能插入代码,请勿粘贴截图
C语言代码如下:调试的过程中麻烦对每段程序注释一下,
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code shuzi[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};
uchar kongbai=0x20;
sbit rs=P2^5;
sbit rw=P2^6;
sbit en=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit led_miao=P1^7;
sbit buzz=P2^3;
sbit lamp=P2^4;
uchar shi1=0x85,shi2=0x86;
uchar fen1=0x88,fen2=0x89;
uchar ns1=0xcb,ns2=0xcc;
uchar nf1=0xce,nf2=0xcf;
uchar aaak1=1,aaak2=1,aaak3=1,aaak4=1, clockon, ringoff;
uchar b,c,d,e,ch,hou=10;
uchar bn,cn,dn,chn,houn=10;
uchar tt0, tt1, tt2, tt3, tt4, change, ho=10;
int tt5, a, an;
uchar pt;
void time0();
//-----时钟说明-----//
// ab:cd //
//-----闹钟说明-----//
// an bn:cn dn //
//------------------//
void delay (uint z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110; y>0;y--);
}
void wc(uchar com)
{
rs=0;
P0=com;
delay (5) ;
en=1;
delay(5);
en=0;
}
void wd(uchar date)
{
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init()
{
en=0;
rs=0;
rw=0;//写数据或指令时,的口必须为低电平
wc(0x38);
wc(0x0c);
wc(0x06);//写一个字符后地址指针加
wc(0x01);
}
void showtime(uchar fen_1,uchar fen_2,uchar f1,uchar f2)
{
wc(fen_1);delay(1);
wd(shuzi[f1]);delay(1);
wc(fen_2);delay(1);
wd(shuzi[f2]);delay(1);
}
void showmao(uchar kkkkk)
{
if(kkkkk==0)
{wc(0x87);delay(1);wd(0x3a);delay(1);}
else if(kkkkk==1)
{wc(0xcd);delay(1);wd(0x3a);delay(1);}
else
{wc(0xcd);delay(1);wd(kongbai);delay(1);}
}
void key()
{
if(k1==0)//1 start
{
delay(100);
if(k1==0)
{
wc(0x80+0x40);delay(1);
wd(0x59);delay(1);
delay(100);
while(1)
{
if(k1==0) //1-1 start
{
delay(100);
if(k1==0)
{
b++;
if(b>=hou)
{
ch++;
if(ch>=2)
hou=4;
else
hou=10;
if(a>=2&&b>=hou)
{
a=(-1);
b=0;
ch=0;
hou=10;
}
a++;
b=0;
}
showtime(shi1,shi2,a,b);
}
}//1-1 end
if(k2==0)//1-2 start
{
delay (100);
if(k2==0)
{
d++;
if(d>=10)
{
d=0;
c++;
if(c>=6)
c=0;
}
showtime (fen1, fen2,c, d);
}
}//1-2 end
if(k3==0)//1-3 start
{
wc (0x80+0x40);delay(1);
wd(kongbai);delay(1) ;
tt5=a;tt4=b;tt3=c;tt2=d;
EA=1;ET0=1;TR0=1;
break;
}//1-3 end
if(k4==0)//1-4 start
{
//待定
}//1-4 end
}
}
}//1 end
if(k2==0)//2 start
{
delay (100) ;
if(k2==0)
{
if(aaak1==1)
{
aaak1++;
wc(0x80+0x41);delay(1);wd(0x59);delay(1);
showtime (ns1,ns2,an,bn) ;
showmao(1) ;
showtime (nf1,nf2,cn,dn);
}
else
{
wc(0x80+0x41);delay(1);wd(kongbai);delay(1);
showtime(ns1,ns2,10,10);
showtime(nf1,nf2,10,10);
showmao(2) ;
aaak1=1;
}
}
}//2 end
if(k3==0)//3 start
{
delay (100);
if(k3==0)
{
showtime (ns1,ns2,an,bn) ;
showmao(1) ;
showtime(nf1,nf2,cn,dn);
wc(0x80+0x42);delay(1);wd(0x59);delay(1);
delay (100) ;
while(1)
{
if(k1==0)//3-1 start
{
delay(100);
if(k1==0)
{
bn++;
if (bn>=houn)
{
chn++;
if(chn>=2)
houn=4;
else
houn=10;
if(an>=2&&bn>=houn)
{
an=(-1);
bn=0;
chn=0;
houn=10;
}
an++;
bn=0;
}
showtime(ns1, ns2, an, bn);
}
}//3-1 end
if(k2==0)//3-2 start
{
delay (100);
if(k2==0)
{
dn++;
if(dn>=10)
{
dn=0;
cn++;
if(cn>6)
cn=0;
}
showtime(nf1, nf2, cn, dn);
}
}//3-2 end
if(k3==0)//3-3 start
{
wc(0x80+0x42);delay(1);wd(kongbai);delay(1);
showtime(ns1, ns2, 10, 10);
showtime(nf1, nf2, 10, 10);
showmao(2) ;
break;
}//3-3 end
if(k4==0)//3-4start
{
delay(100);
if(k4==0)
{
if(aaak3==1)
{
aaak3++;ringoff=1;
wc(0x80+0x43);delay(1);wd(0x52);delay(1);
}
else
{
aaak3=1;ringoff=0;
wc(0x80+0x43);delay(1);wd(kongbai) ;delay(1);
}
}
}//3-4 end
}
}
}//3 end
if(k4==0)//4 start
{
delay (100) ;
if(k4==0)
{
if(aaak4==1)
{
aaak4++;
lamp=1;
clockon=1;
wc(0x80+0x4a);delay(1);wd(0xef);delay(1);
buzz=0;delay(50);buzz=1;delay(50);
buzz=0;delay(50);buzz=1;delay(50) ;
buzz=0;delay(50);buzz=1;
}
else
{
aaak4=1;
lamp=0;
clockon=0;
wc(0x80+0x4a);delay(1);wd(kongbai);delay(1);
buzz=0;delay(50);buzz=1;
}
}
}//4 end
}
void main()
{
TMOD = 0x01;
init();
showtime(shi1,shi2,0,0);
showtime(fen1,fen2,0,0);
showmao(0);
showtime(ns1,ns2,10,10);
showtime(nf1,nf2,10,10);
showmao(2);
time0();
TR0 = 1;
ET0 =1;
EA = 1;
lamp=0;
while(1)
{
key();
}
}
void time0()
{
TH0=(65536-50000)/256; //50MS
TL0=(65536-50000)%256;
}
void time1()
{
TH0=(65536-50000)/256; //50MS
TL0=(65536-50000)%256;
}
void t0() interrupt 1
{
time1();
tt0++;
if(k1==0)
{
delay(5);//硬件实现时,延时-10
if(k1==0)
{
a=tt5;b=tt4;c=tt3;d=tt2;
EA=0;ET0=0;TR0=0;
}
}
if(k2==0)
{
delay (5) ;//硬件实施时,延时-10
if(k2==0)
{
if (aaak1==1)
{
aaak1++;
wc(0x80+0x41);delay(1);wd(0x59);delay(1);
showtime(ns1,ns2,an,bn) ;
showmao(1);
showtime(nf1,nf2,cn,dn) ;
}
else
{
wc(0x80+0x41);delay(1);wd(kongbai) ;delay(1);
showtime(ns1,ns2,10,10);
showtime(nf1,nf2,10,10);
showmao(2) ;
aaak1=1;
}
}
}
if(k4==0)
{
delay(5) ;
if(k4==0)
{
if(aaak4==1)
{
aaak4++;
lamp=1;
clockon=1;
wc(0x80+0x4a);delay(1);wd(0xef);delay(1);
buzz=0;delay(50);buzz=1;delay(50);
buzz=0;delay(50);buzz=1;delay(50);
buzz=0;delay(50);buzz=1;
}
else
{
aaak4=1;
lamp=0;
clockon=0;
wc(0x80+0x4a);delay(1);wd(kongbai);delay(1);
buzz=0;delay(50);buzz=1;
}
}
}
if(tt0>=1)//20
{
tt0=0;
led_miao=~led_miao;
tt1++;
if(tt1>=1)//判断是否 够秒
{
tt2++;
if(tt2>=10) //判断分钟的个位是否满
{
tt2=0;
tt3++;
if(tt3>=6)//判断分钟的十位是否满
{
tt3=0;
tt4++;
if(tt4>=hou)//判断小时的个位是否满或
{
ch++;
if(ch>=2)//当到了时以上时,判断条件变为
{
hou=4;
}
else
{
hou=10;
}
if(tt5>=2&&tt4>=hou) //当满小时的时候,全部清零,从头算起
{
tt5=(-1);
tt4=0;
ch=0;
hou=10;
}
tt5++;
tt4=0;
showtime(shi1, shi2, tt5, tt4) ;//小时十位加一
}
showtime(shi1, shi2, tt5, tt4);//小时个位加一
}
showtime(fen1, fen2, tt3, tt2);//分钟十位加一
}
showtime(fen1, fen2, tt3, tt2) ;//分钟个位加一-
tt1=0;
}
}
if(clockon==1&&tt5==an&&tt4==bn&&tt3==cn&&tt2==dn&&pt<=60)//ring for 3s
{
buzz=0;e=1; lamp=0;pt++;
}
if((k4==0&&e==1)|pt>=60)//if ring more than 3s,it will stop
{
buzz=1;e=0;clockon=0;wc(0x80+0x4a);delay(1);wd(kongbai);delay(1);pt=0;
}
}