历史上的今天
今天是:2024年12月19日(星期四)
2018年12月19日 | C51 定时器Timer使用,及产生1ms系统Tick
2018-12-19 来源:eefocus

GATE=0用TR0和TR1来控制T1和T0的启动,GATE=1则用外部中断来控制。
C/T为0表示定时器模式。为1表示计数器模式,对T0或T1的外部负跳变脉冲计数。
定时器初值的计算:
TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;
THX=(2^定时器位数 - (晶振频率/12) * 定时时间um) / 256;
TLX= (2^定时器位数 - (晶振频率/12) * 定时时间um) % 256;
注意:记得开总中断 EA = 1;
#include
#include
#include
#include
#include
static unsigned long SysTick = 0;
static unsigned long preTime = 0;
/***********************************************************
* 系统毫秒延时
*
************************************************************/
void mdelay(u8 m)
{
preTime = (unsigned long)(m + SysTick);
while(preTime > SysTick)
{
_nop_();
}
}
/***********************************************************
* 系统秒延时
*
************************************************************/
void sdelay(u8 s)
{
preTime = (unsigned long)((s * 1000) + SysTick);
while(preTime > SysTick)
{
_nop_();
}
}
void Timer0_Init(void)
{
TMOD |= 0x01; //定时/计数器工作在方式 1;
TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;
ET0 = 1; //允许定时/计数器0 中断
TR0 = 1; //启动定时/计数器0 中断
}
void main()
{
Timer0_Init();
while(1)
{
P0 = !P0;
}
}
/********************************************************************
*
* Timer0 用于产生系统时钟滴答 1ms为周期
*
********************************************************************/
void Timer0_ISR (void) interrupt 1
{
TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;
SysTick++;
}
Timer2使用:
/*-----------------------------------------------
名称:定时器2
论坛:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:通过定时让LED灯闪烁
------------------------------------------------*/
#include
sbit LED=P1^0; //定义LED端口
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void TIM2Inital(void)
{
RCAP2H = (65536-(12/12)*1000*60)/256;//晶振12M 60ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
ET2=1; //打开定时器中断
EA=1; //打开总中断
TR2=1; //打开定时器开关
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
TIM2Inital();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void TIM2(void) interrupt 5 using 1//定时器2中断
{
TF2=0;
LED=~LED; //指示灯反相
}
上一篇:C51 引脚功能定义,内部框图
史海拾趣
|
关于ARM 1. ARM-Advanced RISC Machines ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前, ...… 查看全部问答> |
|
我也是刚刚接触嵌入式Linux开发,感觉这门技术相对而言需要软件知识(操作系统、C编程)比硬件知识更多些。所以这几个星期来,作为一个自动化专业的学生,我深深感觉到自己软件知识的匮乏。但毕设又不能不按时完成,为了更快掌握嵌入式开发的知识, ...… 查看全部问答> |
|
1。linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做预备,mount 根文件系统有这么几种方式: 字串4 1)文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx ...… 查看全部问答> |
|
早前一个月时搞那个22寸宽屏LCD驱动。用VGA口。问题如下: 直接用以前的NK写进去,分辨率为800*600,开机后只显示3/4的屏,但字体什么的都很清楚,屏不闪。 修改注册表及相关分变率为:1024*600,这时开机,出现黑屏,但从串口可以看出来系统启动完 ...… 查看全部问答> |
|
地点在杭州,前期电话面试,后期候选人需去杭州面谈,产生费用由公司承担 Windows Mobile高级软件工程师 :alice.kou@e4u.cn/msn:alice007@live.cn/010-65888118-203 招聘人数5 主要责任:(年薪:10 ...… 查看全部问答> |
|
刚刚接手了份工作,要用到atmega128,可我手上还没有这款单片机的相关资料,只要关于PWM输出和串口通讯两部分的就行,谢谢大哥的无私分享了… 查看全部问答> |




