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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

詳細注釋的單片機4位8段共陽數碼管動態顯示固定數字0123程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:99130 發表于 2022-4-2 10:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
4位8段共陽數碼管動態顯示固定數字0123
下面是我根據程序做的注釋,如有錯誤之處請指正!
單片機源程序如下(每一行都有詳細的注釋):
  1. /*      4位8段共陽數碼管顯示固定數字:數碼管的動態顯示0123  

  2. 數碼管顯示原理

  3. 1.靜態顯示
  4. 多位數碼管依然可以靜態顯示,但是顯示時要么只顯示一位數碼管,
  5. 否則一體的多位同時顯示必須時顯示相同內容。
  6. 當多位數碼管應用于某一系統時,它們的“位選”是可獨立控制的,
  7. 而“段選”是連接在一起的,我們可以通過位選信號控制哪幾個數碼管亮,
  8. 而在同一時刻,位選選通的所有數碼管上顯示的數字始終都是一樣的,
  9. 因為它們的段選是連接在一起的,所以送入所有數碼管的段選的信號都是相同的,
  10. 那么他們顯示的數字必定一樣。(換言之,你可以通過位選控制那個數碼管亮,但是亮的同時顯示的數字必定相同)

  11. 2.動態顯示
  12. 位選控制亮不亮,而段選控制顯示數字,
  13. 那怎樣顯示不同的數字呢?這就利用了人體肉眼觀察的能力。
  14. 舉個例子,
  15. 假設段選1控制第一位數碼管數字顯示1,那么在顯示第二個數碼管是段選控制數碼管顯示2,
  16. 而位選控制燈第二位數碼管亮,第一位數碼管滅。但是給人的感受是第一位數碼管并沒有滅(實際已經滅了),
  17. 因為時間太短人體肉眼無法識別。這樣就會發現數碼管動態顯示是向左或向右一位一位點亮。         */

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

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

  27.                                而 #define 只是簡單的字符串替換(原地擴展),它本身并不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了。
  28.                                因此,它不會做正確性檢查,不管含義是否正確它照樣會帶入,只有在編譯已被展開的源程序時才會發現可能的錯誤并報錯。


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

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

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

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

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

  78.     }
  79. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:262 發表于 2022-4-3 02:14 | 只看該作者
這個單片機程序不錯 特別適合初學者
回復

使用道具 舉報

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

使用道具 舉報

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

是的!這是最基礎的
回復

使用道具 舉報

5#
ID:863362 發表于 2022-4-4 09:10 | 只看該作者
靜態顯示的時候,4個并行口各單獨接一個8段數碼管,可以同時顯示不同的數字。
回復

使用道具 舉報

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

使用道具 舉報

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

先片選,后輸出顯示碼,就會消除
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本成人中文字幕 | 精品国产乱码久久久久久蜜柚 | 久久久久国产 | 欧美男人天堂 | 喷水毛片| 国产精品 亚洲一区 | 亚洲一区二区国产 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 成年视频在线观看福利资源 | 精品一区二区三区四区 | 精品久久香蕉国产线看观看亚洲 | 亚洲精品自在在线观看 | 国产精品色av | 中文字幕在线精品 | 国产精品区二区三区日本 | 国产综合久久久久久鬼色 | 中文日韩在线 | 国产欧美一区二区三区久久人妖 | 在线第一页 | 亚洲电影专区 | 国产精品日韩欧美一区二区 | 久久久久国产一区二区三区不卡 | jizz中国日本 | 欧美伊人影院 | 国产精品一区二区在线 | 中文字幕日韩欧美一区二区三区 | 新av在线| 毛片a级毛片免费播放100 | 久久中文视频 | 午夜寂寞影院在线观看 | 亚洲aⅴ一区二区 | 国产精品99久久久久久久久 | 欧美一区二区三区在线视频 | 美女黄18岁以下禁止观看 | 久久精品中文字幕 | 欧美一区二区三区在线观看视频 | 黄色一级大片在线观看 | 97精品国产97久久久久久免费 | 麻豆精品一区二区三区在线观看 | 国产精品久久一区二区三区 | 精品三区 |