您的位置 首页 IOT

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

用STC单片机的定时器精确定时,做1秒、1分、1小时的定时任务。由于本人用的是11.0592的晶体,所以时间上不是很精确。如果对定时有精确要求…

用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中止外理

期望对我们有用!过错在所难免,诸位看官自己调试把

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/263833.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部