标题: 单片机8位竞赛抢答器调研,模块划分与接口定义文档+Proteus仿真程序 [打印本页]

作者: 294766570    时间: 2020-3-3 12:01
标题: 单片机8位竞赛抢答器调研,模块划分与接口定义文档+Proteus仿真程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


使用at89c51实现功能
单片机源程序:
#include<reg51.h>
#include<lcd1602.h>
sbit sjjia=P1^0;         //定义时间加按钮        
sbit sjjian=P1^1;                  //定义时间减按钮
sbit kaishi=P1^2;                  //定义开始按钮
sbit fuwei=P1^3;                  //定义复位按钮
sbit soud=P1^4;                          //报警按钮
sbit led_r=P1^5;                  //定义抢答成功指示
sbit led_y=P1^6;                   //定义阐述时间到指示

unsigned char num[]={'0','1','2','3','4','5','6','7','8','9'},num2;
unsigned char model,time,temp;

void init()        //初始化函数
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;
        TR0=0;
        EA=1;
        P1=0x0f;

        model=0;
        time=30;
}

void delay(unsigned char i)        //延时函数
{
        unsigned char j,k;
        while(i--)
                for(j=100;j>0;j--)
                        for(k=100;k>0;k--);
}

void star() //启动
{
        lcd_xml(0x80);lcd_xsj("     welcome    ");
        delay(100);
        lcd_xml(0xc0);lcd_xsj(" 8 Way Responder");
        delay(80);
}

void led_num() //刷新倒计时
{
        lcd_xml(0x80);lcd_xsj(" Countdown :    ");
        lcd_xml(0x8d);lcd_xsj2(num[time/10]);
        lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}

void reset()        //复位
{
        TR0=0;
        P1=0x0f;

        led_r=0;
        led_y=0;
        P2=0xff;
        model=0;
        time=10;
        led_num();
        lcd_xml(0xc0);lcd_xsj("   Not started  ");        
}

void Not_started()
{
        if(sjjia==0)
        {
                delay(10);
                if(sjjia==0)
                {
                        time++;
                        if(time==100) time=0;
                        led_num();
                }
        }
        if(sjjian==0)
        {
                delay(10);
                if(sjjian==0)
                {
                        time--;
                        if(time==0) time=99;
                        led_num();
                }
        }
        if(kaishi==0)
        {
                delay(10);
                if(kaishi==0)
                {
                        model=1;
                        TR0=1;
                        lcd_xml(0xc0);lcd_xsj(" Start Responder");
                        soud=1;delay(10);soud=0;
                }
        }
}

void anjian()
{

        if(P2 != 0xff)
        {
                delay(5);
                if(P2 != 0xff)
                {
                        temp=~P2;
                        model=3;
                        led_r=1;
                        soud=1;delay(10);soud=0;        
                        switch(temp)
                        {
                                case 0x01:num2=1;break;
                                case 0x02:num2=2;break;
                                case 0x04:num2=3;break;
                                case 0x08:num2=4;break;
                                case 0x10:num2=5;break;
                                case 0x20:num2=6;break;
                                case 0x40:num2=7;break;
                                case 0x80:num2=8;break;                        
                        }
                        lcd_xml(0xc0);lcd_xsj(" Competitor:   ");
                        lcd_xml(0xce);lcd_xsj2(num[num2]);

                        time=60;
                        P2=temp;
                }        
        }
}

void finish()
{
        if(!time)
        {
                led_y=1;
                lcd_xml(0xc0);lcd_xsj("      End       ");        
        }
}

void main()
{
        init();
        lcd_init();
        star();
        reset();
        while(1)
        {
                if(fuwei==0)        //复位键检测
                {
                        delay(1);
                        if(fuwei==0)
                                reset();
                }
                switch(model)
                {
                        case 0:Not_started();break;
                        case 1:anjian();break;
                        case 2:finish();break;
                        case 3:break;
                        default : model=0;break;        
                }
        }
}

void timee() interrupt 1        //1s函数中断
{
        unsigned char a;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        a++;        //是否满1s
        if(a==24)
        {
                a=0;
                if(model==1 || model==3)
                {
                        time--;
                        led_num();
                        if(time==0)
                        {
                                model=2;
                                soud=1;delay(20);soud=0;
                        }
                }
        }
}

全部资料51hei下载地址:
电子综合设计.7z (811.36 KB, 下载次数: 161)

作者: zwj0426    时间: 2021-10-18 10:54
刚好需要 很棒
作者: 1173646836    时间: 2021-11-23 13:23
有显示得分的程序吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1