仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- /*************************************************************
- 八路抢答器系统
- 补充说明:
- ***************************************************************/
- #include<reg52.h> //头文件
- #include<SMG.h>
- #include<EEPROM.h>
- #include<INTERRUPT.h>
- #define uchar unsigned char//宏定义
- #define uint unsigned int
- /**********************引脚定义************************/
- sbit key_zhu=P2^2; //主持人键
- sbit key_jia=P2^1; //加键
- sbit key_jian=P2^0; //减键
- sbit key_1=P1^1; //八位选手按键定义
- sbit key_2=P1^3;
- sbit key_3=P1^5;
- sbit key_4=P1^7;
- sbit key_5=P3^1;
- sbit key_6=P3^3;
- sbit key_7=P3^5;
- sbit key_8=P3^7;
- sbit led_1=P1^0; //八位LED灯按键定义
- sbit led_2=P1^2;
- sbit led_3=P1^4;
- sbit led_4=P1^6;
- sbit led_5=P3^0;
- sbit led_6=P3^2;
- sbit led_7=P3^4;
- sbit led_8=P3^6;
- /**********************变量定义************************/
- uchar zhu_f=0; //比赛进行阶段标记位,=0表示没有按。=1表示在设置倒计时的时间。=2表示开始抢答
- uchar qiang_f=0; //抢答犯规标记,=0没有犯规。=1表示有人犯规
- uchar wan_f=0; //抢答完成标记,=0抢答没完成后还没有开始。=1表示抢答完成
- uchar time=30; //倒计时时间
- uchar T0_num; //定时器0计数
- uchar number; //抢答成功选手的编号,或犯规选手的编号。=0的时候表示没有
- /********************************************************
- 函数名称:void delayms(uint ms)
- 函数作用:毫秒延时函数
- 参数说明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函数名称:void bajing()
- 函数作用:抢答犯规报警提示
- 参数说明:
- ********************************************************/
- void bajing()
- {
- buzz=0; //开蜂鸣器
- delayms(10);
- buzz=1; //关蜂鸣器
- delayms(10);
- }
- /********************************************************
- 函数名称:uchar qianda()
- 函数作用:抢答按键检测,返回抢答编号
- 参数说明:
- ********************************************************/
- uchar qianda()
- {
- uchar temp=0;
- if(key_1==0) //一号犯规,下同
- temp=1; //记录1号
- else
- if(key_2==0)
- temp=2;
- else
- if(key_3==0)
- temp=3;
- else
- if(key_4==0)
- temp=4;
- else
- if(key_5==0)
- temp=5;
- else
- if(key_6==0)
- temp=6;
- else
- if(key_7==0)
- temp=7;
- else
- if(key_8==0)
- temp=8;
- return temp;
- }
- /********************************************************
- 函数名称:void led_kongzhi(uchar num,bit mode)
- 函数作用:LED灯控制
- 参数说明:num控制哪一个灯,k=1,点亮,=0关闭。mode=0全灭后在控制这个灯,=1单独控制这个灯
- ********************************************************/
- void led_kongzhi(uchar num,bit k,bit mode)
- {
- if(mode==0)
- {
- led_1=1; //八位LED灯全灭
- led_2=1;
- led_3=1;
- led_4=1;
- led_5=1;
- led_6=1;
- led_7=1;
- led_8=1;
- }
- if(k==1)
- {
- switch (num) //控制对应LED灯亮
- {
- case 1:led_1=0;
- break;
- case 2:led_2=0;
- break;
- case 3:led_3=0;
- break;
- case 4:led_4=0;
- break;
- case 5:led_5=0;
- break;
- case 6:led_6=0;
- break;
- case 7:led_7=0;
- break;
- case 8:led_8=0;
- break;
- }
- }
- else
- {
- switch (num) //控制对应LED灯灭
- {
- case 1:led_1=1;
- break;
- case 2:led_2=1;
- break;
- case 3:led_3=1;
- break;
- case 4:led_4=1;
- break;
- case 5:led_5=1;
- break;
- case 6:led_6=1;
- break;
- case 7:led_7=1;
- break;
- case 8:led_8=1;
- break;
- }
- }
- }
- /********************************************************
- 函数名称:void scan(void)
- 函数作用:按键检测函数
- 参数说明:
- ********************************************************/
- void scan(void)
- {
- uchar qiangda_num=0;
- //主持人键
- if(key_zhu==0) //按键按下
- {
- delayms(7); //显示消抖
- if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判断是否有人犯规或者抢答是否开始或者抢答是否完成
- {
- zhu_f++; //比赛阶段标记+1
- if(zhu_f==2) //比赛正式开始
- {
- TR0=1; //比赛开始,开启定时
- wan_f=0; //清除比赛完成标志
- bajing(); //提示比赛开始
- }
- }
- else
- if(key_zhu==0&&qiang_f==1) //判断是否有人犯规
- {
- buzz=1; //清除报警
- qiang_f=0; //清除抢答标志
- number=0; //清除选手编号
- time=EEPROM_read(0x2000);//重新读取存储的抢答总时长
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&wan_f==1) //判断是否有人完成
- {
- buzz=1; //清除报警
- wan_f=0; //清除完成标志
- number=0; //清除选手编号
- time=EEPROM_read(0x2000);//重新读取存储的抢答总时长
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&zhu_f==2) //暂停比赛
- {
- TR0=0; //关闭定时
- zhu_f=1; //重新回到设置比赛时间阶段
- bajing(); //提示暂停比赛
- }
- while(!key_zhu);//检测按键松开
- }
- //加值键,支持连按
- if(key_jia==0&&zhu_f==1&&qiang_f==0) //判断是否在设置倒计时时间
- {
- delayms(7); //延时消抖
- if(key_jia==0) //再次判断按键按下
- {
- if(time<99) //比赛时间最大值99S
- time++; //比赛时间+1S
- EEPROM_delete(0x2000); //擦除EEPROM煽区
- EEPROM_write(0x2000,time); //写入【比赛时间】数据保存
- display(time/10,time%10,10,0); //显示设置比赛时间
- }
- }
- //减值键,支持连按
- if(key_jian==0&&zhu_f==1&&qiang_f==0) //判断是否在设置倒计时时间
- {
- delayms(7); //延时消抖
- if(key_jian==0) //再次判断按键按下
- {
- if(time!=0) //比赛时间最小值0S
- time--; //比赛时间-1S
- EEPROM_delete(0x2000); //擦除EEPROM煽区
- EEPROM_write(0x2000,time); //写入【比赛时间】数据保存
- display(time/10,time%10,10,0); //显示设置比赛时间
- }
- }
- //选手按键
- qiangda_num=qianda();
- if(qiangda_num!=0) //判断是否有选手按下按键
- {
- if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果还没有开始抢答时按下
- {
- zhu_f=1;
- buzz=0; //蜂鸣器报警
- qiang_f=1; //抢答犯规标记
- number=qiangda_num;
- led_kongzhi(number,1,0);
- }
- else
- if(zhu_f==2&&wan_f==0) //在开始抢答时按下
- {
- wan_f=1; //标记抢答完成
- zhu_f=0; //主持人标记复位
- TR0=0; //关闭倒计时定时器
- number=qiangda_num;
- led_kongzhi(number,1,0);
- bajing(); //提示有人抢答完成
- }
- }
- }
- /*********************************************************
- 函数名称:void main()
- 函数作用:主函数函数
- 参数说明:
- *********************************************************/
- void main()
- {
- uchar i=0;
- T0_init(); //定时器初始化
- if(key_jian==0)
- {
- delayms(100);
- if(key_jian==0)
- {
- EEPROM_delete(0x2000); //擦除EEPROM煽区
- EEPROM_write(0x2000,30); //写入【比赛时间】数据保存
- }
- }
- time=EEPROM_read(0x2000); //读取存储的【比赛时间】数据
- for(i=0;i<9;i++)
- {
- led_kongzhi(i,1,1);
- delayms(10);
- }
- for(i=9;i>0;i--)
- {
- led_kongzhi(i-1,0,1);
- delayms(10);
- }
- led_kongzhi(0,0,0);
- while(1) //死循环
- {
- scan(); //按键检测处理
- if(zhu_f==0&&wan_f==0) //判断是否还没进入比赛阶段
- display(10,10,10,10); //未进入,显示"----"
- else
- if(zhu_f==0&&wan_f==1) //进入比赛阶段,并且处于设置比赛时间
- display(time/10,time%10,10,number);//显示设置比赛时间
- else
- if(zhu_f!=0)
- {
- if(qiang_f==1) //设有人犯规
- display(11,11,10,number); //显示FF-犯规编号
- else
- display(time/10,time%10,10,number);//显示比赛剩余时间和抢答者编号,未抢答显示0
- }
- }
- }
复制代码
所有资料51hei提供下载(仿真PCB与代码):
八人抢答器51hei设计.zip
(1.14 MB, 下载次数: 190)
|