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用的是两种计数方式,即加法计数和减法计数。
解决方案:
完整代码:
#include <reg51.h>
#define uint unsigned int
void delay_ms(uint xms)
{
for(; xms > 0; xms--) {
TL1=0x18;
TH1=0xfc;
while(TF1==0);
TF1=0;
}
}
void ledBr()
{
delay_ms(360);
P1 = (P1<<1|P1>>7);
P2 = (P2<<7|P2>>1);
}
void allInit()
{
TMOD=0x01;
TL1=0x18;
TH1=0xfc;
TR1=1;
P1 = 0x01;
P2 = 0x80;
}
void main()
{
allInit();
while(1) {
ledBr();
}
}
protues模拟图如下:
|