龙空技术网

基于proteus的51单片机开发实例(11)-按键按下了几次?

老马识途单片机 417

前言:

此刻朋友们对“c语言proteus的操作顺序”大致比较珍视,看官们都想要分析一些“c语言proteus的操作顺序”的相关内容。那么小编同时在网摘上网罗了一些关于“c语言proteus的操作顺序””的相关文章,希望各位老铁们能喜欢,看官们快快来学习一下吧!

1. 基于proteus的51单片机开发实例(11)--按键按下了几次?

图1 按键次数检测电路

1.1. 实验目的

在前面的实例中,我们已经学习了51单片机定时器/计数器的定时功能(《基于proteus的51单片机开发实例(9)--定时器的定时模式》),我们已经知道到定时器/计数器既能够实现定时功能,也能够实现计数功能。那么在本实例我们来学习51单片机中定时器/计数器的计数功能。

1.2. 设计思路

在本实例中,我们通过在定时器/计数器的技术引脚接一个按键,利用51单片机定时器/计数器的计数功能,判断这个按键被按下了多少次,然后通过连接在单片机P1口的8个发光二极管来指示按键按下的次数:第一次按下按键,最低位的发光二极管点亮,第二次按键按下,倒数第二位的发光二极管点亮,第三次按下按键,最低位和倒数第二位的发光二极管都点亮........,以此类推。

1.3. 基础知识

前面我们已经了解了51单片机定时器/计数器的基本结构,本实例中继续来学习相关知识。

图2 51单片机定时器/计数器结构

51单片机定时器/计数器的使用步骤如下:

1、选择定时器/计数器的工作方式

利用TMOD寄存器中相关的控制位首先来选择使用的是定时器0还是定时器1,然后选择是工作于定时方式还是计数方式。一般情况下,在定时时长或计数数量较大的情况下,选择工作方式0或者工作方式1,因为工作方式0可定时或计数的时长是3位,方式1是16位,而方式2和方式3则只有8位。

2、设置计数初值

根据定时/计数要求设定计数初值。需要牢记的是51单片机定时器/计数器的计数特性是向上计数,即计数时只能从小数累加,直到数据大到超出计数范围产生溢出。然后将计算好的初值写入寄存器TH和TL。

初值的计算方法:

在定时器/计数器初始化过程中,要设置定时或计数的初始值需要进行计算。因为定时器/计数器是向上计数的,在计数溢出产生中断,因此初值不能是所需要的计数模值,而是要从最大计数值减去计数模值,这样得出的值才是真正需要的计数初值。假设计数器的最大计数值为M(根据工作方式不同,M的值可能是2的13次方,2的16次方,2的8次方),计算处置的公式如下。

图3 计数初值的计算公式

3、根据需要决定是否开放定时器/计数器中断。

4、启动定时器/计数器。通过设置运行控制寄存器TCON中的TR0或TR1为0或1,来启动/停止定时器/计数器。

在本实例中,是通过什么途径来识别按键按下的次数呢?

原来,当我们选择了定时器/计数器的计数功能后,单片机会自动去检测和识别相应的计数端口,对于51单片机来说,定时器/计数器0的计数端口是P3.4,定时器/计数器0的计数端口是P3.4,在计数模式下,这两个端口处于输入状态,它的一举一动都会被定时器/计数器捕捉,当然,关于这种怎么捕捉,我们在后面的实例会深入讲解。。

1.4. 电路设计

根据设计思路中的描述,本例的电路首先是在51单片机的计数端口连接一个按键,该端口平时为高电平,当按键按下,变为低电平。

单片机的P1口通过拉电流的方式连接8个发光二极管,这8个发光二极管通过不同的点亮顺序来指示按键按下的次数。

1.5. 程序设计

本实例的程序代码如下。

#include  <AT89X52.h>int main(void){  		TMOD = 0x05;//设置定时器/计数器的工作方式:定时器/计数器0工作在计数方式0	TH0 = 0x00;//	TL0 = 0x00;//计数初值设为0	TR0 = 0x01;//开启计数		P1 = 0xff;//先让发光二极管不亮	   while(1)         //	 {		 		 P1 = TL0;		//根据计数值的变化,相应LED点亮或熄灭   }}

我们可以看到,程序代码非常简单,只有寥寥数句,但是却能够很直观,形象的实现51单片机定时器/计数器的计数功能。

1.6. 实例仿真

编写程序代码,编译后生成hex文件载入到proteus的单片机中,然后开始仿真。我们可以看到,随着按键的按下,发光二极管按照不同的顺序点亮,可以很清晰地指示按键按下的次数。

视频加载中...

1.7. 总结

通过本实例我们不但学习了51单片机定时器/计数器的计数功能,更重要的是,加深了对定时和计数的理解,明白了计数初值的含义和计算方法,以及51单片机设置在计数模式是,还必须通过对应的计数端口来实现计数功能。(这个跟定时功能正好不同,定时功能是通过计算内部计数器的数值的增加来实现定时功能,不需要外部引脚上的计数信号)。

图4 定时器/计数器

标签: #c语言proteus的操作顺序