找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4663|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

詳細(xì)注釋的單片機(jī)4位8段共陽數(shù)碼管動(dòng)態(tài)顯示固定數(shù)字0123程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99130 發(fā)表于 2022-4-2 10:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
4位8段共陽數(shù)碼管動(dòng)態(tài)顯示固定數(shù)字0123
下面是我根據(jù)程序做的注釋,如有錯(cuò)誤之處請(qǐng)指正!
單片機(jī)源程序如下(每一行都有詳細(xì)的注釋):
  1. /*      4位8段共陽數(shù)碼管顯示固定數(shù)字:數(shù)碼管的動(dòng)態(tài)顯示0123  

  2. 數(shù)碼管顯示原理

  3. 1.靜態(tài)顯示
  4. 多位數(shù)碼管依然可以靜態(tài)顯示,但是顯示時(shí)要么只顯示一位數(shù)碼管,
  5. 否則一體的多位同時(shí)顯示必須時(shí)顯示相同內(nèi)容。
  6. 當(dāng)多位數(shù)碼管應(yīng)用于某一系統(tǒng)時(shí),它們的“位選”是可獨(dú)立控制的,
  7. 而“段選”是連接在一起的,我們可以通過位選信號(hào)控制哪幾個(gè)數(shù)碼管亮,
  8. 而在同一時(shí)刻,位選選通的所有數(shù)碼管上顯示的數(shù)字始終都是一樣的,
  9. 因?yàn)樗鼈兊亩芜x是連接在一起的,所以送入所有數(shù)碼管的段選的信號(hào)都是相同的,
  10. 那么他們顯示的數(shù)字必定一樣。(換言之,你可以通過位選控制那個(gè)數(shù)碼管亮,但是亮的同時(shí)顯示的數(shù)字必定相同)

  11. 2.動(dòng)態(tài)顯示
  12. 位選控制亮不亮,而段選控制顯示數(shù)字,
  13. 那怎樣顯示不同的數(shù)字呢?這就利用了人體肉眼觀察的能力。
  14. 舉個(gè)例子,
  15. 假設(shè)段選1控制第一位數(shù)碼管數(shù)字顯示1,那么在顯示第二個(gè)數(shù)碼管是段選控制數(shù)碼管顯示2,
  16. 而位選控制燈第二位數(shù)碼管亮,第一位數(shù)碼管滅。但是給人的感受是第一位數(shù)碼管并沒有滅(實(shí)際已經(jīng)滅了),
  17. 因?yàn)闀r(shí)間太短人體肉眼無法識(shí)別。這樣就會(huì)發(fā)現(xiàn)數(shù)碼管動(dòng)態(tài)顯示是向左或向右一位一位點(diǎn)亮。         */

  18. #include <reg52.h>//包含51系列頭文件
  19. typedef unsigned char uchar;
  20.                               //typedef和define的作用是相似的(但實(shí)質(zhì)卻不一樣),都是給unsigned char定義一個(gè)別名。
  21.                               //也就是說,在定義這個(gè)別名之后,你用uchar就等于unsigned char
  22.                               //unsigned char意為無符號(hào)字符型數(shù)據(jù),占8位數(shù),范圍是0~255,簡(jiǎn)寫縮寫為uchar

  23.                               /*      typedef和define的區(qū)別
  24.                                typedef 是用來定義一種類型的新別名的,它不同于宏(#define),不是簡(jiǎn)單的字符串替換。
  25.                                它的新名字具有一定的封裝性,所以新命名的標(biāo)識(shí)符具有更易定義變量的功能。
  26.                                它是語言編譯過程的一部分,但它并不實(shí)際分配內(nèi)存空間。

  27.                                而 #define 只是簡(jiǎn)單的字符串替換(原地?cái)U(kuò)展),它本身并不在編譯過程中進(jìn)行,而是在這之前(預(yù)處理過程)就已經(jīng)完成了。
  28.                                因此,它不會(huì)做正確性檢查,不管含義是否正確它照樣會(huì)帶入,只有在編譯已被展開的源程序時(shí)才會(huì)發(fā)現(xiàn)可能的錯(cuò)誤并報(bào)錯(cuò)。


  29.                                接下來看下面的示例代碼:

  30.                                typedef char * PCHAR1;
  31.                                #define PCHAR2 char *
  32.                                PCHAR1 c1, c2;// c1、c2 都為char *,typedef為char *引入了一個(gè)新的別名
  33.                                PCHAR2 c3, c4;//相當(dāng)于char * c3, c4;c3是char *,而c4是char      

  34.                                在定義上述的變量時(shí),c1、c2 與 c3 按照預(yù)期都被定義成 char* 類型。
  35.                                值得注意的是,c4 卻被定義成 char 類型,而不是我們所預(yù)期的 char*。
  36.                                其根本原因就在于 #define 只是簡(jiǎn)單的字符串替換,而 typedef 則是為一個(gè)類型引入一個(gè)新的別名。
  37.                               */
  38. uchar table[] =   
  39.                                //uchar是數(shù)組類型,占8位數(shù),范圍是0~255。
  40.                                //table是數(shù)組名稱,可以自由定義,但不能和關(guān)鍵字重名,后面必須加[],內(nèi)部可注明當(dāng)前數(shù)組內(nèi)的元素個(gè)數(shù),也可不注明。
  41. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
  42.                                //從前往后分別是0123456789

  43. uchar address[] =
  44.                                //uchar是數(shù)組類型,占8位數(shù),范圍是0~255。
  45.                                //address是數(shù)組名稱,可以自由定義,但不能和關(guān)鍵字重名,后面必須加[],內(nèi)部可注明當(dāng)前數(shù)組內(nèi)的元素個(gè)數(shù),也可不注明。
  46. {0x7F,0xBF,0xDF,0xEF};         //從前往后分別是0111~1110,共陽數(shù)碼管,故0為有效,分別對(duì)應(yīng)數(shù)碼的千百十個(gè)....

  47. void Delay(uchar m)
  48.                                //C語言定義延時(shí)函數(shù)主要通過無意義指令(void意為空)的執(zhí)行來達(dá)到延時(shí)的目的。
  49.                                //delay為延時(shí),void delay為延時(shí)子程序。
  50.                                //m代表需要延時(shí)多少毫秒,uchar范圍是0-255
  51. {
  52.     unsigned char a, b;
  53.                                //定義兩個(gè)個(gè)無符號(hào)字符型變量a和b
  54.     //for(; m > 0; m--)
  55.         for(b = m; b > 0; b--)
  56.                                //本句后面沒有分號(hào),所以編譯器會(huì)默認(rèn)第二個(gè)也就是下一行的for語句是本行延時(shí)語句的內(nèi)部語句。
  57.             for(a = 2; a > 0; a--);
  58.                                //程序在執(zhí)行時(shí),第一個(gè)for語句中的b每減1次,第二個(gè)for語句便執(zhí)行2次,因此一共執(zhí)行m*2次。
  59. }
  60. int main()
  61.                                //void定義的函數(shù)沒有返回值,int定義的函數(shù)返回整型值,int為有符號(hào)整型值,范圍是-32768~32767
  62. {
  63.     uchar i = 0;
  64.                                //定義一個(gè)無符號(hào)字符型整數(shù)i為0
  65.     while(1)                   //while語句的作用是讓程序停止在某處,或延時(shí)。
  66.                                //括號(hào)里面的1為表達(dá)式,表達(dá)式可以為一個(gè)常數(shù),一個(gè)運(yùn)算或一個(gè)帶返回值的函數(shù)。
  67.                                //此句后沒有跟分號(hào),所以會(huì)默認(rèn)后面第一個(gè)分號(hào)前的語句為它的內(nèi)部語句。
  68.     {
  69.         if (i == 4)            //一輪循環(huán)亮起后從頭開始。if為選擇語句,i==4,兩個(gè)==寫在一起表示測(cè)試相等,
  70.                                //即判斷等號(hào)兩邊的數(shù)是否相等。數(shù)字4為數(shù)碼管是4個(gè),對(duì)應(yīng)前面的位碼4個(gè)
  71.             i = 0;             //意思是從第一個(gè)數(shù)碼管開始顯示
  72.         
  73.         P3 = address[i];       //通過P3控制要亮的數(shù)碼管位
  74.         P0 = table[i];         //通過P1控制要顯示的數(shù)碼管的段
  75.         ++i;                   //故i++1(i自加1),即第二個(gè)第三個(gè)第四個(gè)數(shù)碼管相繼顯示
  76.         //Delay(1);            //快速動(dòng)態(tài)顯示
  77.         Delay(1000);           //延時(shí)1000ms,可消除鬼影,達(dá)到消影

  78.     }
  79. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:262 發(fā)表于 2022-4-3 02:14 | 只看該作者
這個(gè)單片機(jī)程序不錯(cuò) 特別適合初學(xué)者
回復(fù)

使用道具 舉報(bào)

板凳
ID:297903 發(fā)表于 2022-4-3 08:55 | 只看該作者
只用延時(shí)的方法消除鬼影,會(huì)影響顯示頻率,數(shù)碼管會(huì)閃爍!!
回復(fù)

使用道具 舉報(bào)

地板
ID:99130 發(fā)表于 2022-4-3 10:32 | 只看該作者
GEECGYJ 發(fā)表于 2022-4-3 08:55
只用延時(shí)的方法消除鬼影,會(huì)影響顯示頻率,數(shù)碼管會(huì)閃爍!

是的!這是最基礎(chǔ)的
回復(fù)

使用道具 舉報(bào)

5#
ID:863362 發(fā)表于 2022-4-4 09:10 | 只看該作者
靜態(tài)顯示的時(shí)候,4個(gè)并行口各單獨(dú)接一個(gè)8段數(shù)碼管,可以同時(shí)顯示不同的數(shù)字。
回復(fù)

使用道具 舉報(bào)

6#
ID:435636 發(fā)表于 2022-4-6 11:12 | 只看該作者
51黑,有你更精彩
回復(fù)

使用道具 舉報(bào)

7#
ID:435636 發(fā)表于 2022-4-6 11:17 | 只看該作者
P3 = address;       //通過P3控制要亮的數(shù)碼管位
P0 = table;         //通過P1控制要顯示的數(shù)碼管的段

先片選,后輸出顯示碼,就會(huì)消除
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表