欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1799|回復: 5
收起左側

單片機定時計數器鬧鐘問題,keil編譯沒問題,proteus仿真出現問題,求助

[復制鏈接]
ID:530747 發表于 2019-5-16 18:26 | 顯示全部樓層 |閱讀模式
以下是代碼和思路
#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();
         }
}
360桌面截圖20190516182238.jpg
仿真圖。請大神們看看問題在哪里,十分感謝!!!
回復

使用道具 舉報

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重置鍵,時鐘置零。   
回復

使用道具 舉報

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,可我代碼里都是按一次加一或減一啊?但是我按鍵消抖做了的啊。這是怎么回事?請大神們看看,求問題所在和解決方案。
回復

使用道具 舉報

ID:93224 發表于 2019-5-17 23:35 | 顯示全部樓層
那你這是邏輯的問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表