单片机开发项目(考试) 总共两大题 其一
1. 综合实验设计题目1要求
AT89S51单片机引脚接有15个按键K0~K14,另外还接有8个LED发光二极管和一个电磁式无源蜂鸣器,2个动态显示的数码管,绘制仿真电路并编程实现以下功能:
⑴按键K0~K11分别代表数值0~11。当相应的按键按下时,蜂鸣器发出250HZ鸣响,并且两位数码管显示出相应的按键代表的十进制数值(00∽11)。(说明:按键按下蜂鸣器响并显示数值得30分,按键按下无蜂鸣仅显示得20分)
⑵按K12按键, 用定时中断实现2位动态连接数码管60秒倒计数并显示(2个动态连接的数码管,60~00);(说明:定时中断来实现30分,不用定时中断实现15分)
⑶按K13按键,触发外部中断1,将数码管显示设置为“――”。(10分)
⑷按K14按键, 实现1个并行端口的8个LED灯每隔500ms双向流水点亮,从低位到高位,再回到低位,重复2次;(10分)
效果展示:
效果演示视频:
代码展示:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
unsigned char x=60;
sbit bb=P2^7;
void lsd(unsigned int y){
uchar code smg[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
P0=smg[y/10];
P2=smg[y%10];
}
void time(int i){
int j;
for(i;i>0;i--)
for(j=0;j<114;j++);
}
void time500(){
int j;
for(j=0;j<25;j++);
}
void beep()
{
int o;
for(o=0;o<1000;o++){
bb=1;
time500();
bb=0;
time500();
}
}
void main(){
uchar code smg[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
int j=0,k,u,n;
P2=0x80;
P0=0xFF;
while(1){
P1 = 0x0f;
if(P1!=0x0f)
time(15);
switch(P1)
{
case 0x0e: j=0; break;
case 0x0d: j=1; break;
case 0x0b: j=2; break;
case 0x07: j=3;
}
P1 = 0Xf0;
switch(P1)
{
case 0xe0: j+=0;beep(); break;
case 0xd0: j+=4;beep(); break;
case 0xb0: j+=8;beep(); break;
case 0x70: j+=12;beep(); break;
//case 0xf0: j=16;
}
if(j/9 != 0)
k=j/10;
else
k=0;
if (j==13){
P0=smg[10];
P2=smg[10];
}
else if(j==12){
x=60;
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(x)
lsd(x);
time(100);
j=0;
}
else if (j==14){
for(u=0;u<=1;u++){
P3=0xfe;
time(500);
for(n=0;n<13;n++){
if(n<7)
P3=_crol_(P3,1);
else
P3=_crol_(P3,-1);
time(500);
}}
P3=0xfe;
time(500);
P3=0xff;
j=0;
}
else{
P0=smg[k];
P2=smg[j%10];}
time(4);
}}
void Time(void) interrupt 1 using 0{
unsigned char n;
n+=1;
if(n==10){
x-=1;
n=0;
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}

