51单片机,上电后在静态数码管上显示0-9秒的计时,定时器采用T1定时器的方式1。按下按键KEY1,复位,秒值清零,清零后依旧继续计时,KEY1必须采用外部中断方式。按下按键KEY2,暂停计时或从暂停状态恢复计时,KEY2必须采用外部中断方式。请按要求写出代码并且写出各模块连接接口
时间: 2024-03-09 22:46:41 浏览: 92
51单片机的定时器和外部中断的程序
5星 · 资源好评率100%
好的,以下是51单片机的代码实现和各模块连接接口的介绍。
代码实现:
```
#include<reg51.h>
sbit KEY1 = P3^2; // 定义按键1连接的IO口
sbit KEY2 = P3^3; // 定义按键2连接的IO口
sbit LED = P2^0; // 定义LED连接的IO口
unsigned char code LED_TAB[] = { // 数码管显示的数字表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned char second = 0; // 秒计数器
unsigned char flag = 1; // 计时标志位,1为计时中,0为暂停
void Timer1() interrupt 3 { // 定时器1中断服务函数
TH1 = 0xFC; // 定时器初值
TL1 = 0x18;
if(flag) { // 如果计时标志位为1,才进行计时
second++; // 秒计数器加1
if(second > 9) second = 0; // 秒计数器最大为9
P1 = LED_TAB[second]; // 在数码管上显示秒数
}
}
void Key1() interrupt 0 { // 外部中断0服务函数
if(!KEY1) second = 0; // 如果按键1被按下,秒数清零
}
void Key2() interrupt 2 { // 外部中断1服务函数
if(!KEY2) flag = !flag; // 如果按键2被按下,计时标志位取反
}
void main() {
TMOD = 0x10; // 定时器1工作模式为方式1
TH1 = 0xFC; // 定时器初值
TL1 = 0x18;
ET1 = 1; // 允许定时器1中断
EA = 1; // 开启总中断
TR1 = 1; // 启动定时器1
EX0 = 1; // 允许外部中断0
IT0 = 1; // 外部中断0触发方式为下降沿触发
EX1 = 1; // 允许外部中断1
IT1 = 1; // 外部中断1触发方式为下降沿触发
while(1) {
if(!flag) LED = ~LED; // 如果计时标志位为0,LED闪烁
}
}
```
各模块连接接口:
- 数码管:将数码管的8个引脚依次连接到单片机的P1口(P1.0~P1.7)。
- 按键1:将按键1的一端连接到单片机的P3.2口,另一端连接到GND上,同时需要使用10kΩ电阻上拉。
- 按键2:将按键2的一端连接到单片机的P3.3口,另一端连接到GND上,同时需要使用10kΩ电阻上拉。
- LED灯:将LED的一端连接到单片机的P2.0口,另一端连接到GND上,同时需要使用220Ω电阻限流。
阅读全文