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

QQ登錄

只需一步,快速開始

搜索
查看: 5539|回復(fù): 2
收起左側(cè)

單片機(jī)數(shù)碼管計(jì)時(shí)和LED流水燈點(diǎn)亮 仿真和C語言程序

[復(fù)制鏈接]
ID:156220 發(fā)表于 2019-1-27 11:14 | 顯示全部樓層 |閱讀模式
這個(gè)程序是參照《手把手教你學(xué)51單片機(jī)》里的練習(xí)程序修改寫的:

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

單片機(jī)源程序如下:

  1.         /*數(shù)碼管計(jì)時(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確保啟動(dòng)時(shí)都不亮
  15.                 0XFF,0XFF,0XFF,0XFF,0XFF
  16.         };
  17.         unsigned char cnt200 = 0;         // 200ms計(jì)數(shù)
  18.         unsigned int cnt1000 = 0;                // 1000ms計(jì)數(shù)
  19.         
  20.         void ShowCount();                 // 秒計(jì)數(shù)顯示函數(shù)
  21.         void FlowingLight();     // 流水燈實(shí)現(xiàn)函數(shù)
  22.          
  23.         void main ()
  24.         {
  25.                
  26.                 EA = 1 ;  //使能總中斷
  27.                 TMOD = 0X01 ;  //設(shè)置T0為模式1
  28.                 TH0 = 0XFC ;   //為T0賦初值0xFC67,定時(shí)1ms
  29.                 TL0 = 0X67 ;         
  30.                 ET0 = 1 ;                 //使能T0中斷
  31.                 TR0 = 1 ;                 //啟動(dòng)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刷新一次計(jì)數(shù)值
  43.                                 {
  44.                                         cnt1000 = 0 ;
  45.                                         ShowCount();
  46.                                 }
  47.                 }
  48.         }
  49.         
  50.         
  51.         /* 流水燈實(shí)現(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個(gè)LED
  59.                 if(dir == 0)                //移位方向變量為0時(shí),左移
  60.                 {
  61.                         shift = shift << 1;                //循環(huán)移位變量左移1位
  62.                         if (shift == 0X80)                //左移到最左端后,改變移位方向
  63.                         {
  64.                           dir = 1 ;
  65.                         }
  66.                 }
  67.                 else                                                  //移位方向變量不為0時(shí),右移
  68.                 {
  69.                         shift = shift >>1;        //循環(huán)移位變量右移1位
  70.                         if  (shift == 0X01)                //右移到最右端后,改變移位方向
  71.                         {
  72.                                 dir = 0 ;
  73.                         }
  74.                 }
  75.         }
  76.         
  77.         
  78.         /* 秒計(jì)數(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++ ;         //秒計(jì)數(shù)自加1
  87.                         buf[0] = sec%10 ;                 //將sec按十進(jìn)制位從低到高依次提取到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ù)字位如實(shí)轉(zhuǎn)換
  102.                         {
  103.                           LedBuff[i] = LedChar[buf[i]] ;
  104.                         }
  105.                 }
  106.                         
  107.                
  108.         /* 定時(shí)器0中斷服務(wù)函數(shù) */
  109.                 void InterruptTimer0() interrupt 1
  110.                 {
  111.                         static unsigned char i =  0 ;                 //動(dòng)態(tài)掃描的索引

  112.                         TH0 = 0XFC ;        //重新加載初值
  113.                         TL0 = 0X67 ;   
  114.                         cnt200++ ;
  115.                         cnt1000++ ;
  116.                         //以下代碼完成數(shù)碼管動(dòng)態(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.                 }
復(fù)制代碼

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


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:474670 發(fā)表于 2019-2-8 12:46 | 顯示全部樓層
很不錯(cuò),用定時(shí)器執(zhí)行了兩種功能同時(shí)運(yùn)行的效果而不沖突

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:505337 發(fā)表于 2019-4-7 22:55 來自手機(jī) | 顯示全部樓層
站著說話不腰疼 發(fā)表于 2019-2-8 12:46
很不錯(cuò),用定時(shí)器執(zhí)行了兩種功能同時(shí)運(yùn)行的效果而不沖突

運(yùn)行了嗎,怎么樣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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