标签:def sbit clu if语句 取反 http sign 手工 src
考试考完了,闲得无聊,正好手头有一块51学习板,捣鼓一下。控制任务如下:
P1.0 控制一个LED灯,亮0.5s,灭0.5s。
设计思路:这里我们只用定时器,不用软延时。51的定时器最多定时60ms,所以我们设置定时器每
50ms中断一次,通过在中断程序设置一个变量来统计中断次数,从而实现较长时间的定时。这里我们
是每500ms执行一次灯亮灯灭的动作,所以每10个中断等于500ms(50ms x 10)。第6行,全局变量
timer50msCount 就是中断次数。第19-23行,当timer50msCount 为10时,代表500ms时间到,把
P1.0 取反,动作一次。
这里有个繁琐的地方,定时器的初值需要手工计算。不过前人开发了一下小程序,直接拿过来用就可以了。
见下图。把自动生成代码中的第一行删掉就可以了。
下面是程序。
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit P10 = P1 ^ 0;
// 第 6 行
uchar timer50msCount = 0;
void Timer0Init(void);
void main()
{
EA = 1; // 开总中断
ET0 = 1; // 开定时器 0 中断
Timer0Init();
while (1)
{
// 每500ms允许if语句块中的程序
// 19 - 23 行
if (timer50msCount == 10)
{
timer50msCount = 0;
P10 = ~P10;
}
}
}
void Timer0Init(void) //50ms@11.0592MHz
{
TMOD &= 0xF0; // 设置定时器模式,这里为T0
TMOD |= 0x01; // 设置定时器工作方式1,为16为定时器
TL0 = 0x00; // 设置定时器低位初值
TH0 = 0x4C; // 设置定时器高位初值
TF0 = 0; // 清楚TF0溢出标志位
TR0 = 1; // 启动定时器0开始计时
}
// 定时器0中断子程序
void timer0Interrupt() interrupt 1
{
timer50msCount++;
// 每次中断时,定时器初值为0,需重新设置定时器初值,保持50ms
// 时间不变
TL0 = 0x00;
TH0 = 0x4C;
}
标签:def sbit clu if语句 取反 http sign 手工 src
原文地址:https://www.cnblogs.com/TomDing/p/9060181.html