谁能帮我设计一个89c51的一个八人抢答器的汇编程序,万分感谢!!!

1.数码管前一位显示抢答,后两位显示倒计时60s
2,p1.2为开始按钮图片

2个回答

//以前做过的,需要按你的要求改一改,望采纳。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define D8279 XBYTE[0x5EFF] //8279 数据口地址
#define C8279 XBYTE[0x5FFF] //8279 状态/命令口地址
sbit beep=P3^2; //蜂鸣器
sbit l1=P1^0; //8个发光二极管
sbit l2=P1^1;
sbit l3=P1^2;
sbit l4=P1^3;
sbit l5=P1^4;
sbit l6=P1^5;
sbit l7=P1^6;
sbit l8=P1^7;
uchar code ledseg[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e,0x8c,0xc1,0x89,0xc7,
0xbf,0x91,0x00,0xff};//LED显示常数表
uchar xuanshou,second,count;//
uchar score1,score2,score3,score4,score5,score6,score7,score8,score,xianshi;//选手1~8的分数
uint t,m,n,l,a1,a2,a3,a4,a5,a6,a7,a8,i;
uchar idata huanchong[5]={0,0,0,0,0}; //显示缓冲shijian,fenshu,xuanshou
bit bdata kbz; //按键表示值
void delay(uint z);
void Timer();
void disled(void);
void dis();
void init();
uchar getkey();
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--){
for(y=110;y>0;y--);
}

}
uchar getkey() //读键值函数
{
uchar key;
if((C8279&0x07)==0x00){
kbz=0; //无键按下,置标志
}

else{

kbz=1;
C8279=0x40; //读FIFO RAM命令
key=D8279;
key=(key&0x0f); //取键盘数据4位
return(key);
}

}
void tim(void) interrupt 1 using 1 //为定时中断TR0
{
TH0=0x3c; //重新赋值
TL0=0xb0;
count++;
if(count==20){ //20*50ms=1秒
count=0;
second--; //秒减1
if(second<=10&&m==1){
beep=1;delay(500);beep=0;
}
}
if(getkey()==0x0f){
TR0=0;xuanshou=0;t=0;beep=1;score=0;second=30;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;m=1;n=1;
}
}
void disled(void) //将缓冲区值显示出来
{

C8279=0x92;
for(i=0;i<=5;i++){
xianshi=huanchong[i];
D8279=ledseg[xianshi];
}
}
//-----显示处理-----
void dis()
{
huanchong[5]=xuanshou/10;
huanchong[4]=xuanshou%10; //选手号
huanchong[3]=score/10; //分数十位
huanchong[2]=score%10; //分数个位
huanchong[1]=second/10; //时间十位
huanchong[0]=second%10; //时间个位
disled();
}
void init() //初始化函数
{

t=0;
beep=1;
xuanshou=0;
score=0;
second=30;
score1=10;score2=10;score3=10;score4=10;score5=10;score6=10;score7=10;score8=10;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;

n=1;m=1;l=1;
C8279=0xDC; //清除 LED 显示
delay(1);
TMOD=0x01;
TH0=0x3c; //初值55536,计数10000次,每次1US,总计10ms
TL0=0xb0;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
C8279=0x02; //置8279工作方式////youduaua//shuru
C8279=0x34; //置键盘扫描速率

PX1=1;
PT0=1;
ET1=1;
xianshi=0;
}

