1、本例使用定时器/计数器T0的外部计数方式统计计按键次数,并将结果送P1口的8位LED显示,程序实现每按一次按键,按键次数加1,
2、在keil c51中新建工程ex44,编写如下程序代码,编译并生成ex44.hex文件
#include <reg51.h> //包含头文件
unsigned char counter; //全局变量,定义按键次数
//
void main(void)
{
counter = 0; //按键次数清0
P1 = 0xff; //关闭所有LED
TMOD = 0X06; //使用定时器T0的计数工作方式,工作于工作方式2
TH0 = 256-1; //定时器T0的高8位赋值,计数值为1
TL0 = 256-1; //定时器T0的低8位赋值
ET0 = 1; //允许计数中断
EA = 1; //开总中断
TR0 = 1; //启动计数方式工作
while(1)
{
P1 = counter; //按键次数送P1口
}
}
//
void main(void)
{
counter = 0; //按键次数清0
P1 = 0xff; //关闭所有LED
TMOD = 0X06; //使用定时器T0的计数工作方式,工作于工作方式2
TH0 = 256-1; //定时器T0的高8位赋值,计数值为1
TL0 = 256-1; //定时器T0的低8位赋值
ET0 = 1; //允许计数中断
EA = 1; //开总中断
TR0 = 1; //启动计数方式工作
while(1)
{
P1 = counter; //按键次数送P1口
}
}
//T0计数中断服务函数
void counter0(void) interrupt 1 using 0
{
counter++; //按键次数加1
}
void counter0(void) interrupt 1 using 0
{
counter++; //按键次数加1
}
3、在proteus中新建仿真文件ex44.dsn,电路原理图如下所示:
5、将ex44.hex文件载入at89c51中,启动仿真,按动按键,观察程序运行结果。下图是按动三次按键后的运行结果
6、可以看到,程序运行后,没有按键按下时,所有LED都被点亮了(但是程序开始我们设置了一句P1=0xff,关闭了所有LED,想一下,这是为什么?)
仔细观察当按动按键时,8位LED的变换情况,是否能够做出正确解释?