求单片机定时器简单程序(C语言)详解。不胜感激~
发布网友
发布时间:2022-04-22 16:49
我来回答
共3个回答
热心网友
时间:2023-07-22 04:43
/********
//P1.0波形为:
//1、10ms为周期的方波或持续的高、低电平(与Flag、P1.0初始值有关),持续2秒。
//2、持续的高、低电平或10ms为周期的方波(与Flag、P1.0初始值有关),持续2秒。
//3、重复1、2步骤。
*********/
#include <AT89X51.H>
unsigned int t02s;
unsigned char t05ms;
bit flag;
void main(void)
{
TMOD=0x01; //初始化定时器。
//可以对照单片机PDF相应章节,按位对比。
//此处设置定时器0工作于“16 位定时器/ 计数器,TL0、TH0 全用”模式。
TH0=(65536-500)/256; //初始化定时/计数器高字节。
TL0=(65536-500)%256; //初始化。。。。。。低字节。
TR0=1; //启动定时器0。
//以下两句开启定时器中断,缺一不可。
ET0=1; //允许定时器0中断。
EA=1; //开启全局中断。
while(1); //循环,整个程序交由定时中断控制。
}
//此处为定时器中断子程序,每次定时器溢出,进入此段程序。
//根据参数定义,每5ms中断一次。
//定时器中断后,计数不停止,但是需要重新初始化定时/计数器。
void t0(void) interrupt 1 using 0
{
//重新“初始化定时/计数器”高、低字节。
TH0=(65536-500)/256;
TL0=(65536-500)%256;
//每次中断,t02s 加 1。
t02s++;
//增加400次后(5ms × 400 = 2s),flag标志取反。
if(t02s==400)
{
t02s=0;
flag=~flag;
}
//若中断时flag标志为0,P1.0口取反。
if(flag==0)
{
P1_0=~P1_0;
}
}
热心网友
时间:2023-07-22 04:43
这是定时器程序。interrupt 1代表0号定时器;
关注这三句话TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;
第一句是工作模式设置,后面两句是定时器初值设置,可以根据初值和工作模式计算出每次进入中断程序是多少时间,书上有公式的。自己算一下,很容易的。
另外建议,在中断程序的首尾分别增加关中断和开中断。
热心网友
时间:2023-07-22 04:44
TMOD,TH0,TL0,TR0,ET0,EA,P1_0
这些都是芯片中的寄存器, 可以打开头文件AT89X51.H,查看说明。
void t0(void) interrupt 1 using 0 当中断1处为0电位时,触发这个中断程序。