<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC11F04單片機(jī)定時(shí)器模擬多任務(wù)程序

          STC11F04單片機(jī)定時(shí)器模擬多任務(wù)程序

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          用STC單片機(jī)的定時(shí)器精確定時(shí),做1秒、1分、1小時(shí)的定時(shí)任務(wù)。

          由于本人用的是11.0592的晶體,所以時(shí)間上不是很精確。如果對(duì)定時(shí)有精確要求的,請(qǐng)用32.768M的晶振。

          本文引用地址:http://www.ex-cimer.com/article/201611/318661.htm

          串口輸出采用 printf函數(shù)輸出。

          #include"reg51.h"

          #include "stdio.h"
          #include"intrins.h" //_nop_()

          unsigned int tick;

          int hh,mm,ss; //時(shí):分:秒
          char putchar (unsigned char i)
          {
          ES = 0; //關(guān)串口中斷
          TI = 0; //清零串口發(fā)送完成中斷請(qǐng)求標(biāo)志
          SBUF = i;
          while(TI ==0); //等待發(fā)送完成
          TI = 0; //清零串口發(fā)送完成中斷請(qǐng)求標(biāo)志
          ES = 1; //允許串口中斷
          return SBUF;
          }

          void Task_1s()
          {
          printf("S=[%d:%d:%d]rn",hh,mm,ss);
          }

          void Task_1m()
          {
          printf("M=[%d:%d:%d]rn",hh,mm,ss);
          }

          void Task_1h()
          {
          printf("H=[%d:%d:%d]rn",hh,mm,ss);
          }

          //0.1ms = 100us
          void Timer0(void) interrupt 1 using 1//定時(shí)器0中斷外理
          {
          TR0=0;
          TH0=(65536-2000)/256;
          TL0=(65536-2000)%256;

          tick++; //計(jì)數(shù)值+1
          if(tick>999) //加到10次即1秒
          {
          tick=0;
          ss++;
          if(ss>59){
          mm++;
          ss=0;
          if(mm>59){
          hh++;
          mm=0;
          if(hh>11){
          hh=0;
          }
          Task_1h();//1小時(shí)定時(shí)任務(wù)
          }
          Task_1m(); //1分鐘定時(shí)任務(wù)
          }
          Task_1s();//1s定時(shí)任務(wù)
          }
          TR0=1;
          }

          void main()
          {
          SCON=0x50;//0101,0000 8位可變波特率,無(wú)奇偶校驗(yàn)位
          TMOD=0X21;
          TH1=TL1=-(11059200L/12/32/9600);
          TR1=1;
          tick=0;
          hh=0;
          mm=0;
          ss=0;
          TH0=(65536-2000)/256;
          TL0=(65536-2000)%256;
          TR0=1;
          ET0=1;
          ES=1; //允許串口中斷
          EA=1; //開(kāi)總中斷
          printf("SystemStart...rn");

          while(1)
          {
          _nop_();
          }
          }

          程序運(yùn)行后結(jié)果如圖:


          代碼詳解:

          (1)串口波特率計(jì)算

          TH1=TL1=-(11059200L/12/32/9600);

          由于采用11.0592晶振,所以這里是11059200L

          由于采用9600波特率和計(jì)算機(jī)通信,所以采用9600

          (2)串口輸出為什么可以用“printf"函數(shù)?

          例如: printf("S=[%d:%d:%d]rn",hh,mm,ss); 可以很方便的輸出要的數(shù)據(jù)

          原因是要自己實(shí)現(xiàn)printf的底層通信代碼,即在你的代碼里加入


          這個(gè)函數(shù)的原型定義在:#include "stdio.h" 里,感興趣的朋友,還可以把其他函數(shù)也實(shí)現(xiàn)。這樣C51編程就可以和計(jì)算機(jī)上的C語(yǔ)言編程類(lèi)似了。

          (3)定時(shí)器初值說(shuō)明:

          TH0=(65536-2000)/256; 高8位
          TL0=(65536-2000)%256; 低8位

          (4) 定時(shí)任務(wù)


          任務(wù)的調(diào)用在定時(shí)器中斷里,詳細(xì)見(jiàn)定時(shí)器中斷。

          void Timer0(void) interrupt 1 using 1//定時(shí)器0中斷外理

          希望對(duì)大家有用!錯(cuò)誤在所難免,諸位看官自己調(diào)試把



          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();