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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7789|回復: 0
收起左側

c語言編程實現以下功能:同時驅動8位數碼管顯示數字時鐘,并能動態改變,每隔1s自...

[復制鏈接]
ID:265788 發表于 2018-6-21 10:03 | 顯示全部樓層 |閱讀模式
一、實驗目的和要求
1、進一步熟練Keil uVision3的項目文件創建、編譯、運行和軟件仿真的基本操作方法;
2、鞏固程序調試的方法;
3、熟悉定時器0的定時功能的設計方法,掌握單片機實驗箱中數碼管顯示的電路工作原理。
4、初步熟悉單片機c語言開發方法;
5、用c語言編程實現以下功能:同時驅動8位數碼管顯示數字時鐘,并能動態改變,每隔1s自動加1,要有時分秒。
二、實驗儀器和設備
單片機編譯軟件Keil uVision3,計算機,USB下載線,CT107D單片機綜合開發平臺
三、實驗過程
在本實驗的開發平臺中,采用了2只四位共陽數碼管,根據前面的實驗,控制口都是由P0口執行,所以用到了2片74HC573鎖存器U7、U8。
開發平臺中,均采用了8位數碼管動態掃描顯示(見圖1)。它將所有數碼管的8個段線相應地并接在一起,并接到 AT89S52的鎖存器U7的Q端,由P0口控制字段(要顯示什么數字)輸出。而各位數碼管的共陽極由也是P0口控制鎖存器U8來實現8位數碼管的位輸出控制。
這樣,對于一組數碼管動態掃描顯示需要由兩組信號來控制:一組是字段輸出口輸出的字形代碼,用來控制顯示的字形,稱為段碼;另一組是位輸出口輸出的控制信號,用來選擇第幾位數碼管工作,稱為位碼。
由于各位數碼管的段線并聯,段碼的輸出對各位數碼管來說都是相同的。因此,在同一時刻如果各位數碼管的位選線都處于選通狀態的話,8位數碼管將顯示相同的字符。若要各位數碼管能夠顯示出與本位相應的字符,就必須采用掃描顯示方式。即在某一時刻,只讓某一位的位選線處于導通狀態,而其它各位的位選線處于關閉狀態。同時,段線上輸出相應位要顯示字符的字型碼。這樣在同一時刻,只有選通的那一位顯示出字符,而其它各位則是熄滅的,如此循環下去,就可以使各位數碼管顯示出將要顯示的字符。
雖然這些字符是在不同時刻出現的,而且同一時刻,只有一位顯示,其它各位熄滅,但由于數碼管具有余輝特性和人眼有視覺暫留現象,只要每位數碼管顯示間隔足夠短,給人眼的視覺印象就會是連續穩定地顯示。
數碼管不同位顯示的時間間隔可以通過調整延時程序的延時長短來完成。數碼管顯示的時間間隔也能夠確定數碼管顯示時的亮度,若顯示的時間間隔長,顯示時數碼管的亮度將亮些,若顯示的時間間隔短,顯示時數碼管的亮度將暗些。若顯示的時間間隔過長的話,數碼管顯示時將產生閃爍現象。所以,在調整顯示的時間間隔時,即要考慮到顯示時數碼管的亮度,又要數碼管顯示時不產生閃爍現象。
數碼管是由7個條形的LED和右下方一個圓形的LED組成,這樣一共有8個段線,恰好適用于8位的并行系統。數碼管有共陰極和共陽極兩種,共陰極數碼管的公共陰極接地,當各段陽極上的電平為“1”時,該段點亮,電平為“0”時,該段熄滅;

在c語言中,我們在flash中(code關鍵詞)可以定義以下字形代碼,這是段碼:
   
