datasheet

AT89C51制作的简单计数器

2016-09-30来源: eefocus关键字:AT89C51  计数器
       网上好友大侠画了一个计数器的电路图让我帮忙写个软件,抽空写了一个。他做好了电路我就把程序给他烧写实验,稍微修改后达到他的要求。

  图中可以看到本制作的主要核心电路是用AT89C51组成的按键取值电路,S3S4分别控制计数值的加减。数码管使用的是共阳极通过3906控制。

  这个计数器主要用于对键的按键次数计数,用于鼠标中的微按钮或其它按钮做QC测试用。所以在软件中用了取两次定时中断的键值做比较以达到简单防抖动和取健值的目的。读者朋友可以自行修改程序以适合自己的电路。本计数器的计数范围为0-999999,最大的频率为50Hz,当然这些参数都可以根据需要调整。程序使用的是汇编延时程序,可以改用C写,没有任何关系只是我偷懒从旧的程序中拷过来用。

#include
#define Key_UP P3_6 //上调
#define Key_DOWN P3_7 //下调
#define LED P0 
#define LED1 P2_2 //LED控制
#define LED2 P2_3 //LED控制
#define LED3 P2_4 //LED控制
#define LED4 P2_5 //LED控制
#define LED5 P2_6 //LED控制
#define LED6 P2_7 //LED控制

unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//共阳0-9的LED笔划
static unsigned char bdata Key; //可位寻址的状态寄存器
sbit NewKeyUP = Key ^ 0; 
sbit NewKeyDOWN = Key ^ 1;
sbit OldKeyUP = Key ^ 2;
sbit OldKeyDOWN = Key ^ 3; 
static unsigned long data Count;
static unsigned char LEDN[6];

void main(void)
{
void Delay_510(void);

Count = 0; //初始化变量
Key = 0;

EA = 1; //允许CPU中断
ET0 = 1; //定时器0中断打开
TMOD = 0x1; //设定时器0为模式1,16位模式
TH0=0xB1;
TL0=0xDF; //设定时值为20000us(20ms)
TR0 = 1; //开始定时
while(1);
}

//定时器0中断外理中键扫描和显示
void KeyAndDis_Time0(void) interrupt 1 using 2
{
TH0=0xB1;
TL0=0xDF; //设定时值为20000us(20ms)

NewKeyUP = Key_UP; //取新的键值
NewKeyDOWN = Key_DOWN;

if (!OldKeyUP && NewKeyUP) //键放开时,这里的中断为20ms左右(定时值非自动装载所以多于20ms)
Count++;
if (!OldKeyDOWN && NewKeyDOWN)
Count--; //这里Conut为int 没有做负数等处理,有需要自行加上
if (Count>999999) 
Count = 999999;
LEDN[5]=Count/100000;
LEDN[4] = (Count-100000*(long)LEDN[5])/10000;
LEDN[3] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4])/1000;
LEDN[2] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3])/100;
LEDN[1] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2])/10;
LEDN[0] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2]-10*(long)LEDN[1]);

LED=LEDDis[LEDN[5]];
LED6 = 0;
Delay_510();
LED6 = 1;

LED=LEDDis[LEDN[4]];
LED5 = 0;
Delay_510();
LED5 = 1;

LED=LEDDis[LEDN[3]];
LED4 = 0;
Delay_510();
LED4 = 1;

LED=LEDDis[LEDN[2]];
LED3 = 0;
Delay_510();
LED3 = 1;

LED=LEDDis[LEDN[1]];
LED2 = 0;
Delay_510();
LED2 = 1;

LED=LEDDis[LEDN[0]];
LED1 = 0;
Delay_510();
LED1 = 1;

OldKeyUP = NewKeyUP;
OldKeyDOWN = NewKeyDOWN;
}

void Delay_510(void) //延时510微秒
{
#pragma asm
MOV R0,#7DH
MOV R1,#02H
TSR1:
DJNZ R0,TSR1
MOV R0,#7DH
DJNZ R1,TSR1
#pragma endasm
}

关键字:AT89C51  计数器

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016093029985.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机+带字库液晶12864+DS1302数字时钟C源程序
下一篇:图解S51并口下载线的制作

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51通过IO口模拟IIC实现AT24C02的读写

变化等待下一位数据的到来        delay_us(5);     }       return dat;}(3)AT24C02实现:at24c02.h:#ifndef _AT24C02_H#define _AT24C02_H#include "stc51.h"#define IIC_WADDR   0XA0#define IIC_RADDR   0XA1void AT24C02_Init(void);void At24c02_Write_Byte(uchar
发表于 2019-01-14
51通过IO口模拟IIC实现AT24C02的读写

STM32快速读写AT24C16 代码 模拟I2C

本帖只适用AT24C16及以下的芯片,AT24C32及以上的芯片读写方式不一样,故不适用!!!如果你的代码可以正常读写24C01/02,直接拿来读取24C16是可以的,但是只能读取256字节。AT24C16与AT24C01/02/04/08 不同,它引脚的A2,A1,A0是无效的,也就是它没有自己独立的地址,总线上只能挂一个AT24C16设备。AT24C16总共2048字节,分为128页,每页16字节,地址范围是0~2047。128页只需要7位地址,分为高3位和低4位,高3位在设备地址中,低4位在字节地址中。设备地址:1010+页地址高3位+读写方向(1:读  0:写)字节地址:页地址高4位+4位页内偏移地址例如读写地址
发表于 2019-01-07
STM32快速读写AT24C16 代码 模拟I2C

单片机的两种型号区别 AT89C51和AT89C52的区别

单片机的两种型号。主要区别是容量不同。at89c51最多支持4KB的程序,at89c52则最多支持8KB的程序。AT89C51简介:AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,AT
发表于 2018-11-21

C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)

/* 名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16)说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号 (如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。 *///定义I2C相关变量sbit     SCL=P2
发表于 2018-07-21

C51IO口模拟I2C总线驱动AT24C16 (EEPROM部分)

/* 名称:C51IO口模拟I2C总线驱动AT24C16 说明:关于EEPROM,即这里的AT24C16是一个特殊形式的FLASH存储器,不过其容量一般较少。比较适合于存储少量的数据。AT24C16的通信接口是标准的I2C通信,即我们需要根据I2C通信协议来操纵EEPROM设备。 关于AT24C16的的各种操作,这里就不细讲了,简单介绍一下。(1)、主机向AT24C16写一个字节:首先需要发送设备地址,然后发送需要访问的存储器地址。然后在发送要写入的数据。这里省略了开始、结束和确认等信号的产生。(2)、指定页写入n个字节:和(1)的基本操作很类似。不同的是可以连续写入n个数据。这里要小注意一点的就是,写入的数据
发表于 2018-07-21

以AT24C02为例的IIC通信协议

,传输距离达到15m;兼容不同电压等级的器件,工作温度范围宽。1、主设备和从设备主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件,在总线上主和从、发和收的关系是不恒定的,而取决于此时数据传送方向。系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型(比如说AT24C02就是1010),由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。2、数据传输发送到SDA上的每个字节必须的8位,每次传输可以发送的字节数量不受
发表于 2018-07-15

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved