采用外部中断编写程序控制数码管显示从00到99,S1控制加计数,S2控制减计数
时间: 2023-08-21 14:02:38 浏览: 156
单片机控制秒表显示时间为00-99(每秒自动加1)-暂停-复位.doc
好的,这里我提供一种基于51单片机和共阴数码管的实现方法。具体步骤如下:
1. 硬件连接
按键S1和S2分别连接到P3.2和P3.3引脚,数码管的a到g分别连接到P0.0到P0.6引脚,共阴端连接到GND。
2. 中断服务程序
中断服务程序主要用于处理S1和S2按键的中断请求,同时更新计数值。具体代码如下:
```
void key_isr(void) interrupt 0
{
if (S1 == 0) // S1按下,计数器加1
{
count++;
if (count > 99)
count = 0;
}
else if (S2 == 0) // S2按下,计数器减1
{
count--;
if (count < 0)
count = 99;
}
}
```
3. 主程序
主程序主要用于初始化系统和数码管,并循环扫描数码管。具体代码如下:
```
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 50000) / 256; // 定时器初值,50ms
TL0 = (65536 - 50000) % 256;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EX0 = 1; // 开启外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
EA = 1; // 开启总中断
while (1)
{
// 数码管扫描显示计数值
P0 = table[count / 10];
P2 = 0x01; // 第一个数码管
delayms(5);
P2 = 0x00;
P0 = table[count % 10];
P2 = 0x02; // 第二个数码管
delayms(5);
P2 = 0x00;
}
}
```
其中,table数组存储了0到9的数字码表,delayms函数用于延迟一定时间以消除闪烁。
4. 完整代码
```
#include <reg51.h>
sbit S1 = P3^2; // S1按键
sbit S2 = P3^3; // S2按键
unsigned char code table[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90}; // 数字码表
unsigned char count = 0; // 计数器
void delayms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 110; j++);
}
void key_isr(void) interrupt 0
{
if (S1 == 0) // S1按下,计数器加1
{
count++;
if (count > 99)
count = 0;
}
else if (S2 == 0) // S2按下,计数器减1
{
count--;
if (count < 0)
count = 99;
}
}
void timer0_isr(void) interrupt 1
{
TH0 = (65536 - 50000) / 256; // 定时器初值,50ms
TL0 = (65536 - 50000) % 256;
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 50000) / 256; // 定时器初值,50ms
TL0 = (65536 - 50000) % 256;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EX0 = 1; // 开启外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
EA = 1; // 开启总中断
while (1)
{
// 数码管扫描显示计数值
P0 = table[count / 10];
P2 = 0x01; // 第一个数码管
delayms(5);
P2 = 0x00;
P0 = table[count % 10];
P2 = 0x02; // 第二个数码管
delayms(5);
P2 = 0x00;
}
}
```
注意,这只是一个简单的例子,仅供参考。在实际应用中,需要根据具体情况进行调整和优化。
阅读全文