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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助:寫了個數碼管鬧鐘程序,有幾個地方調不出來。

[復制鏈接]
跳轉到指定樓層
樓主
8位LED數碼管可調鬧鐘。



8個LED數碼管88-88-88這樣。
采用 2個鎖存器輸出 段選,位選。
采用3個獨立按鍵:
1、SET(按一下調整秒鐘,在按一下調整分鐘,按三下調整小時,按4下完成調整。)

2、加減按鍵,按一下,就加減一個數字。先由SET選擇調試 小時 還是分鐘, 然后按加減鍵 調節數字。

問題:
1、SET鍵那里我采用的是記錄鍵值思路。

    按一下SET ,  keynumber=1,  TR0=0 暫停計時,
  按下加按鍵,  如果鍵值=1、2或者3,   秒、分鐘或者小時的計數變量加一。

但是問題就來了, 按下SET 鍵后 有的時候是  調節小時,有的時候是調節分鐘,有的時候沒變化。
下面是原理圖 和 程序。


人生日歷截圖20160516203142.png (38.58 KB, 下載次數: 114)

電路原理圖

電路原理圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:121267 發表于 2016-5-16 20:49 | 只看該作者
#include<reg51.h>
#define uchar unsigned char
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x040,0x80};
sbit duEN=P3^6;
sbit weiEN=P3^7;
sbit k0=P2^0;
sbit k1=P2^1;
sbit k2=P2^2;
char countsec,countmin,counthou;
uchar flag;
char key;
延時程序略過。

鍵盤掃描。
void keyboard()
{
                if(k0==0)
                                {
                                       鍵盤消抖。
                                        ys(50);
                                        if(k0==0)
                                        {
                                                松手檢測。
                                                while(!k0)
                                                {
                                                        key++;                                                       
                                                        TR0=0;
                                                        if(key==4)
                                                        {
                                                                key=0;
                                                                TR0=1;
                                                        }
                                                }
                                        }
                                }
               

                                if(k1==0)
                                {
                                        ys(50);
                                        if(k1==0)
                                        {
                                       
                                                 while(!k1);
                                                        if(key==1)
                                                        {
                                                        countsec++;
                                                        if(countsec==60)
                                                        countsec=0;
                                                        }
                                                        if(key==2)
                                                        {
                                                        countmin++;
                                                        if(countmin==60)
                                                        countmin=0;
                                                        }
                                                        if(key==3)
                                                        {
                                                        counthou++;
                                                        if(counthou==24)
                                                        counthou=0;
                                                        }
                                        }
                                }


                                if(k2==0)
                                {
                                        ys(50);
                                        if(k2==0)
                                        {
                                                while(!k2);
                                                        if(key==1)
                                                        {
                                                        countsec--;
                                                        if(countsec==-1)
                                                        countsec=59;
                                                        }
                                                        if(key==2)
                                                        {
                                                        countmin--;
                                                        if(countmin==-1)
                                                        countmin=59;
                                                        }
                                                        if(key==3)
                                                        {
                                                        counthou--;
                                                        if(counthou==-1)
                                                        counthou=23;
                                                }
                                        }
                                }

}
一共8位,有點長,就發一段吧,其他都是一樣的。
void ledxs()
{  
        P0=led[counthou/10];
        duEN=1;       
        duEN=0;
        P0=wei[0];       
        weiEN=1;       
        weiEN=0;
        ys(5);
以下為消隱,求教 為什么這樣可以消隱。按我理解 先給P0賦值,然后開鎖存器使能,瞬間值就付給鎖存,然后關使能。應該不會出現鬼影的。事           實是不加下面幾句,仿真中時鐘亂顯示。
        P0=0xff;           
        duEN=1;                              
        duEN=0;

}

主程序: T0初始化,最后不斷掃描鍵盤和顯示,等待中斷發生,從而刷新顯示。

void main()
{
        TMOD=0X01;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
               
        keyboard();                       
        ledxs();

        }                                          
}


中斷子程序:秒計數。

void timer0() interrupt 1 using 0
{
        flag++;       
        if(flag==20)
                {
                        flag=0;
                        countsec++;}
        if(countsec==60)
        {
                countsec=0;
                countmin++;        }
        if(countmin==60)
        {
                countmin=0;
                counthou++;        }
        if(counthou==24)
        {
                counthou=0;
        }
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
}


