Description
设计单片机的Proteus仿真电路,实现如下功能:
- 控制P0口数码管循环显示0-9
- 按下上面开关,控制P2口数码管依次显示0-9
- 按下下面开关,控制P1口数码管依次显示0-9
实验电路图
实验分析
- 控制P0口数码管循环显示0-9。使P0不断取DSY_CODE中的值,然后每次改变前延时。
- 外部中断INT0发生时,控制P2口数码管依次显示0-9。开启外部中断0,然后在中断处理函数里面使P2不断取DSY_CODE中的值,不循环。
- 外部中断INT1发生时,控制P1口数码管依次显示0-9。开启外部中断1,同时设置高优先级,中断处理函数同上。
源程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//延时函数
void delay(uint m, uint n) {
uint i, j;
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++);
}
}
void open_interrupt() {
EA = 1; //CPU开中断
EX0 = 1; //允许外部中断0产生中断
IT0 = 1; //外中断0为边沿触发方式
EX1 = 1; //允许外部中断1产生中断
IT1 = 1; //外中断1为边沿触发方式
PX1 = 1; //外中断1为高级中断
}
//外部中断0
void inter0() interrupt 0 {
uint i = 0;
for(i = 0; i < 10; i++) {
P2 = DSY_CODE[i];
delay(880, 110);
}
}
//外部中断1
void inter1() interrupt 2 {
uint i = 0;
for(i = 0; i < 10; i++) {
P1 = DSY_CODE[i];
delay(880, 110);
}
}
void main() {
uint i = 0;
open_interrupt(); //开中断
while(1) {
P0 = DSY_CODE[i];
i = (i + 1) % 10;
delay(880, 110);
}
}