
单片机的定时器0和定时器1为什么计数不同
3个回答
展开全部
问题有些不清楚,
要看是什么单片机
有些单片机的定时器1和定时器0的位数是不一样的
然后是各自设置的值,工作状态,特别是分频比
要看是什么单片机
有些单片机的定时器1和定时器0的位数是不一样的
然后是各自设置的值,工作状态,特别是分频比
展开全部
代码转自:《51单片机C语言创新教程》温子祺等编著。
/*实验名称:频率计
*描 述:频率计实验的硬件设计基本上就是LCD1602实验的硬件设计,
有点不同的是P3.4引脚与P3.5引脚要用杜邦线连接在一起,
形成一个最小型的频率计测试系统,
即P3.4引脚输出电平让P3.5引脚进行捕捉。
*作 者:温子祺
*修改日期:2010/5/4
*/
#include "stc.h"
#include "global.h"
#include "74LS164.h"
#include "LCD1602.h"
#define TIMER0_INITIAL_VALUE 5000 //5ms定时
UINT8 TimeCount=0; //定时计数
UINT8 Timer0IRQEvent=0; //T0定时中断事件
UINT8 Timer1OverFlowCnt=0; //T1计数溢出计数
UINT8 Time1SecEvent=0; //定时1秒事件
UINT16 FreqCount=0;
UINT8 LCDString[16]; //LCD字符串缓冲区
UINT8 LCDStringTemp[16]; //临时保存LCD字符串
UINT8 LCDPrintfLength; //LCD显示数据长度
/*************************************************************
* 函数名称:TimerInit
* 输 入:无
* 输 出:无
* 说 明:定时器初始化
**************************************************************/
void TimerInit(void)
{
TH1 = 0;
TL1 = 0;
TH0 = (65536-TIMER0_INITIAL_VALUE)/256;
TL0 = (65536-TIMER0_INITIAL_VALUE)%256; //定时5MS
TMOD = 0x51;
}
/*************************************************************
* 函数名称:Timer0Start
* 输 入:无
* 输 出:无
* 说 明:定时器0启动
**************************************************************/
void Timer0Start(void)
{
TR0 = 1;
ET0 = 1;
}
/*************************************************************
* 函数名称:Timer0Stop
* 输 入:无
* 输 出:无
* 说 明:定时器0停止
**************************************************************/
void Timer0Stop(void)
{
TR0 = 0;
ET0 = 0;
}
/*************************************************************
* 函数名称:Timer1Start
* 输 入:无
* 输 出:无
* 说 明:定时器1启动
**************************************************************/
void Timer1Start(void)
{
TR1 = 1;
ET1 = 1;
TH1=TL1=0;
}
/*************************************************************
* 函数名称:Timer1Stop
* 输 入:无
* 输 出:无
* 说 明:定时器1停止
**************************************************************/
void Timer1Stop(void)
{
TR1 = 0;
ET1 = 0;
}
/*************************************************************
* 函数名称:PortInit
* 输 入:无
* 输 出:无
* 说 明:IO口初始化
**************************************************************/
void PortInit(void)
{
P0=P1=P2=P3=0xFF;
}
/*************************************************************
* 函数名称:main
* 输 入:无
* 输 出:无
* 说 明:函数主体
**************************************************************/
void main(void)
{
PortInit();
TimerInit();
Timer0Start();
Timer1Start();
LCD1602Init();
EA=1;
while(1)
{
if(Timer0IRQEvent)
{
Timer0IRQEvent=0;
TimeCount++;
if(TimeCount>=200) //定时1S到达
{
TimeCount=0;
Timer0Stop(); //停止T0
Timer1Stop(); //停止T1
FreqCount=((TH1<<8)|TL1)+Timer1OverFlowCnt*65536;//计算总计数值
Timer1OverFlowCnt=0;
itoa(FreqCount,LCDString,10); //计数值变为字符串
LCD1602ClearScreen(); //LCD1602清屏
LCD1602PrintfString(2,0,"Now Frequency");//LCD1602打印字符串
LCDPrintfLength=LCD1602PrintfString(3,1,LCDString);//LCD1602打印字符串
LCD1602PrintfString(LCDPrintfLength+3,1,"HZ");//LCD1602打印字符串
Timer0Start();//启动T0
Timer1Start();//启动T1
}
}
}
}
/*************************************************************
* 函数名称:Timer0IRQ
* 输 入:无
* 输 出:无
* 说 明:定时器0中断服务函数
**************************************************************/
void Timer0IRQ(void) interrupt 1
{
ET0 = 0;
TH0 = (65536-TIMER0_INITIAL_VALUE)/256;
TL0 = (65536-TIMER0_INITIAL_VALUE)%256; //定时1MS
Timer0IRQEvent=1;
ET0 = 1;
P3_4=~P3_4;
}
/*************************************************************
* 函数名称:Timer1IRQ
* 输 入:无
* 输 出:无
* 说 明:定时器1中断服务函数
**************************************************************/
void Timer1IRQ(void) interrupt 3
{
ET1=0;
Timer1OverFlowCnt++; //计数溢出自加1
ET1=1;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一样的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询