回復

使用道具 舉報

板凳
ID:121267 發表于 2016-5-16 20:55 | 只看該作者
oh, fvck。 整理排版的時候發現,我SET鍵(K0) 的松手檢測寫錯了。 寫成下面這個:
                                                while(!k0)
                                                {
                                                        key++;                                                        
                                                        TR0=0;
                                                        if(key==4)
                                                        {
                                                                key=0;
                                                                TR0=1;
                                                        }
                                                } MD 怪不得  按了這個鍵是調整小時還是分鐘,是無規律的,等待松手的時候不知道KEY加了多少次。
修改之后 。仿真沒有問題了。
                                               while(!k0);
                                                        key++;                                                        
                                                        TR0=0;
                                                        if(key==4)
                                                        {
                                                                key=0;
                                                                TR0=1;
                                                        }
                                                
回復

使用道具 舉報

地板
ID:121267 發表于 2016-5-16 21:14 | 只看該作者
還有幾個問題。

我采用的是共陽極數碼管, 使用鎖存器作為驅動。1、位選 是不是  為1的時候  允許該位顯示?
如果采用9012 PNP三極管作為驅動,是不是  某個位控制I0口輸出為0的時候允許該位點亮。
看網上程序的時候 沒注意每個人的驅動方法不一樣,只發現同樣共陽怎么位選不一樣, 把我搞暈了,所以請教一下大家,給我個準確答復。
2、數碼管 消隱,共陽極數碼管段選  是低電平有效。消隱就是關閉所有發光管,就是P0=0xff?
關于消隱程序 我最開始用的 郭天祥的, 如下:
         duEN=1;               
        P0=led[counthou/10];       
        duEN=0;
        P0=0Xff;       
        weiEN=1;       
        P0=wei[0];
        weiEN=0;
        ys(5);
居然 沒法顯示, 然后 從網上學了 這種:
        P0=led[counthou/10];
        duEN=1;       
        duEN=0;
        P0=wei[0];       
        weiEN=1;       
        weiEN=0;
        ys(5);
        P0=0xff;
        duEN=1;
        duEN=0;

消隱這個 我知道就是關掉P0,以免動態顯示要輸出下一位時,把上一位的段選給輸過去.  我感覺我理解的很糙,還請大家幫我梳理一下。
然后還有一個單片機 跑程序的流程就是   逐行掃描運行,好像還默認的從頭到尾不斷循環。這個理解是不是對的?這個也請大家幫我梳理一下。

還有一個問題。
我想做成    按下SET鍵后,調整秒鐘/分鐘/時鐘的時候, 秒/分/時的那2位會閃爍,這個怎么做?我完全沒有思路。


回復

使用道具 舉報

5#
ID:7485 發表于 2016-5-16 22:33 | 只看該作者
本帖最后由 ahshmj 于 2016-5-16 22:35 編輯

不是“鍵值”,是按鍵次數。設一個計數器,每按一次加1 。根據這個計數值,確定調整的項目。當然循環完后轉回0或1,

當需要調的項目需要閃爍時,可以用另一個定時器中斷方法,一般取0.3~0.5秒中斷一次,每次中斷變換一次,在輸出正常的段碼和全滅之間變換即可。

我做的是設一個標志,中斷一次標志轉換一次,調顯示程序時,根據標志輸出亮、滅。
回復

使用道具 舉報

6#
ID:111634 發表于 2016-5-17 07:45 | 只看該作者
本帖最后由 zl2168 于 2016-5-17 08:58 編輯

模擬電子鐘(由80C51定時器產生秒時基)已在本壇“51單片機”專欄2016.5.11上傳,可參閱。






K0、K1K2具有時鐘校正功能,其控制過程為:


按下K0(帶鎖),進入時鐘修正;首先,時數據(包括時十位、時個位)快速閃爍(亮暗各131ms);


按一次K1(不帶鎖),被修正數據(快速閃爍)按時、分、秒(同時包括十位、個位)次序右移(循環往復);


按一次K2(不帶鎖),被修正數據整體加1(最大值不超過時鐘規定值,超過復0);時鐘修正期間,計時繼續運行;


釋放K0,退出時鐘修正。



回復

使用道具 舉報

