STC11F04单片机定时器模拟多任务程序

用STC单片机的定时器精确定时,做1秒、1分、1小时的定时任务。

由于本人用的是11.0592的晶体,所以时间上不是很精确。如果对定时有精确要求的,请用32.768M的晶振。

串口输出采用 printf函数输出。

#include"reg51.h"

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


unsigned int tick;

int hh,mm,ss; //时:分:秒
char putchar (unsigned char i)
{
    ES     =   0;  //关串口中断
    TI     =   0;  //清零串口发送完成中断请求标志
    SBUF   =   i;
    while(TI ==0); //等待发送完成
    TI     =   0;  //清零串口发送完成中断请求标志
    ES     =   1;  //允许串口中断
return SBUF;
}

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

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

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

//0.1ms = 100us
void Timer0(void) interrupt 1 using 1 //定时器0中断外理
{
   TR0=0;
   TH0=(65536-2000)/256; 
   TL0=(65536-2000)%256; 
    
tick++;     //计数值+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小时定时任务
         }
        Task_1m(); //1分钟定时任务
  }
  Task_1s();//1s定时任务
}
TR0=1;
}

void main()
{
  SCON=0x50; //0101,0000 8位可变波特率,无奇偶校验位
  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;    //开总中断 
  printf("SystemStart...\r\n");
  
  while(1)
  {
    _nop_();
  }
}


程序运行后结果如图:



代码详解:

(1)串口波特率计算

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

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

     由于采用9600波特率和计算机通信,所以采用9600

(2)串口输出为什么可以用“printf"函数?

      例如:   printf("S=[%d:%d:%d]\r\n",hh,mm,ss); 可以很方便的输出要的数据

     原因是要自己实现printf的底层通信代码,即在你的代码里加入

       

   这个函数的原型定义在:#include "stdio.h" 里,感兴趣的朋友,还可以把其他函数也实现。这样C51编程就可以和计算机上的C语言编程类似了。


  (3)定时器初值说明:

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

(4) 定时任务


   任务的调用在定时器中断里,详细见定时器中断。

         void Timer0(void) interrupt 1 using 1 //定时器0中断外理


希望对大家有用!错误在所难免,诸位看官自己调试把。。。。

呵呵!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值