protues仿真器51单片机定时器内部定时方式
项目场景:
在写程序时,用定时器0和定时器1发现定时器定时时间不一样
问题描述:
用定时器0写的延时函数(定时器)
void delay_ms(uint xms)
{
for(; xms > 0; xms--) {
TL1=0x18;
TH1=0xfc;
while(TF1==0);
TF1=0; //清零
}
}
用定时器1写的延时函数(定时器)
void delay_ms(uint xms)
{
for(; xms > 0; xms--) {
TL0=0x18;
TH0=0xfc;
while(TF0==0);
TF0=0; //清零
}
}
两者调用定时器运行的情况时间完全不一样
原因分析:
初步怀疑是protues中51单片机内部定时器0和定时器1用的是两种计数方式,即加法计数和减法计数。
解决方案:
完整代码:
/*******************************
********************************
******实验名称:定时器实验******
*******定时器时间为:1000us******
**********使用定时器T0**********
*********@author:小高***********
********date:2021.10.11 *********
********************************
*******************************/
#include <reg51.h>
#define uint unsigned int
void delay_ms(uint xms) //延时函数
{
for(; xms > 0; xms--) {
TL1=0x18; //(65536-1000)/256晶振12mhz
TH1=0xfc; //(65536-1000)%256
while(TF1==0);
TF1=0; //清零
}
}
void ledBr()
{
delay_ms(360);
P1 = (P1<<1|P1>>7);
P2 = (P2<<7|P2>>1);
}
void allInit() //初始化函数
{
TMOD=0x01; //工作模式1
TL1=0x18; //初始化
TH1=0xfc; //初始化
TR1=1; //打开定时器
P1 = 0x01;
P2 = 0x80;
}
void main()
{
allInit();
while(1) {
ledBr();
}
}
protues模拟图如下: