proteus+keil5仿真学习笔记(第二章 1位数码管计数器)

第二章 1位数码管计数器


前言

主要介绍数码管、 按键的应用, 并涉及单片机中断处理技术。

一、数码管的结构原理

数码管结构如下:

有两种数码管,根据接法不同分为共阴接法和共阳接法。 即 8 个管子公共端接地,称为共阴接法的数码管(common cathode);8 个管子公共端接电源,称为共阳接法的数码管(common anode)。

数码管的元器件名称“7SEG—”

由此,会有两种数码管的码段表:

字符共阴顺序, 小数点暗共阳顺序, 小数点暗
dp  g  f  e  d  c  b  a十六进制数dp  g  f  e  d  c  b  a十六进制数
0001111113F11000000C0
1000001100611111001F9
2010110115B10100100A4
3010011114F10110000B0
401100110661001100199
5011011016D1001001092
6011111017D1000001082
7000001110711111000F8
8011111117F1000000080
9011011116F1001000090
A01110111771000100088
B011111007C1000001183
C001110013911000110C6
D010111105E10100001A1
E01111001791000011086
F0111000171100011108E

二、按键应用

按键的元件名称是 BUTTON, 它的一端接单片机的引脚, 另一端接地。

可通过模式工具栏“A”增加提示文字。

仿真时可能会出现这样的问题:按键button如果在仿真前是闭合的,仿真时一直是闭合的 ,仿真前是断开的仿真时一直是断开的,按下去没有作用。

其实是因为:未运行前点击右上小圆点使按键闭合,右键属性再确定,运行时就是常闭的;按键默认是常开的,从常闭转到常开的操作同上。

三、中断处理

51单片机中断,可以参考https://blog.csdn.net/qq_51029592/article/details/119351347详细学习。本文就程序简要介绍。

89C52 单片机共有5个中断源,2个外部中断,2个定时/计数中断,和一个串口中断(用于通信)。外部中断的引脚是P3.2、P3.3,定时/计数的引脚是P3.4、P3.5,串口通信中断引脚是P3.6、P3.7。

外部中断至少需要用到两种寄存器:定时/外部中断控制寄存器TCON,和中断允许控制寄存器IE。

先看定时/外部中断控制寄存器TCON:

1)高4位用于定时器控制(D4~D7);

2)底4位用于外部中断控制(D0~D3);

3)IT0:外部中断0类控制,通过软件设置或清除;

4)IE0:外部边沿触发中断0类控制,由片内硬件自动清零;

5)IT1:外部中断1类控制,性质同IT0;

6)IE1:外部边沿触发中断1类控制,性质同IE0。

再看中断允许控制器IE:

1)EX0:外部中断0控制位(EX0=1允许中断,EX0=0禁止中断);

2)ET0:定时/计数T0中断控制位(ET0=1允许,ET0=0禁止);

3)EX1,ET1:外部中断1和定时/计数T1中断控制位,性质同EX0、ET0。

4)ES:串口中断控制位,ES=1允许,ES=0禁止;

5)EA:中断总控制位,EA=1开发,EA=0禁止;

中断处理编号
中断编号中断源
0外部中断0
1定时/计数0溢出中断
2外部中断1
3定时/计数1溢出中断
4串行口中断

定义中断服务函数

函数类型  函数名(形式参数)[interrupt n] [using m]

n:中断编号

m:寄存器组号

eg:void intersvr0(void) interrupt 0 using 1

四、程序设计及仿真

proteus电路

程序

该程序可以实现1~9的手动计数

#include < reg51.h >//单片机头文件
unsigned char code Tab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管码段表
unsigned char p=0;//计数变量   
sbit S1=P3^2;//定义按钮S1
sbit S2=P3^3;//定义按钮S2
void delays(void)//延时子程序
{
	int i,j;
	for(i=300;i>0;i--)
	for(j=100;j>0;j--);
}

void main(void)//主程序
{
	while(1)//无限循环
	{
		P0=Tab[p];//输出码段表
	if(S1==0)//如果S1按下
	{
		p++;//计数加1
		delays();//延时
		if(p>9)//如果计数大于9
			p=9;//计数等于9
	}
	if(S2==0)//如果S2按下
	{
		p--;//计数减1
		delays();//延时
		if(p<1)//如果计数小于1
			p=1;//计数等于1
	}
}
}

主程序的主要工作就是判断按钮是否按下,并增加或减少数值来实现计数器的功能。如果在此基础上增加其他功能,就会增加程序的复杂度。因此,我们使用中断处理来简化程序。

#include < reg51.h >  
#define uchar unsigned char//简化变量定义
unsigned char code Tab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char p=1;
void delays(void)
{
	uchar i;
	for(i=300;i>0;i--);
}
void main(void)
{
	EA=1;//开总允许开关
	IT0=1;EX0=1;//开外部中断0和外部中断0允许分开关
	IT1=1;EX1=1;//开外部中断1和外部中断1允许分开关
	while(1)
	{
		P0=Tab[p];
		delays();
	}
}
void intersvr0(void) interrupt 0 using 1//外部中断0处理子程序
{
	p++;
	if(p>9)
		p=9;
}
void intersvr1(void) interrupt 2 using 1//外部中断1处理子程序
{
	p--;
	if(p<1)
	p=1;
}

总结

主要介绍数码管、 按键的应用, 并涉及单片机中断处理技术。该程序目前还是手动计数,下一章节在此基础上加上定时功能。

  • 33
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值