找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2877|回复: 2
打印 上一主题 下一主题
收起左侧

单片机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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:890070 发表于 2021-10-18 10:54 | 只看该作者
刚好需要 很棒
回复

使用道具 举报

板凳
ID:977459 发表于 2021-11-23 13:23 | 只看该作者
有显示得分的程序吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表