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

標題: 單片機數(shù)碼管計時和LED流水燈點亮 仿真和C語言程序 [打印本頁]

作者: 紫色的云    時間: 2019-1-27 11:14
標題: 單片機數(shù)碼管計時和LED流水燈點亮 仿真和C語言程序
這個程序是參照《手把手教你學51單片機》里的練習程序修改寫的:

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


單片機源程序如下:

  1.         /*數(shù)碼管計時和LED流水燈*/
  2.         
  3.         #include <reg52.h>
  4.         sbit  WE1 = P2^0;          //        數(shù)碼管位定義
  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[]={                        //數(shù)碼管顯示字符轉(zhuǎn)換表
  11.                 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  12.                 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  13.         };
  14.         unsigned char LedBuff[]={       //                數(shù)碼管顯示緩沖區(qū),初值0xFF確保啟動時都不亮
  15.                 0XFF,0XFF,0XFF,0XFF,0XFF
  16.         };
  17.         unsigned char cnt200 = 0;         // 200ms計數(shù)
  18.         unsigned int cnt1000 = 0;                // 1000ms計數(shù)
  19.         
  20.         void ShowCount();                 // 秒計數(shù)顯示函數(shù)
  21.         void FlowingLight();     // 流水燈實現(xiàn)函數(shù)
  22.          
  23.         void main ()
  24.         {
  25.                
  26.                 EA = 1 ;  //使能總中斷
  27.                 TMOD = 0X01 ;  //設(shè)置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刷新一次計數(shù)值
  43.                                 {
  44.                                         cnt1000 = 0 ;
  45.                                         ShowCount();
  46.                                 }
  47.                 }
  48.         }
  49.         
  50.         
  51.         /* 流水燈實現(xiàn)函數(shù) */
  52.         
  53.         void FlowingLight()
  54.         {
  55.                 static unsigned char dir = 0;  //移位方向變量dir,用于控制移位的方向
  56.                 static unsigned char shift = 0X01 ;        //循環(huán)移位變量shift,并賦初值0x01
  57.                
  58.                 P1  = ~shift ;                //循環(huán)移位變量取反,控制8個LED
  59.                 if(dir == 0)                //移位方向變量為0時,左移
  60.                 {
  61.                         shift = shift << 1;                //循環(huán)移位變量左移1位
  62.                         if (shift == 0X80)                //左移到最左端后,改變移位方向
  63.                         {
  64.                           dir = 1 ;
  65.                         }
  66.                 }
  67.                 else                                                  //移位方向變量不為0時,右移
  68.                 {
  69.                         shift = shift >>1;        //循環(huán)移位變量右移1位
  70.                         if  (shift == 0X01)                //右移到最右端后,改變移位方向
  71.                         {
  72.                                 dir = 0 ;
  73.                         }
  74.                 }
  75.         }
  76.         
  77.         
  78.         /* 秒計數(shù)顯示函數(shù) */
  79.         
  80.                 void ShowCount()
  81.                 {
  82.                     char i ;          //循環(huán)變量
  83.                         unsigned char buf[4];         //中間轉(zhuǎn)換緩沖區(qū)
  84.                         static unsigned long sec = 1;        //記錄經(jīng)過的秒數(shù)
  85.                         
  86.                         sec++ ;         //秒計數(shù)自加1
  87.                         buf[0] = sec%10 ;                 //將sec按十進制位從低到高依次提取到buf數(shù)組中
  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退出循環(huán)
  95.                         {
  96.                                 if(buf[i] == 0)
  97.                                         LedBuff[i] = 0XFF ;
  98.                                 else
  99.                                         break;
  100.                         }
  101.                         for (;i>=0; i--)                 //將剩余的有效數(shù)字位如實轉(zhuǎn)換
  102.                         {
  103.                           LedBuff[i] = LedChar[buf[i]] ;
  104.                         }
  105.                 }
  106.                         
  107.                
  108.         /* 定時器0中斷服務(wù)函數(shù) */
  109.                 void InterruptTimer0() interrupt 1
  110.                 {
  111.                         static unsigned char i =  0 ;                 //動態(tài)掃描的索引

  112.                         TH0 = 0XFC ;        //重新加載初值
  113.                         TL0 = 0X67 ;   
  114.                         cnt200++ ;
  115.                         cnt1000++ ;
  116.                         //以下代碼完成數(shù)碼管動態(tài)掃描刷新
  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, 下載次數(shù): 31)



作者: 站著說話不腰疼    時間: 2019-2-8 12:46
很不錯,用定時器執(zhí)行了兩種功能同時運行的效果而不沖突
作者: 喜樂    時間: 2019-4-7 22:55
站著說話不腰疼 發(fā)表于 2019-2-8 12:46
很不錯,用定時器執(zhí)行了兩種功能同時運行的效果而不沖突

運行了嗎,怎么樣




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一级毛片在线播放 | 成人在线黄色 | 精品亚洲一区二区三区 | 精品国产乱码久久久久久蜜退臀 | 亚洲高清在线 | 日日干夜夜操 | 91久久精品国产免费一区 | 北条麻妃一区二区三区在线视频 | 欧美大片在线观看 | 亚洲最大的成人网 | 成人午夜视频在线观看 | 日韩精品免费视频 | 一区二区av | 激情五月婷婷丁香 | 成人精品国产一区二区4080 | 国内在线视频 | 99婷婷 | 91精品国产91久久综合桃花 | 亚洲自拍一区在线观看 | 亚洲最新在线视频 | 欧美国产日韩一区二区三区 | 国产精品不卡 | 金莲网 | www.日韩系列 | 亚洲国产精品一区 | 国产精品成人在线播放 | 久久福利网站 | 亚洲精品久久区二区三区蜜桃臀 | 色综合99 | 精品一二三 | 亚洲综合色丁香婷婷六月图片 | av一区二区三区四区 | 国产一区二区三区久久久久久久久 | 亚洲一区二区精品视频 | 日韩精品一区二区三区四区视频 | 中文成人在线 | 蜜臀久久99精品久久久久野外 | 久在线视频播放免费视频 | www.中文字幕av | 欧美一级高清片 | www久久99 |