Unsigned char code DuanMa[]={0xc0(0),0xf9(1),0xa4(2),0xb0(3),0x99(4),0x92(5),0x82(6),0xf8(7),0x80(8),0x90(9),0xbf(-),0xff(消隱)};   //共陽
   

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit buzz=P0^6;//蜂鳴器
  7. sbit relay=P0^4;//繼電器

  8.                                                   //  0    1    2    3    4    5    6     7    8    9   -   消隱
  9. unsigned char code DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};        //共陽
  10. unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分別對應相應的數碼管點亮,即位碼
  11. uchar disData[8]={11,11,11,11,11,11,0,0};
  12. uchar times=0;
  13. uchar hour,minute,second;
  14. //函數聲明
  15. void delay_50us(uint t);  
  16. void display(uchar *point);
  17. void SEG_Latch(void);  //段碼鎖存子程序
  18. void BIT_Latch(void);  //位碼鎖存子程序  
  19. void ULN2003_Latch(void);
  20. //P2.7~P2.5=111段碼鎖存
  21. //P2.7~P2.5=110位碼鎖存

  22. main()
  23. {
  24.    buzz=0;//關蜂鳴器
  25.    relay=0;//關繼電器
  26.    ULN2003_Latch();  
  27.    TMOD |=0x01;//T0 16位定時器
  28.    TH0=(65536-50000)/256;
  29.    TL0=(65536-50000)%256;
  30.    ET0=1;
  31.    TR0=1;
  32.    EA=1;
  33.    while(1)
  34.    {
  35.       if(second == 60 )
  36.           {
  37.                    second = 0;
  38.                  minute++;
  39.                  if(minute == 60)
  40.                  {
  41.                     minute=0;
  42.                         hour++;
  43.                         if(hour==24)
  44.                         {
  45.                           hour=0;
  46.                         }
  47.                  }
  48.       }
  49.           disData[6]=second/10;
  50.       disData[7]=second%10;
  51.           disData[5]=10;
  52.           disData[3]=minute/10;
  53.       disData[4]=minute%10;
  54.           disData[2]=10;
  55.           disData[0]=hour/10;
  56.       disData[1]=hour%10;
  57.           display(disData);
  58.    }
  59. }
  60. void ISR_Timer0(void) interrupt 1
  61. {
  62.    TH0=(65536-50000)/256;
  63.    TL0=(65536-50000)%256;
  64.    times++;
  65.    if (times == 20)
  66.    {
  67.                    second++;
  68.                 times=0;
  69.    }
  70. }       
  71. void delay_50us(uint t)   //50us 延時
  72. {
  73. uchar j;  
  74. for(;t>0;t--)   
  75.    for(j=19;j>0;j--)
  76.     ;
  77. }

  78. void SEG_Latch(void)   //段碼鎖存子程序
  79. {
  80.         P2 &= 0x1f;//清P2.7~P2.5
  81.         P2 |= 0xe0;//P2.7~P2.5=111,Y7=0,Y7C=1,即U7的LE=1,段碼數據選通
  82.         _nop_();
  83.         P2 &= 0x1f;//P2.7~P2.5=000,Y7=1,Y7C=0,即U7的LE=0,段碼數據被鎖存
  84. }                                            
  85. void BIT_Latch(void)  //位碼鎖存子程序
  86. {
  87.         P2 &= 0x1f;//清P2.7~P2.5
  88.         P2 |= 0xC0;          //P2.7~P2.5=110,Y6=0,Y6C=1,即U8的LE=1,位碼數據選通
  89.         _nop_();
  90.         P2 &= 0x1f;          //P2.7~P2.5=000,Y6=1,Y6C=0,即U8的LE=0,位碼數據被鎖存
  91. }

  92. void display(uchar *point)
  93. {
  94.         unsigned char i=0;
  95.         for(i=0;i<8;i++)
  96.         {  

  97.            DataPort=WeiMa[i];   //取位碼
  98.        BIT_Latch();                        //數據鎖存

  99.            DataPort=DuanMa[*(point+i)]; //取顯示數據,段碼
  100.        SEG_Latch();                        //數據鎖存

  101.            delay_50us(20);   // 掃描間隙延時,時間太長會閃爍,太短不亮
  102.            DataPort=0xff;   //關顯示,消除重影
  103.        SEG_Latch();            //數據鎖存
  104.             
  105.      }
  106. }

  107. void ULN2003_Latch(void)   // ULN2003鎖存子程序
  108. {
  109.         P2 &= 0x1f;//清P2.7~P2.5
  110.         P2 |= 0xa0;//P2.7~P2.5=101,Y5=0,Y5C=1,即U9的LE=1,數據選通
  111.         _nop_();
  112.         P2 &= 0x1f;//P2.7~P2.5=000,Y5=1,Y5C=0,即U9的LE=0,數據被鎖存
  113. }
復制代碼

所有資料51hei提供下載:
test4參考改.zip (14.34 KB, 下載次數: 16)


評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆精品国产91久久久久久 | 欧美成人免费电影 | www国产成人免费观看视频,深夜成人网 | 日本精品一区二区三区在线观看视频 | 日韩一区欧美一区 | 亚洲一区二区在线电影 | 久久久久国产一区二区三区 | 亚洲精品乱码8久久久久久日本 | 亚洲国产精品久久久久 | 日本在线免费看最新的电影 | 日韩在线精品视频 | 日韩精品在线网站 | 国产福利91精品一区二区三区 | 成人在线观看免费视频 | 国产欧美一区二区三区在线看蜜臀 | 欧美久久久久久久久 | 一区二区三区电影网 | 一级黄色片毛片 | 欧美一级高潮片免费的 | wwwxxx日本在线观看 | 青青草华人在线视频 | 久久伊人影院 | 国产乱人伦精品一区二区 | 亚洲综合无码一区二区 | 三区在线 | 日日操操操 | 亚洲欧美自拍偷拍视频 | 国产精品国产 | 波多野结衣中文字幕一区二区三区 | 黄色大片在线 | 欧美日韩在线观看一区二区三区 | 亚洲成av人片在线观看无码 | 黄色小视频大全 | 色资源站| 成人一级片在线观看 | 中文字幕亚洲精品 | 欧美一区在线看 | 国产激情91久久精品导航 | 日本午夜免费福利视频 | 国产激情在线 | 黄色网址在线免费播放 |