静下心来教书,潜下心来育人,专注电子入门技术,打造电子入门教学启蒙网,提供一站式服务!--刘昆山
科教电子制作
下载中心
电阻
电容
二极管
三极管
集成电路
电工基础
模拟电路
数字电路
高频电路
电子制作工具
芯片资料
电子实验
教学问答
PCB设计
PLC教程
家用电器
电子工艺
电视技术
书籍推荐
电子英语
电子视频教程
教育心理学
教学论文
教研论文
教学理论
教学管理
评语大全
职业教育
教育政策
名家思想
人际关系学
您的位置网站首页>>电子制作>>AT89C51制作的简单计数器
责任编辑:刘昆山

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

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

原理图:



原理图(点击看大图)

实物图:


实验板

程序如下:

#include <AT89X51.H>
#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
}

上一页: 半导体二极管及其基本电路
下 一页:
如何看懂电路图_基本常识
科教电子制作
邮购指南 教师吧淘宝店关于站长关于教师吧免责声明常见问题招聘人才友情链接给我留言
《教师吧》是一家帮助电子初学者快速入门电子技术的公益性教学网站,专门提供电子技术和单片机技术等入门型学习视频教程和电子制作套件。
我们主张电子初学者采用万能板焊接电子制作产品,因为这种“边学边做”的自学模式,不仅能锻炼焊接技术,还能提高识别电路图和分析原理图的能力。
辅以电子视频教程同步学习,必将为日后维修、设计电子产品打下坚实的基础,帮助您快速跨越电子入门者到电子工程师的门槛。
本站已经获得国家部门认证 国家ICP备案序号: 赣ICP备06004613号 业务客服QQ:56943772 E-mail:56943772@qq.com
电子爱好者群(1):66585281电子爱好者群(2):197874883电子爱好者群(3):29019650 电子爱好者群(4):14454755
版权归刘昆山所有©2005-2025 转载须经本人同意,否则后果自负!本站网址:http://www.jiaoshi8.com
站长:刘昆山 手机:13217080719(刘昆山)副站长:刘星慧  13755545457(刘星慧
欢迎您为本站提供资料,本站资料有的来自网络,如有版权争议,请通知本人,本人将删除之!