sinat_32847741 2015-11-16 04:25 采纳率: 0%
浏览 2961

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

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

  • 写回答

2条回答

  • 嘀嘀嗒嗒嗒啊 2015-11-16 07:23
    关注

    //以前做过的,需要按你的要求改一改,望采纳。
    #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();
    }
    }

    }
    }
    }

    评论

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题