void main()
{
init(); //初始化,
while(1){

if(getkey()==0x0f){ //查询是否有犯规按键
TR0=0;xuanshou=0;t=0;beep=0;delay(200);beep=1;score=0;second=30;m=1;n=1;l=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;
dis();
}

if(getkey()==0x01&&n==1) {xuanshou=1;score=score1;dis();l1=0;beep=0;l=0;}
else if(getkey()==0x02&&n==1) {xuanshou=2;score=score2;dis();l2=0;beep=0;l=0;}
else if(getkey()==0x03&&n==1) {xuanshou=3;score=score3;dis();l3=0;beep=0;l=0;}
else if(getkey()==0x04&&n==1) {xuanshou=4;score=score4;dis();l4=0;beep=0;l=0;}
else if(getkey()==0x05&&n==1) {xuanshou=5;score=score5;dis();l5=0;beep=0;l=0;}
else if(getkey()==0x06&&n==1) {xuanshou=6;score=score6;dis();l6=0;beep=0;l=0;}
else if(getkey()==0x07&&n==1) {xuanshou=7;score=score7;dis();l7=0;beep=0;l=0;}
else if(getkey()==0x08&&n==1) {xuanshou=8;score=score8;dis();l8=0;beep=0;l=0;}
else if(getkey()==0x0e&&l==1) {beep=0;delay(200);beep=1;TR0=1; m=0;n=0;}//若有开始键,则初始化
if(n==0){
if(m==0)dis();
if(second==0){

t=0;
beep=1;delay(500);beep=0; //30秒定时到
TR0=0;n=1; //关中断,并使n等于1
dis();
if(getkey()==0x0f){
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;//是否有复位键
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(m==0){ //m等于零即处于抢答状态,查询选手键
if(getkey()==0x01) t=1;
else if(getkey()==0x02) t=2;
else if(getkey()==0x03) t=3;
else if(getkey()==0x04) t=4;
else if(getkey()==0x05) t=5;
else if(getkey()==0x06) t=6;
else if(getkey()==0x07) t=7;
else if(getkey()==0x08) t=8;
else if(getkey()==0x0f){
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
while(t){
if(getkey()==0x0f){
xuanshou=0;TR0=0;i=0;t=0;beep=0;delay(200);beep=1;score=0;second=30;m=1;n=1;//
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
if(m==0){ //开关,保证程序只执行一次
switch(t){
case 1:{
TR0=0;xuanshou=1;second=0;beep=0;delay(500);beep=1;
a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;l1=0;second=90;TR0=1;
break;
} //跳出循环
case 2:{
TR0=0;xuanshou=2;second=0;beep=0;delay(500);beep=1;
a2=0;a1=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;l2=0;second=90;TR0=1;
break;
}
case 3:{
TR0=0;xuanshou=3;second=0;beep=0;delay(500);beep=1;
a3=0;a1=1;a2=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;l3=0;second=90;TR0=1;
break;
}

case 4:{
TR0=0;xuanshou=4;second=0;beep=0;delay(500);beep=1;
a4=0;a1=1;a2=1;a3=1;a5=1;a6=1;a7=1;a8=1;m=1;l4=0;second=90;TR0=1;
break;
}
case 5:{
TR0=0;xuanshou=5;second=0;beep=0;delay(500);beep=1;
a5=0;a1=1;a2=1;a3=1;a4=1;a6=1;a7=1;a8=1;m=1;l5=0;second=90;TR0=1;
break;
}

case 6:{
TR0=0;xuanshou=6;second=0;beep=0;delay(500);beep=1;
a6=0;a1=1;a2=1;a3=1;a4=1;a5=1;a7=1;a8=1;m=1;l6=0;second=90;TR0=1;
break;
}
case 7:{
TR0=0;xuanshou=7;second=0;beep=0;delay(500);beep=1;
a7=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a8=1;m=1;l7=0;second=90;TR0=1;
break;
}

case 8:{
TR0=0;xuanshou=8;second=0;beep=0;delay(500);beep=1;
a8=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;m=1;l8=0;second=90;TR0=1;
break;
}
}

}
if(a1==0){
dis();
if(second==0){ //定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score1+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score1-=1;
}
score=score1;
dis();
}
else if(a2==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){ //若此时再按下开始键,响铃提示,定时30s
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score2+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score2-=1;
}
score=score2;
dis();

}
else if(a3==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){ //若此时再按下开始键,响铃提示,定时30s
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score3+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score3-=1;
}
score=score3;
dis();

}
else if(a4==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){ //若此时再按下开始键,响铃提示,定时30s
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score4+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score4-=1;
}
score=score4;
dis();

}
else if(a5==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){ //若此时再按下开始键,响铃提示,定时30s
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score5+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score5-=1;
}
score=score5;
dis();

}
else if(a6==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){ //若此时再按下开始键,响铃提示,定时30s
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score6+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score6-=1;
}
score=score6;
dis();

}
else if(a7==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){
xuanshou=0;TR0=0;i=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score7+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score7-=1;
}
score=score7;
dis();

}
else if(a8==0){
dis();
if(second==0){ //30秒定时到
TR0=0;n=1; //关中断,并使n等于1,禁止抢答
if(getkey()==0x0f){
TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=30;m=1;n=1;
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}
if(getkey()==0x0a){
beep=0;delay(100);beep=1;score8+=1;
}
else if(getkey()==0x0b){
beep=0;delay(100);beep=1;score8-=1;
}
score=score8;
dis();

}

if(getkey()==0x0f){
xuanshou=0;TR0=0;i=0;t=0;beep=0;delay(200);beep=1;score=0;second=30;m=1;n=1;l=1;//

a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis();
}
}

}
}
}

傻孩子,写个C语言的源程序,扔到Keil中反汇编一下,汇编程序不就出来啦?怎么这么傻

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