7#
ID:121267 發表于 2016-5-17 19:55 | 只看該作者
zl2168 發表于 2016-5-17 07:45
模擬電子鐘(由80C51定時器產生秒時基)已在本壇“51單片機”專欄2016.5.11上傳,可參閱。

謝謝,我去看看。
回復

使用道具 舉報

8#
ID:121267 發表于 2016-5-17 20:51 | 只看該作者
zl2168 發表于 2016-5-17 07:45
模擬電子鐘(由80C51定時器產生秒時基)已在本壇“51單片機”專欄2016.5.11上傳,可參閱。

好的,我去看看,謝謝了。
回復

使用道具 舉報

9#
ID:121267 發表于 2016-5-17 21:01 | 只看該作者
ahshmj 發表于 2016-5-16 22:33
不是“鍵值”,是按鍵次數。設一個計數器,每按一次加1 。根據這個計數值,確定調整的項目。當然循環完后轉 ...

我試了一下,不知道是不是我沒弄好。 結果是8位全部都在閃爍,就是動態掃描  顯示延時 設太長的那種現象。我沒用 2個定時器,因為我還不知道怎么設中斷優先。待會學習下。然后在試一下。
回復

使用道具 舉報

10#
ID:111634 發表于 2016-5-19 18:38 | 只看該作者
本帖最后由 zl2168 于 2016-5-19 18:42 編輯

模擬電子鐘(由80C51定時器產生秒時基)已在本壇“51單片機”專欄2016.5.11上傳,可參閱。









