利用keil编写基于51单片机的程序要求1、 数码管显示自己学号后2位 - ( 数码管74HC138位选管脚P2.2,P2.3, P2.4)-(数码管段码管脚PO) .2、按下K3 (K4)后LED灯半秒闪烁 -K3 (K4) 管脚P3.2 (P3.3) ; LED管脚P2.03、用定时器实现(方式2) 4、学号单数用T0
时间: 2024-02-17 10:02:05 浏览: 120
好的,下面是基于51单片机的程序:
```c
#include <reg51.h>
// 定义数码管位选管脚和段码管脚
sbit digSel1 = P2^2;
sbit digSel2 = P2^3;
sbit digSel3 = P2^4;
sbit seg = P0;
// 定义按键和LED灯管脚
sbit btn1 = P3^2;
sbit btn2 = P3^3;
sbit led = P2^0;
// 定义定时器初值
#define TIMER_VAL 65536 - 50000
// 定义函数延时函数
void delay(unsigned int t) {
while(t--);
}
// 定义定时器2的中断处理函数
void timer2_isr() interrupt 5 {
// 重置定时器2的初值
TH2 = TIMER_VAL / 256;
TL2 = TIMER_VAL % 256;
static unsigned char cnt = 0;
// 数码管扫描显示
switch(cnt) {
case 0:
digSel1 = 1;
digSel2 = 0;
digSel3 = 0;
seg = 0x3f; // 显示数字2
break;
case 1:
digSel1 = 0;
digSel2 = 1;
digSel3 = 0;
seg = 0x06; // 显示数字0
break;
case 2:
digSel1 = 0;
digSel2 = 0;
digSel3 = 1;
seg = 0x3d; // 显示数字1
break;
}
// 计数器加1
cnt++;
if(cnt >= 3) {
cnt = 0;
}
// 检测按键状态
if(btn1 == 0) {
// 点亮LED灯并延时半秒
led = 1;
delay(50000);
led = 0;
}
if(btn2 == 0) {
// 点亮LED灯并延时半秒
led = 1;
delay(50000);
led = 0;
}
}
void main() {
// 定时器2初始化
TMOD = 0x22; // 定时器2为方式2,定时器1不使用
TH2 = TIMER_VAL / 256;
TL2 = TIMER_VAL % 256;
ET2 = 1; // 允许定时器2中断
EA = 1; // 开启总中断
// 循环等待
while(1);
}
```
这是一个简单的程序,实现了数码管显示学号后2位,按下按键后LED灯半秒闪烁,使用定时器实现。在程序中,我们使用定时器2来扫描显示数码管,并检测按键状态,如果检测到按键按下,则点亮LED灯并延时半秒。同时,我们使用定时器的中断来实现定时扫描数码管和检测按键状态的功能。需要注意的是,在使用定时器计数的时候,我们需要设置定时器的初值和开启定时器中断,以便在定时器计数满时能够触发中断。
阅读全文