第二章 1位数码管计数器
前言
主要介绍数码管、 按键的应用, 并涉及单片机中断处理技术。
一、数码管的结构原理
数码管结构如下:
有两种数码管,根据接法不同分为共阴接法和共阳接法。 即 8 个管子公共端接地,称为共阴接法的数码管(common cathode);8 个管子公共端接电源,称为共阳接法的数码管(common anode)。
数码管的元器件名称“7SEG—”
由此,会有两种数码管的码段表:
字符 | 共阴顺序, 小数点暗 | 共阳顺序, 小数点暗 | |||
dp g f e d c b a | 十六进制数 | dp g f e d c b a | 十六进制数 | ||
0 | 00111111 | 3F | 11000000 | C0 | |
1 | 00000110 | 06 | 11111001 | F9 | |
2 | 01011011 | 5B | 10100100 | A4 | |
3 | 01001111 | 4F | 10110000 | B0 | |
4 | 01100110 | 66 | 10011001 | 99 | |
5 | 01101101 | 6D | 10010010 | 92 | |
6 | 01111101 | 7D | 10000010 | 82 | |
7 | 00000111 | 07 | 11111000 | F8 | |
8 | 01111111 | 7F | 10000000 | 80 | |
9 | 01101111 | 6F | 10010000 | 90 | |
A | 01110111 | 77 | 10001000 | 88 | |
B | 01111100 | 7C | 10000011 | 83 | |
C | 00111001 | 39 | 11000110 | C6 | |
D | 01011110 | 5E | 10100001 | A1 | |
E | 01111001 | 79 | 10000110 | 86 | |
F | 01110001 | 71 | 10001110 | 8E |
二、按键应用
按键的元件名称是 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;
}
总结
主要介绍数码管、 按键的应用, 并涉及单片机中断处理技术。该程序目前还是手动计数,下一章节在此基础上加上定时功能。
标签:计数,中断,void,数码管,proteus,keil5,定时,外部 From: https://blog.csdn.net/muling0504/article/details/136862977