標題: 單片機數(shù)碼管和定時設計的程序設計 [打印本頁]

作者: 橙光豬    時間: 2020-12-26 15:11
標題: 單片機數(shù)碼管和定時設計的程序設計
利用動態(tài)掃描和定時器1在數(shù)碼管上顯示出從765432開始以1/10秒的速度往下遞減直至765398并保持顯示此數(shù),與此同時利用定時器0以500MS速度進行流水燈從上至下移動,當數(shù)碼管上數(shù)減到停止時,實驗板上流水燈也停止然后全部開始閃爍,3秒后(用T0定時)流水燈全部關閉、數(shù)碼管上顯示出"HELLO"。到此保持住。
設晶振頻率為12MHz。

單片機運行過程已經(jīng)上傳,以下是代碼
  1. #include<reg52.h>  //52單片機頭文件
  2. #include <intrins.h> //包含有左右循環(huán)移位子函數(shù)的庫
  3. #define uint unsigned int    //宏定義
  4. #define uchar unsigned char  //宏定義
  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. uchar code table[]={   //顯示數(shù)據(jù)編碼
  8. 0x3f,0x06,0x5b,0x4f,
  9. 0x66,0x6d,0x7d,0x07,
  10. 0x7f,0x6f,0x77,0x7c,
  11. 0x39,0x5e,0x79,0x71,
  12. 0x76,0x79,0x38,0x3f,0};
  13. uchar temp,t0,t1,bai,shi,ge,flag,flag1;
  14. uint shu;
  15. void init();              //函數(shù)聲明
  16. void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);
  17. void delay(uint z)     //延時子函數(shù)
  18. {
  19.         uint x,y;
  20.         for(x=z;x>0;x--)
  21.                 for(y=110;y>0;y--);
  22. }
  23. void main()          //主函數(shù)
  24. {
  25.         init();
  26.         while(1)
  27.         {
  28.                 if(flag1!=1)   //如果flagi不再等于1則顯示數(shù)據(jù)
  29.                         display(7,6,5,bai,shi,ge);
  30.                 else
  31.                         display(16,17,18,18,19,20);          //否則顯示hello
  32.         }
  33. }

  34. void init()          //初始化函數(shù)
  35. {
  36.         shu=432;
  37.         temp=0xfe;
  38.         P1=temp;
  39.         TMOD=0x11;
  40.         TH0=(65536-50000)/256;  //定時器初始化
  41.         TL0=(65536-50000)%256;
  42.         TH1=(65536-50000)/256;
  43.         TL1=(65536-50000)%256;
  44.         EA=1;
  45.         ET0=1;
  46.         ET1=1;
  47.         TR0=1;
  48.         TR1=1;
  49. }

  50. void timer0() interrupt 1   //定時器0中斷
  51. {
  52.         TH0=(65536-50000)/256;
  53.         TL0=(65536-50000)%256;
  54.         t0++;
  55.         if(flag!=1)          //flag不等于1時進行流水燈
  56.                 {
  57.                 if(t0==10)
  58.                         {
  59.                                 t0=1;
  60.                                 temp=_crol_(temp,1);
  61.                                 P1=temp;
  62.                         }
  63.                 }
  64.         else              //否則進行燈閃爍
  65.                 {
  66.                         if(t0%4==0)  //小燈每200毫秒變化一次
  67.                                 P1=~P1;
  68.                         if(t0==60)
  69.                         {
  70.                                 TR0=0;   //3秒后關閉定時器0,關閉燈,并置flag=1
  71.                                 P1=0xff;
  72.                                 flag1=1;
  73.                         }
  74.                 }        
  75. }

  76. void timer1() interrupt 3  //定時器1中斷函數(shù)
  77. {
  78.         TH1=(65536-50000)/256;
  79.         TL1=(65536-50000)%256;
  80.         t1++;
  81.         if(t1==2)
  82.                 {
  83.                         t1=0;
  84.                         shu--;
  85.                         bai=shu/100;
  86.                         shi=shu%100/10;
  87.                         ge=shu%10;
  88.                         if(shu==398)    //當?shù)?98時把原來T0中的數(shù)清除,重新加裁初值讓小燈閃爍
  89.                                 {
  90.                                         TR0=0;
  91.                                         TH0=(65536-50000)/256;
  92.                                         TL0=(65536-50000)%256;
  93.                                         TR0=1;
  94.                                         flag=1;
  95.                                         t0=0;
  96.                                         P1=0xff;
  97.                                         TR1=0;
  98.                                 }        
  99.                 }        
  100. }

  101. void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) //顯示子函數(shù)
  102. {
  103.         dula=1;
  104.                 P0=table[aa];
  105.                 dula=0;
  106.                 P0=0xff;
  107.                 wela=1;
  108.                 P0=0xfe;
  109.                 wela=0;
  110.                 delay(1);

  111.                dula=1;
  112.                 P0=table[bb];
  113.                 dula=0;
  114.                 P0=0xff;
  115.                 wela=1;
  116.                 P0=0xfd;
  117.                 wela=0;
  118.                 delay(1);

  119.        dula=1;
  120.                 P0=table[cc];
  121.                 dula=0;
  122.                 P0=0xff;
  123.                 wela=1;
  124.                 P0=0xfb;
  125.                 wela=0;
  126.                 delay(1);
  127.         dula=1;
  128.                 P0=table[bai];
  129.                 dula=0;
  130.                 P0=0xff;
  131.                 wela=1;
  132.                 P0=0xf7;
  133.                 wela=0;
  134.                 delay(1);

  135.                 dula=1;
  136.                 P0=table[shi];
  137.                 dula=0;
  138.                 P0=0xff;
  139.                 wela=1;
  140.                 P0=0xef;
  141.                 wela=0;
  142.                 delay(1);

  143.                 dula=1;
  144.                 P0=table[ge];
  145.                 dula=0;
  146.                 P0=0xff;
  147.                 wela=1;
  148.                 P0=0xdf;
  149.                 wela=0;
  150.                 delay(1);
  151. }
復制代碼








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1