电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 华强电子网APP

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

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

来源:华强电子网 作者:华仔 浏览:393

标签:

摘要: 用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;

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

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

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67