标题: 单片机定时计数器闹钟问题,keil编译没问题,proteus仿真出现问题,求助 [打印本页]
作者: 阿斯蒂芬呀 时间: 2019-5-16 18:26
标题: 单片机定时计数器闹钟问题,keil编译没问题,proteus仿真出现问题,求助
以下是代码和思路
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan = P2^6;
sbit wei = P2^7;
sbit buzzer = P2^3;
sbit buzzer_key = P3^3;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
uchar code SMGduan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};
uchar code SMGwei[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharmiao,fen,shi,amiao,afen,ashi,flag,s_flag;
uint count = 0;
uint date[8];
void display();
void key();
void beep();
void delay();
void delay(int z)
{
intx,y;
for(x= z;x>0;x--)
for(y=114;y>0;y--);
}
//显示函数
void display()
{
uinti;
wei= 1;
P0= 0xff;
wei= 0;
duan= 1;
P0=date[ i];
duan= 0;
wei= 1; P0=SMGwei[ i];
wei= 0;
for(i=0;i<8;i++){
if(i==8)
i=0;
delay(1);
}
//根据flag值来显示:
flag=0,正常时钟。
Flag=1,时钟秒调整。
Flag=2,时钟分调整。
Flag=3,时钟时调整。
Flag=4,闹钟秒调整。
Flag=5,闹钟分调整。
Flag=6,闹钟时调整。
S_flag时闪烁标志位,没1s闪烁一次。
switch(flag){
case0:
{
date[0]= SMGduan[shi/10];
date[1]= SMGduan[shi%10];
date[2]= SMGduan[10];
date[3]= SMGduan[fen/10];
date[4]= SMGduan[fen%10];
date[5]= SMGduan[10];
date[6]= SMGduan[miao/10];
date[7]= SMGduan[miao%10];
}
break;
case1:
{
date[0]= SMGduan[shi/10];
date[1] = SMGduan[shi%10];
date[2]= SMGduan[10];
date[3]= SMGduan[fen/10];
date[4]= SMGduan[fen%10];
date[5]= SMGduan[10];
if(s_flag== 1){
date[6]= SMGduan[miao/10];
date[7]= SMGduan[miao%10];
}
else{
date[6]= SMGduan[10];
date[7]= SMGduan[10];
}
}
break;
case2:
{
date[0]= SMGduan[shi/10];
date[1]= SMGduan[shi%10];
date[2]= SMGduan[10];
if(s_flag==1){
date[3]= SMGduan[fen/10];
date[4]= SMGduan[fen%10];
}
else{
date[3]= SMGduan[10];
date[4]= SMGduan[10];
}
date[5]= SMGduan[10];
date[6]= SMGduan[miao/10];
date[7]= SMGduan[miao%10];
}
break;
case3:
{
if(s_flag==1){
date[0]= SMGduan[shi/10];
date[1]= SMGduan[shi%10];
}
else{
date[0]= SMGduan[10];
date[1]= SMGduan[10];
}
date[2]= SMGduan[10];
date[3]= SMGduan[fen/10];
date[4]= SMGduan[fen%10];
date[5]= SMGduan[10];
date[6]= SMGduan[miao/10];
date[7]= SMGduan[miao%10];
}
break;
case4:
{
date[0]= SMGduan[ashi/10];
date[1]= SMGduan[ashi%10];
date[2]= SMGduan[10];
date[3]= SMGduan[afen/10];
date[4]= SMGduan[afen%10];
date[5]= SMGduan[10];
if(s_flag==1){
date[6]= SMGduan[amiao/10];
date[7]= SMGduan[amiao%10];
}
else{
date[6]= SMGduan[10];
date[7]= SMGduan[10];
}
}
break;
case5:
{
date[0]= SMGduan[ashi/10];
date[1]= SMGduan[ashi%10];
date[2]= SMGduan[10];
if(s_flag==1){
date[3]= SMGduan[afen/10];
date[4]= SMGduan[afen%10];
}
else{
date[3]= SMGduan[10];
date[4]= SMGduan[10];
}
date[5]= SMGduan[10];
date[6]= SMGduan[amiao/10];
date[7]= SMGduan[amiao%10];
}
break;
case6:
{
if(s_flag==1){
date[0]= SMGduan[ashi/10];
date[1]= SMGduan[ashi%10];
}
else{
date[0]= SMGduan[10];
date[1]= SMGduan[10];
}
date[2]= SMGduan[10];
date[3]= SMGduan[afen/10];
date[4]= SMGduan[afen%10];
date[5]= SMGduan[10];
date[6]= SMGduan[amiao/10];
date[7]= SMGduan[amiao%10];
}
break;
}
}
//蜂鸣器
void beep()
{
buzzer= 0;
if(shi== ashi && fen == afen && amiao-miao <= 2)//时钟闹钟时分相同,向两秒后关闭。
buzzer= 1;
else
buzzer= 0;
}
void jinzhi()
{
if(count== 20)
{
miao++;
count= 0;
if(miao==60){
fen++;
miao=0;
}
if(fen==60){
shi++;
fen=0;
}
while(shi==24){
shi= 0;
fen= 0;
miao= 0;
count= 0;
}
}
}
//中断
void timer() interrupt 1
{
uinti;
TH0= (65536-46085)/256;
TL0= (65536-46085)%256;
beep();
count++;
jinzhi();
if(count%20==0)
{
s_flag=!s_flag;
}
}
//按键:
key1选择模式,按一次flag加一;
flag=0:普通时钟;
flag=1:
按key2:时钟秒加一;
按key3:时减一;
Flag=2:分调整;
Flag=3:时调整;
Flag=4:闹钟秒调整;
依次往后;
Key4重置按键。
void key()
{
P1= 0xff;
if(key1== 0){
delay(10);
if(key1== 0){
flag++;
if(flag==7){
flag=0;
}
}
if(!key1);
}
if(flag!= 0){
switch(flag){
case1:
{
if(key2== 0){
delay(10);
if(key2== 0){
if(miao < 60)
miao++;
else
miao= 0;
}
if(!key2);
}
if(key3== 0){
delay(10);
if(key3== 0){
if(miao> 0)
miao--;
else
miao= 59;
}
if(!key3);
}
}
break;
case2:
{
if(key2== 0){
delay(10);
if(key2== 0){
if(fen< 60)
fen++;
else
fen= 0;
}
if(!key2);
}
if(key3== 0){
delay(10);
if(key3== 0){
if(fen> 0)
fen--;
else
fen= 59;
}
if(!key3);
}
}
break;
case3:
{
if(key2== 0){
delay(10);
if(key2== 0){
if(shi< 24)
shi++;
else
shi= 0;
}
if(!key2);
}
if(key3== 0){
delay(10);
if(key3== 0){
if(shi> 0)
shi--;
else
shi= 23;
}
if(!key3);
}
}
break;
case4:
{
if(key2== 0){
delay(10);
if(key2== 0){
if(amiao< 60)
amiao++;
else
amiao= 0;
}
if(!key2);
}
if(key3== 0){
delay(10);
if(key3== 0){
if(amiao> 0)
amiao--;
else
amiao= 59;
}
if(!key3);
}
}
break;
case5:
{
if(key2== 0){
delay(10);
if(key2== 0){
if(afen< 60)
afen++;
else
afen= 0;
}
if(!key2);
}
if(key3== 0){
delay(10);
if(key3== 0){
if(afen> 0)
afen--;
else
afen= 59;
}
if(!key3);
}
}
break;
case6:
{
if(key2== 0){
delay(10);
if(key2== 0){
if(ashi< 24)
ashi++;
else
ashi= 0;
}
if(!key2);
}
if(key3== 0){
delay(10);
if(key3== 0){
if(ashi> 0)
ashi--;
else
ashi= 23;
}
if(!key3);
}
}
break;
}
}
if(key4== 0){
delay(10);
if(key4==0){
shi= 0;
fen= 0;
miao= 0;
flag= 0;
}
if(!key4);
}
}
void main()
{
shi= 0;
fen= 0;
miao= 0;
ashi= 0;
afen= 0;
amiao= 0;
flag= 0;
s_flag= 0;
buzzer= 0;
//初值全部置零。
TMOD= 0X01;
TH0= (65536-46082)/256;
TL0= (65536-46082)%256;
ET0=1;
EA=1;
TR0= 1;
while(1)
{
display();
key();
}
}
仿真图。请大神们看看问题在哪里,十分感谢!!!
作者: lfc315 时间: 2019-5-17 14:37
在哪里定义数码管如何显示出0 1 2 3这些?
作者: 阿斯蒂芬呀 时间: 2019-5-17 15:08
显示问题我解决了。把display里
for(i=0;i<8;i++){
if(i==8)
i=0;
delay(1);
}
作者: 阿斯蒂芬呀 时间: 2019-5-17 15:25
发帖者:先前没说很抱歉。
按键是key1为模式按键按一下flag加一,key2加一键 key3减一键 :flag=0 时钟。flag=1 时钟调秒。flag=2
时钟调分,flag=3 时钟调时 flag=4 闹钟调秒 flag=5 闹钟调分 flag=6 闹钟调时
key4重置键,时钟置零。
作者: 阿斯蒂芬呀 时间: 2019-5-17 15:25
显示问题我解决了。把display里
for(i=0;i<8;i++){
if(i==8)
i=0;
delay(1);
}
改为
i++;
if(i==8)
i=0;
就可以解决。
但是又发现按键存在问题。按一下会跳多次,好像消抖没有作用一样。加一减一按键按一次直接加19,可我代码里都是按一次加一或减一啊?但是我按键消抖做了的啊。这是怎么回事?请大神们看看,求问题所在和解决方案。
作者: lele5211314 时间: 2019-5-17 23:35
那你这是逻辑的问题
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |