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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數碼管計時和LED流水燈點亮 仿真和C語言程序

[復制鏈接]
跳轉到指定樓層
樓主
這個程序是參照《手把手教你學51單片機》里的練習程序修改寫的:

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:

  1.         /*數碼管計時和LED流水燈*/
  2.         
  3.         #include <reg52.h>
  4.         sbit  WE1 = P2^0;          //        數碼管位定義
  5.         sbit  WE2 = P2^1;
  6.         sbit  WE3 = P2^2;
  7.         sbit  WE4 = P2^3;
  8.         sbit  BEEP = P2^4;

  9.         
  10.         unsigned char  code LedChar[]={                        //數碼管顯示字符轉換表
  11.                 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  12.                 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  13.         };
  14.         unsigned char LedBuff[]={       //                數碼管顯示緩沖區,初值0xFF確保啟動時都不亮
  15.                 0XFF,0XFF,0XFF,0XFF,0XFF
  16.         };
  17.         unsigned char cnt200 = 0;         // 200ms計數
  18.         unsigned int cnt1000 = 0;                // 1000ms計數
  19.         
  20.         void ShowCount();                 // 秒計數顯示函數
  21.         void FlowingLight();     // 流水燈實現函數
  22.          
  23.         void main ()
  24.         {
  25.                
  26.                 EA = 1 ;  //使能總中斷
  27.                 TMOD = 0X01 ;  //設置T0為模式1
  28.                 TH0 = 0XFC ;   //為T0賦初值0xFC67,定時1ms
  29.                 TL0 = 0X67 ;         
  30.                 ET0 = 1 ;                 //使能T0中斷
  31.                 TR0 = 1 ;                 //啟動T0
  32.                
  33.                 while (1)
  34.                 {
  35.                              
  36.                                 if (cnt200 >= 200 )         // 200ms刷新一次流水燈
  37.                                 {
  38.                                         cnt200 = 0 ;
  39.                                         FlowingLight();
  40.                                        
  41.                                 }
  42.                                 if (cnt1000 >= 1000)                //1s刷新一次計數值
  43.                                 {
  44.                                         cnt1000 = 0 ;
  45.                                         ShowCount();
  46.                                 }
  47.                 }
  48.         }
  49.         
  50.         
  51.         /* 流水燈實現函數 */
  52.         
  53.         void FlowingLight()
  54.         {
  55.                 static unsigned char dir = 0;  //移位方向變量dir,用于控制移位的方向
  56.                 static unsigned char shift = 0X01 ;        //循環移位變量shift,并賦初值0x01
  57.                
  58.                 P1  = ~shift ;                //循環移位變量取反,控制8個LED
  59.                 if(dir == 0)                //移位方向變量為0時,左移
  60.                 {
  61.                         shift = shift << 1;                //循環移位變量左移1位
  62.                         if (shift == 0X80)                //左移到最左端后,改變移位方向
  63.                         {
  64.                           dir = 1 ;
  65.                         }
  66.                 }
  67.                 else                                                  //移位方向變量不為0時,右移
  68.                 {
  69.                         shift = shift >>1;        //循環移位變量右移1位
  70.                         if  (shift == 0X01)                //右移到最右端后,改變移位方向
  71.                         {
  72.                                 dir = 0 ;
  73.                         }
  74.                 }
  75.         }
  76.         
  77.         
  78.         /* 秒計數顯示函數 */
  79.         
  80.                 void ShowCount()
  81.                 {
  82.                     char i ;          //循環變量
  83.                         unsigned char buf[4];         //中間轉換緩沖區
  84.                         static unsigned long sec = 1;        //記錄經過的秒數
  85.                         
  86.                         sec++ ;         //秒計數自加1
  87.                         buf[0] = sec%10 ;                 //將sec按十進制位從低到高依次提取到buf數組中
  88.                         buf[1] = sec/10%10 ;
  89.                         buf[2] = sec/100%10 ;
  90.                         buf[3] = sec/1000%10 ;
  91.                          //buf[4] =sec/10000%10 ;
  92.                         //buf[5] = sec/100000%10;
  93.                         
  94.                         for(i=3; i>=1; i--)   //從最高為開始,遇到0不顯示,遇到非0退出循環
  95.                         {
  96.                                 if(buf[i] == 0)
  97.                                         LedBuff[i] = 0XFF ;
  98.                                 else
  99.                                         break;
  100.                         }
  101.                         for (;i>=0; i--)                 //將剩余的有效數字位如實轉換
  102.                         {
  103.                           LedBuff[i] = LedChar[buf[i]] ;
  104.                         }
  105.                 }
  106.                         
  107.                
  108.         /* 定時器0中斷服務函數 */
  109.                 void InterruptTimer0() interrupt 1
  110.                 {
  111.                         static unsigned char i =  0 ;                 //動態掃描的索引

  112.                         TH0 = 0XFC ;        //重新加載初值
  113.                         TL0 = 0X67 ;   
  114.                         cnt200++ ;
  115.                         cnt1000++ ;
  116.                         //以下代碼完成數碼管動態掃描刷新
  117.                         P0 = 0xFF;                           //顯示消隱
  118.                         
  119.                         switch(i)
  120.                         {
  121.                                 case 0: WE1 = 0;WE2 = 0;WE3 = 0;WE4 = 1; P0=LedBuff[0];i++;break;
  122.                                 case 1: WE1 = 0;WE2 = 0;WE3 = 1;WE4 = 0; P0=LedBuff[1];i++; break;
  123.                                 case 2: WE1 = 0;WE2 = 1;WE3 = 0;WE4 = 0; P0=LedBuff[2];i++;break;
  124.                                 case 3: WE1 = 1;WE2 = 0;WE3 = 0;WE4 = 0; P0=LedBuff[3];i=0;break;
  125.                                 default: break;
  126.                         }
  127.                 }
復制代碼

所有資料51hei提供下載:
LED SMG - 1.rar (77.37 KB, 下載次數: 31)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:474670 發表于 2019-2-8 12:46 | 只看該作者
很不錯,用定時器執行了兩種功能同時運行的效果而不沖突

評分

參與人數 4黑幣 +47 收起 理由
春風十里吹 + 10 很給力!
zhengchong60 + 15
shuisheng60 + 10
鉆牛尖滴劉尖尖 + 12

查看全部評分

回復

使用道具 舉報

板凳
ID:505337 發表于 2019-4-7 22:55 來自手機 | 只看該作者
站著說話不腰疼 發表于 2019-2-8 12:46
很不錯,用定時器執行了兩種功能同時運行的效果而不沖突

運行了嗎,怎么樣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国内 | 欧美国产一区二区 | 午夜一区二区三区在线观看 | 亚洲高清视频一区 | 在线观看av网站永久 | 羞羞色在线观看 | 国产精品久久在线观看 | 青青久久av北条麻妃海外网 | 亚洲一区二区三区在线 | 99热这里都是精品 | 午夜av电影院 | 亚洲一区二区三区在线 | 日日骚网| 国产区高清 | 天天夜碰日日摸日日澡 | 日韩欧美中文字幕在线观看 | 国产福利在线播放麻豆 | av影音在线 | 天堂久久一区 | 91精品国产乱码久久久久久久久 | 在线播放国产一区二区三区 | 香蕉视频91| 欧美13videosex性极品 | 日韩蜜桃视频 | 免费一二区 | 精品免费 | 成人影视网址 | 日日夜夜天天久久 | 精品欧美一区二区在线观看欧美熟 | 2021天天躁夜夜看 | 成人国产精品免费观看 | 亚洲va欧美va人人爽午夜 | 五月免费视频 | 久久天堂 | 欧美日韩成人在线 | 在线免费观看黄a | 一区二区三区在线免费观看视频 | 欧美精品久久久 | 欧美一二区 | 精品亚洲一区二区三区 | 国产一区二区三区四区五区加勒比 |