專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

單片機(jī)左右流水燈與數(shù)碼管動態(tài)顯示C程序

作者:徐冉   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2014年03月24日   【字體:

本程序所用的原理圖下載: 點(diǎn)這里 ,單片機(jī)芯片使用的stc89c52;找到相應(yīng)部分即可.這是一整個單片機(jī)開發(fā)板的電路圖其他的忽略.以下是通過測試的源代碼:

/*
*功能:用定時器0實(shí)現(xiàn)定時200毫秒流水燈,
*    同時用定時器1實(shí)現(xiàn)動態(tài)顯示654321,
*    且蜂鳴器發(fā)聲;
*日期:2014-03-24
*作者:徐冉
*注意事項(xiàng):若打開兩個定時器時,必須使用兩個定時器,
*     否則兩個定時器都不工作。!
**/
/**********AT89C52-RC 51hei單片機(jī)實(shí)驗(yàn)板**************/
/*************51hei-開發(fā)板*********************/
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit wela = P2^7;  //數(shù)碼管位聲明
sbit dula = P2^6; //數(shù)碼管段選聲明
sbit FM = P2^3;//蜂鳴器聲明
uchar counter = 0, counter1 = 0, j = 0, flag = 0, flag1 = 0;
uchar num = 6, num1 = 0;
//數(shù)碼管段選編碼
uchar code table_du [] = {  
          0x3F,  //"0"
                   0x06,  //"1"
                   0x5B,  //"2"
                   0x4F,  //"3"
                   0x66,  //"4"
                   0x6D,  //"5"
                   0x7D,  //"6"
                   0x07,  //"7"
                   0x7F,  //"8"
                   0x6F,  //"9"
                   0x77,  //"A"
                   0x7C,  //"B"
                   0x39,  //"C"
                   0x5E,  //"D"
                   0x79,  //"E"
                   0x71,  //"F"
                   0x76,  //"H"
                   0x38,  //"L"
                   0x37,  //"n"
                   0x3E,  //"u"
                   0x73,  //"P"
                   0x5C,  //"o"
                   0x40,  //"-"
                   0x00,  //熄滅
                   0x00  //自定義
       };
//數(shù)碼管位選編碼
uchar code table_we[] = {
       0xfe,
       0xfd,
       0xfb,
       0xf7,
       0xef,
       0xdf
       };
void init();
void display();
void main()
{
 
 init();
 while(1)
 {
   if(counter1 == 30)
   {
    counter1 = 0;
   display();
   num--;
   num1++;
   if(num == 0)
   {
    num = 6;
   }
   if(num1 == 6)
   {
    num1 = 0;
    }
   }
  
   if(counter == 200)//定時到4秒后,流水燈向右流動
   {     
    counter = 0;//counter清零,
   //關(guān)閉定時器0
   TR0 = 0;
   //ET0 = 0;
   flag = 1; //標(biāo)志變量置1后,定時器重新初始化
   TH0 = 0xB8; //定時器0定時20毫秒
   TL0 = 0x00;
   TR0 = 1;   //重新打開定時器0
   //ET0 = 1;
   j = 0;
   }
 }
}
//定時器初始化程序
void init()
{
 //定時器0和定時器1初始化函數(shù)
 TMOD = 0x11;//定義定時器1和0在工作方式1下
 TH0 = 0xB8; //定時器0定時20毫秒
 TL0 = 0x00;
 TH1 = 0xFC; //定時器1定時20毫秒
 TL1 = 0x67;
 TR0 = 1;   //打開定時器0
 TR1 = 1;   //打開定時器1
 EA = 1; //打開總中斷
 ET0 = 1;  //打開定時器0中斷
 ET1 = 1;  //打開定時器1中斷
}
//數(shù)碼管顯示子程序
void display()
{
 dula = 1;
 P0 = table_du[num];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = table_we[num1];
 wela = 0;
 dula = 1;
 P0 = table_du[num];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = table_we[num1];
 wela = 0;
 
 dula = 1;
 P0 = table_du[num];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = table_we[num1];
 wela = 0;
 
 dula = 1;
 P0 = table_du[num];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = table_we[num1];
 wela = 0;
 
 dula = 1;
 P0 = table_du[num];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = table_we[num1];
 wela = 0;
 
 dula = 1;
 P0 = table_du[num];
 dula = 0;
 P0 = 0xff;
 wela = 1;
 P0 = table_we[num1];
 wela = 0;
 
}
//中斷定時器0
void int_time0() interrupt 1
{
  TH0 = 0xB8;
  TL0 = 0x00;
  counter++;
  if(flag == 0)
  {
   if(counter % 10 == 0)//定時200毫秒
   {
    P1 = ~(1 << j++);//流水燈左移流動
    if(j == 8)
    {
     j = 0;
    }
   }
   }
   else
   {
    if(counter % 5 == 0)
   {
    //counter = 0;
     //流水燈右移流動
     P1 = ~(0x80 >> j++);
    FM = ~FM;
    if(j == 8)
    j = 0;
   }
   }
 
 
}
//中斷定時器1
void int_time1() interrupt 3
{
   TH1 = 0xFC;
  TL1 = 0x67;
  counter1++;
 
}
 

 

關(guān)閉窗口

相關(guān)文章