protues仿真器51单片机定时器内部定时方式

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模拟图如下:
protues仿真器51单片机定时器内部定时方式

上一篇:基于F407ZGT6的WS2812B彩灯驱动


下一篇:前端小tips:关键帧(小球练习)