51单片机使用P1口驱动3位7段共阴型数码管,使用P2.0-P2.2口选择用于显示的数码管,外部中断引脚INT0(P3.2)上连接了按键S1,用于中断计数,外部引脚P3.5(T1)上连接了按键S2,用于清零计数
时间: 2023-05-28 20:05:34 浏览: 60
首先需要定义数码管显示时所需的数字编码,可以通过查阅数据手册或者使用在线工具来获取。假设共阴型数码管的编码如下:
```c
unsigned char code numCode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
```
其中,numCode[0]表示数字0的编码,numCode[1]表示数字1的编码,以此类推。
然后需要初始化单片机的各个引脚和中断,例如:
```c
sbit S1=P3^2; // 定义按键S1对应的引脚
sbit S2=P3^5; // 定义按键S2对应的引脚
sbit D1=P1^0; // 定义第一个数码管的引脚
sbit D2=P1^1; // 定义第二个数码管的引脚
sbit D3=P1^2; // 定义第三个数码管的引脚
void init() {
// 初始化P1口为输出
P1=0;
// 初始化P2.0-P2.2口为输出
P2&=0xF8;
// 初始化P3.2口为输入,用作中断引脚
IT0=1; // 设置INT0为边沿触发
EX0=1; // 开启INT0中断
// 初始化P3.5口为输入
// ...
}
```
接下来实现中断函数,用于计数和清零:
```c
unsigned int count=0; // 定义计数器,并初始化为0
void count_ISR() interrupt 0 {
count++; // 计数器加1
}
void clearCount() {
count=0; // 计数器清零
}
```
最后实现主函数,通过循环不断切换数码管的显示:
```c
void main() {
init(); // 初始化引脚和中断
while(1) {
D1=1; D2=0; D3=0; // 选择第一个数码管
P2=0; // 显示数字0
delay(100); // 延时一段时间后切换下一个数码管
D1=0; D2=1; D3=0; // 选择第二个数码管
P2=1; // 显示数字1
delay(100); // 延时一段时间后切换下一个数码管
D1=0; D2=0; D3=1; // 选择第三个数码管
P2=2; // 显示数字2
delay(100); // 延时一段时间后切换下一个数码管
}
}
```
其中的delay函数可以使用定时器来实现,也可以通过循环计数的方式来实现。如果使用定时器,需要初始化定时器并编写定时器中断函数。以下是使用循环计数的方式实现的delay函数:
```c
void delay(unsigned int t) {
while(t--) {
unsigned int i=100; // 循环计数,控制延时时长
while(i--);
}
}
```