開機顯示000秒,隨后開始計時運行,2組發光二極管秒閃爍(亮暗各500ms。同時要求K0、K1K2具有時鐘校正功能,其控制過程為:按下K0(帶鎖),進入時鐘修正;首先,時數據(包括時十位、時個位)快速閃爍(亮暗各131ms);按一次K1(不帶鎖),被修正數據(快速閃爍)按時、分、秒(同時包括十位、個位)次序右移(循環往復);按一次K2(不帶鎖),被修正數據整體加1(最大值不超過時鐘規定值,超過復0);時鐘修正期間,計時繼續運行;釋放K0,退出時鐘修正。


實例94 模擬電子鐘(由80C51定時器產生秒時基).rar (43.05 KB, 下載次數: 10)


回復

使用道具 舉報

11#
ID:111634 發表于 2016-5-19 21:13 | 只看該作者
試試上述模擬電子鐘Proteus仿真演示,包你滿意。
回復

使用道具 舉報

12#
ID:121267 發表于 2016-5-21 10:24 | 只看該作者
zl2168 發表于 2016-5-19 21:13
試試上述模擬電子鐘Proteus仿真演示,包你滿意。

恩! 我看了下,確實給力。謝謝了,讓我知道有 74595這種 驅動。
回復

使用道具 舉報

13#
ID:111634 發表于 2016-5-21 10:25 | 只看該作者
本帖最后由 zl2168 于 2016-5-21 10:26 編輯

模擬電子鐘程序如下:














t0t1.jpg (108.49 KB, 下載次數: 89)

t0t1.jpg
回復

使用道具 舉報

14#
ID:111634 發表于 2016-5-21 10:29 | 只看該作者
上述電路和程序引自張志良編著《單片機實驗實訓100例》 ISBN 978-7-5124-1603-1,北航社出版、《80C51單片機實用教程》ISBN 978-7-04-044532-9,高教社出版。歡迎咨詢,zzlls@126.com
回復

使用道具 舉報

15#
ID:121267 發表于 2016-5-21 10:31 | 只看該作者
zl2168 發表于 2016-5-19 21:13
試試上述模擬電子鐘Proteus仿真演示,包你滿意。

前輩,請教一下,uchar 是無符號的吧。 可是在時鐘里  按鍵調時間的時候,用到一句 :  如果減計數按鍵被按下,秒計數減一,如果秒計數=-1,秒計數=59。
我的秒計數變量是 uchar型的, uchar不是無符號嗎?為什么程序 可以編譯成功,仿真也可以用呢?

                                                       if(k1==0)
                                                       {
                                                            countsec--;
                                                            if(countsec==-1)
                                                            countsec=59;
                                                        }
回復

使用道具 舉報

16#
ID:111634 發表于 2016-5-21 10:39 | 只看該作者
為什么要秒計數減一?時鐘都是加一的。你看我的程序,加到60,復0.
回復

使用道具 舉報

17#
ID:111634 發表于 2016-5-21 10:42 | 只看該作者
啊哦!你可能是到計時秒表。介紹你一本書,張志良編著《單片機實驗實訓100例》 ISBN 978-7-5124-1603-1,北航社出版,里面有99.9秒表和能預設初值的倒計時秒表實例。
回復

使用道具 舉報

18#
ID:111634 發表于 2016-5-21 10:55 | 只看該作者
啊哦!我知道你問的問題了。-1是補碼,255,仍屬于uchar。
回復

使用道具 舉報

19#
ID:111634 發表于 2016-5-21 10:57 | 只看該作者
0-1=255
回復

使用道具 舉報

20#
ID:121495 發表于 2016-5-21 14:41 | 只看該作者
還是用lcd1602寫比較實用點
回復

使用道具 舉報

21#
ID:111634 發表于 2016-5-21 15:27 | 只看該作者
這是一個題目。有LED顯示,也有LCD顯示。本題是LED顯示。
回復

使用道具 舉報

22#
ID:111634 發表于 2016-5-21 15:30 | 只看該作者
還有秒基準取自于外時鐘芯片,還是取自于內振蕩時鐘。本題是內振蕩時鐘,分頻后產生秒基準。
回復

使用道具 舉報

23#
ID:111634 發表于 2016-5-21 15:32 | 只看該作者
介紹你一本書,張志良編著《單片機實驗實訓100例》 ISBN 978-7-5124-1603-1,北航社出版,里面有4種1302的電路、程序和仿真案例
回復

使用道具 舉報

24#
ID:111634 發表于 2016-5-21 15:37 | 只看該作者
上述4種1302的電路、程序和仿真案例已上傳至本壇“51單片機”專欄
回復

使用道具 舉報

25#
ID:111634 發表于 2016-5-21 15:38 | 只看該作者
2016-5-3 本人上傳的“開機顯示PC機時間的時鐘1302”(1602顯示)
回復

使用道具 舉報

26#
ID:111634 發表于 2016-5-21 15:38 | 只看該作者
2016-5-4 本人上傳的“具有校正功能的時鐘1302”(1602顯示)
回復

使用道具 舉報

27#
ID:111634 發表于 2016-5-21 15:38 | 只看該作者
2016-5-5 本人上傳的“開機顯示PC機時分秒的時鐘1302”(LED數碼管顯示)
回復

使用道具 舉報

28#
ID:111634 發表于 2016-5-21 15:39 | 只看該作者
2016-5-6 本人上傳的“具有校正功能的時鐘1302(LED數碼管顯示)”
回復

使用道具 舉報

29#
ID:111634 發表于 2016-5-21 19:49 | 只看該作者
Proteus仿真試了沒有?試后滿意再謝。
回復

使用道具 舉報

30#
ID:121267 發表于 2016-5-23 11:19 | 只看該作者
zl2168 發表于 2016-5-21 19:49
Proteus仿真試了沒有?試后滿意再謝。

試過了!效果很好,謝謝了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲在线免费 | 国产午夜精品福利 | 麻豆精品国产免费 | 日韩爱爱网 | 97人人澡人人爽91综合色 | 日韩高清国产一区在线 | 一级黄色片在线免费观看 | 免费久久网 | 91影片 | 免费一级片 | 在线观看av不卡 | 久久精品一级 | 日韩免费一区二区 | 日韩天堂av| 亚洲a视频 | 国产精品99久久久久久久vr | 欧美日日日日bbbbb视频 | 欧美日韩电影在线 | 久久av一区二区三区 | 亚洲综合在线一区 | 国产精品久久久久久吹潮 | 国产精品毛片一区二区三区 | 日韩一区二区视频 | 亚洲欧美综合精品久久成人 | 一区二区视频在线 | 国产日韩精品视频 | 中文字幕在线三区 | 日韩中文字幕在线视频 | 日本a视频 | 九九久久久 | 久久国内 | 欧美日韩成人影院 | 国产精品视频久久久 | 久久九九影视 | 人人玩人人添人人澡欧美 | 亚洲一本 | 婷婷色在线播放 | 999久久久免费精品国产 | 少妇性l交大片免费一 | 国产精品一区在线观看 | 亚洲国产成人久久久 |