找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1262|回复: 5
打印 上一主题 下一主题
收起左侧

单片机定时计数器闹钟问题,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();
         }
}

仿真图。请大神们看看问题在哪里,十分感谢!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:10947 发表于 2019-5-17 14:37 | 只看该作者
在哪里定义数码管如何显示出0 1 2 3这些?
回复

使用道具 举报

板凳
ID:530747 发表于 2019-5-17 15:08 | 只看该作者
显示问题我解决了。把display里         
for(i=0;i<8;i++){                  
     if(i==8)
      i=0;
                   delay(1);
         }
回复

使用道具 举报

地板
ID:530747 发表于 2019-5-17 15:25 | 只看该作者
发帖者:先前没说很抱歉。
按键是key1为模式按键按一下flag加一,key2加一键  key3减一键   :flag=0  时钟。flag=1  时钟调秒。flag=2
时钟调分,flag=3  时钟调时   flag=4 闹钟调秒   flag=5 闹钟调分    flag=6 闹钟调时
key4重置键,时钟置零。   
回复

使用道具 举报

5#
ID:530747 发表于 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,可我代码里都是按一次加一或减一啊?但是我按键消抖做了的啊。这是怎么回事?请大神们看看,求问题所在和解决方案。
回复

使用道具 举报

6#
ID:93224 发表于 2019-5-17 23:35 | 只看该作者
那你这是逻辑的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表