久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2415|回復: 4
打印 上一主題 下一主題
收起左側

求各位大神指正,四位一體共陽極數碼管數字鐘程序,仿真能運行,實物就只顯8個8,不動

[復制鏈接]
跳轉到指定樓層
樓主
//采用8位數碼管動態顯示程序
//使用AT89C51單片機,12MHz晶振,P0輸出字段碼,P2口輸出位選碼
//用共陽極LED數碼管,key0為調時分位選擇鍵,key1為加1鍵,key2為減1鍵,key3為確定鍵


#include  "reg51.h"
//包含頭文件
#define char unsigned char
//定義無符號字符型
char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//共陽極LED數碼管"0~9","-"的字段碼
char code scan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//位選擇碼
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//顯示緩沖區,時、分、秒初始為0,0x0b為"-"的編碼
char data timedata[3]={0x00,0x00,0x00};
//分別為秒、分和小時的值
char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;


sbit  key0=P1^0;
sbit  key1=P1^1;
sbit  key2=P1^2;
sbit  key3=P1^3;
//定義四個按鍵


//1ms延時函數


delay1ms(int t)
{
int i,j;
for (i=0;i<t;i++)
        {
for(j=0;j<120;j++);
}
}


//按鍵處理函數


keyscan()
{
EA=0;
//關總中斷
if (key0==0)         //判斷第一個按鍵是否按下
        {
                   delay1ms(10);
                //按鍵消抖
                while (key0==0);
                //再次判斷按鍵是否按下
                con++;
TR0=0;
ET0=0;
            //關定時/計數器,關T0中斷
                if (con>=3)  
                {
con=0;
TR0=1;
ET0=1;
}
          }
                if (con!=0)
                {
                        if (key1==0)
                        //如果第二個按鍵按下
                        {
                                delay1ms(10);
                                while (key1==0);
                                timedata[con]++;
                                //加一功能
                                if (con==2)
con1=24;
else con1=60;                        
if (timedata[con]>=con1)
                                {timedata[con]=0;}
                        }
                }
                if (con!=0)
                {
                        if (key2==0)
                        //如果第三個按鍵按下
                        {
                                delay1ms(10);
                                while (key2==0);
                                timedata[con]--;
                                //減一功能
                                if (con==2)
con2=23;
else con2=59;                        
                                if (timedata[con]<=0)
                                {
timedata[con]=con2;
}
                        }
                 }
                        if(key3==0)
                   //如果第四個按鍵按下
                        {
                                delay1ms(10);
                                while(key3==0);
                                EA=1;
                                TR0=1;
                                ET0=1;        
                }
          EA=1;
        //開總中斷
}


        //數碼管顯示函數


        scan()
        {
        char k;
        dis[0]=timedata[0]%10;
dis[1]=timedata[0]/10;
    dis[3]=timedata[1]%10;
dis[4]=timedata[1]/10;
    dis[6]=timedata[2]%10;
dis[7]=timedata[2]/10;
     for (k=0;k<8;k++)
                {
                        P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms(1);
P2=0x00;
                }
        }
        
        //主函數


        main()
        {
                TH0=0x3c;
TL0=0xb0;
                TMOD=0x01;
                //選擇工作方式1
ET0=1;
TR0=1;
EA=1;
           while (1)
                {
                        scan();
                        //調用數碼管顯示scan()子函數
                        keyscan();
                        //調用按鍵處理keyscan()子函數
                }
}


//定時器/計數器T0中斷服務函數


void time_intt0(void) interrupt 1
{
ET0=0;
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ms50++;
if (ms50==20)
        {
                ms50=0x00;
timedata[0]++;
                if (timedata[0]==60)
                {
                        timedata[0]=0;
timedata[1]++;
                        if (timedata[1]==60)
                        {
                                timedata[1]=0;
timedata[2]++;
                                if (timedata[2]==24)
                                {
                                        timedata[2]=0;
                                }
                        }
                }
        }
        ET0=1;
//開T0中斷
}

021818oqowyq0oslqmxomc.png (158.81 KB, 下載次數: 22)

protues仿真圖,實物加了9012pnp型的三極管驅動數碼管的位選。

protues仿真圖,實物加了9012pnp型的三極管驅動數碼管的位選。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2020-1-4 20:51 | 只看該作者
顯示程序scan()也要改為定時中斷,放在主程序循環的時間是不定的,特別是按鍵操作的時候
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-1-4 21:11 | 只看該作者
直接用樓主這個程序仿真結果是008.008.00,與貼圖不一致,原因是緩存數組有錯
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};//顯示緩沖區,時、分、秒初始為0,0x0b為"-"的編碼
實際在段碼數組里對應"-"的下標是0x0a,也就是10。
另外樓主在實際電路制作不成功可能是硬件搭建問題。51單片機I/O口高電平驅動能力不足以正常點亮數碼管,要附加放大器。
再者這種按鍵程序根本不適合與數碼管動態顯示配套,會導致黑屏。
回復

使用道具 舉報

地板
ID:318408 發表于 2020-1-5 13:07 | 只看該作者
wulin 發表于 2020-1-4 21:11
直接用樓主這個程序仿真結果是008.008.00,與貼圖不一致,原因是緩存數組有錯
char data dis[8]={0x00,0x0 ...

加了三極管放大信號了的,有另外一組的師兄也是用的這個程序,能成功,不知道為什么我的這個就是不行
回復

使用道具 舉報

5#
ID:318408 發表于 2020-1-5 13:13 | 只看該作者
csmyldl 發表于 2020-1-4 20:51
顯示程序scan()也要改為定時中斷,放在主程序循環的時間是不定的,特別是按鍵操作的時候

是在scan函數里面,把定時器跟中斷打開嗎?按鍵操作的時候中斷跟定時器是關閉了的,定時器不工作,調好了按下key3確定鍵的時候,才會繼續走。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品影院 | 久久av一区二区三区 | 激情综合五月天 | av一二三区 | 国产成人精品免高潮在线观看 | 日本三级网 | 91视视频在线观看入口直接观看 | 欧美精品一区二区三区四区 在线 | 91资源在线 | 免费a v网站| 久久av一区 | 亚洲一级黄色 | 国产三区四区 | 欧美日韩福利视频 | 狠狠操电影| 成人免费淫片aa视频免费 | 欧洲精品一区 | 狠狠久| 亚洲一二三区精品 | 久久伊人青青草 | 免费一区二区三区 | 国产一区在线看 | 免费视频二区 | 免费成人av网站 | 欧美a在线| 作爱视频免费看 | 一级a性色生活片久久毛片波多野 | 久久不卡| 久久免费精品视频 | 日韩α片| 国产成人免费在线 | 国产 日韩 欧美 在线 | 日韩三 | 欧美一区二区三区四区在线 | 欧美在线激情 | 99国产精品99久久久久久粉嫩 | 九色网址 | 国产探花在线精品一区二区 | 天天视频一区二区三区 | 国产精品美女久久久久久免费 | 国产精品激情小视频 |