标题:
51单片机智能抢答器的程序设计与仿真实现
[打印本页]
作者:
1640081068
时间:
2017-12-2 16:52
标题:
51单片机智能抢答器的程序设计与仿真实现
这是我编写的基于51单片机的语音抢答器的设计源文件和PROTUES仿真图!
智能抢答器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(27.25 KB, 下载次数: 29)
下载附件
2017-12-3 01:06 上传
单片机源程序如下:
#include "reg51.h" //51系列单片机定义文件
#include "intrins.h" //调用_nop_();延时函数用
#define IN P1 //显示数据段码输出口
#define uchar unsigned char//无符号字符(8位)
#define uint unsigned int //无符号整数(16位)
uchar num; //抢答选手编号
uchar time=20; //抢答时间初值
uchar dtime=30; //回答时间初值
uchar n,m,num_1; //抢答时间临时变量,秒计数值,抢答选手号
sbit key1=P3^0; //开始
sbit key2=P3^1; //停止
sbit key3=P3^2; //设定
sbit key4=P3^3; //确认
sbit key5=P3^4; //抢答时间加1
sbit key6=P3^5; //抢答时间减1
sbit key7=P3^6; //回答时间加1
sbit key8=P3^7; //回答时间减1
bit TZ=0; //调整标志位
bit RUN=1; //运行标志,=0,抢答计时=1,回答计时。
sbit W1=P2^4;
sbit W2=P2^5;
sbit W3=P2^6;
sbit W4=P2^7;
sbit busy =P2^0;
sbit dat =P2^1;
sbit rest =P2^2;
sbit point=P0^7;
void display();
void sound(uchar k);
/************************************/
uchar code dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xFF,0x7F};
/* 共阳七段LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" */
/********1毫秒延时子函数**********/
delay1ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
/********************************************************报数 程序********************************************************/
void sound(uchar k)
{uint i;
while(busy==0){display();}
rest=1;
display();
rest=0;
for(i=k;i>0;i--)
{dat=1;
display();
dat=0;
}
}
//******************************************显示程序
void display()
{if(TZ==0)
{P0=dis_7[num]; W1=0; delay1ms(1); W1=1;
P0=0xbf; W2=0; delay1ms(1); W2=1;
P0=dis_7[n/10%10]; W3=0; delay1ms(1); W3=1;
P0=dis_7[n%10]; W4=0; delay1ms(1); W4=1;
}
else
{P0=dis_7[time/10%10]; W1=0; delay1ms(1); W1=1;
P0=dis_7[time%10];point=0; W2=0; delay1ms(1); W2=1;
P0=dis_7[dtime/10%10]; W3=0; delay1ms(1); W3=1;
P0=dis_7[dtime%10]; W4=0; delay1ms(1); W4=1;
}
}
/********************************************************/
/**********语音程序******************/
void nose(uchar x)
{ switch (x)
{ case 0:{sound(29);sound(17);break;}
case 1:{sound(num+1);sound(11);sound(12);sound(13);break;}
case 2:{sound(32);break;}
case 3:{sound(29);sound(25);break;}
case 4:{sound(num+1);sound(11);;sound(14);sound(12)break;}
case 5:{sound(28);sound(25);break;}
default: break;
}
}
/*扫描程序*/
/*****************************************/
void keyscan()
{
if(P1!=0xFF&&TR0==0&&TZ==0)
{num_1=P1;
switch(num_1)
{ case 0xfe: {num=1;nose(4);} break;
case 0xfd: {num=2;nose(4);} break;
case 0xfb: {num=3;nose(4);} break;
case 0xf7: {num=4;nose(4);} break;
case 0xef: {num=5;nose(4);} break;
case 0xdf: {num=6;nose(4);} break;
case 0xbf: {num=7;nose(4);} break;
case 0x7f: {num=8;nose(4);} break;
default: break;
}
while(key2==1){display();}
{sound(32);
num=0;
}
while(key2==0);
}
if(key1==0)
{delay1ms(20);
if(key1==0)
{ sound(32);
while(key1==0);
TR0=1;
RUN=0;
n=time;
while(TR0!=0&&P1==0xff)
{display();
if(key2==0)
{while(key2==0);
n=0;
num=0;
TR0=0;
}
}
TR0=0;m=0;
num_1=P1;
switch(num_1)
{ case 0xfe: {num=1;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0xfd: {num=2;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0xfb: {num=3;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0xf7: {num=4;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0xef: {num=5;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0xdf: {num=6;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0xbf: {num=7;nose(1);RUN=1;n=dtime;TR0=1;} break;
case 0x7f: {num=8;nose(1);RUN=1;n=dtime;TR0=1;} break;
default: break;
}
while(TR0!=0)
{display();
if(key2==0)
{while(key2==0);
n=0;
num=0;
TR0=0;
}
}
num=0;m=0;
}
}
if(key2==0)
{delay1ms(20);
if(key2==0)
{while(key2==0);
n=0;
num=0;
TR0=0;
TZ=0;
}
}
if(key3==0&&TR0==0&&num==0)
{delay1ms(20);
if(key3==0)
{while(key3==0);
TZ=1;
}
}
if(key4==0&&TR0==0&&num==0)
{delay1ms(20);
if(key4==0)
{while(key4==0);
TZ=0;
}
}
if(key5==0&&TZ==1)
{delay1ms(20);
if(key5==0)
{while(key5==0);
if(time>=89)
{time=90;
}
else
{time++;
}
display();
}
}
if(key6==0&&TZ==1)
{delay1ms(20);
if(key6==0)
{while(key6==0);
if(time<=6)
{time=5;
else
{time--;
}
display();
}
}
if(key7==0&&TZ==1)
{delay1ms(20);
if(key7==0)
{while(key7==0);
if(dtime>=89)
{dtime=90;
}
else
{dtime++;
}
display();
}
}
if(key8==0&&TZ==1)
{delay1ms(20);
if(key8==0)
{while(key8==0);
if(time<=6)
{dtime=5;
}
else
{dtime--;
}
display();
}
}
}
/*主程序*/
void main()
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(6.59 KB, 下载次数: 39)
下载附件
2017-12-3 01:05 上传
所有资料51hei提供下载:
新建 WinRAR 压缩文件.rar
(103.02 KB, 下载次数: 62)
2017-12-2 16:51 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
DWT0630
时间:
2018-12-3 09:44
谢谢大佬分享!
作者:
aaabbbcd
时间:
2020-6-21 18:50
谢谢大佬分享!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1