找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机智能抢答器的程序设计与仿真实现

[复制链接]
跳转到指定楼层
楼主
这是我编写的基于51单片机的语音抢答器的设计源文件和PROTUES仿真图!
智能抢答器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "reg51.h"        //51系列单片机定义文件
  2. #include "intrins.h"      //调用_nop_();延时函数用
  3. #define IN    P1    //显示数据段码输出口
  4. #define uchar unsigned char//无符号字符(8位)
  5. #define uint unsigned int  //无符号整数(16位)
  6. uchar num;                 //抢答选手编号
  7. uchar time=20;             //抢答时间初值
  8. uchar dtime=30;                           //回答时间初值
  9. uchar n,m,num_1;           //抢答时间临时变量,秒计数值,抢答选手号
  10. sbit  key1=P3^0;           //开始
  11. sbit  key2=P3^1;           //停止
  12. sbit  key3=P3^2;           //设定
  13. sbit  key4=P3^3;           //确认
  14. sbit  key5=P3^4;           //抢答时间加1
  15. sbit  key6=P3^5;                   //抢答时间减1
  16. sbit  key7=P3^6;           //回答时间加1
  17. sbit  key8=P3^7;                   //回答时间减1
  18. bit   TZ=0;                                   //调整标志位
  19. bit   RUN=1;                           //运行标志,=0,抢答计时=1,回答计时。
  20. sbit  W1=P2^4;
  21. sbit  W2=P2^5;
  22. sbit  W3=P2^6;
  23. sbit  W4=P2^7;
  24. sbit  busy =P2^0;
  25. sbit  dat  =P2^1;
  26. sbit  rest =P2^2;
  27. sbit  point=P0^7;
  28. void display();
  29. void sound(uchar k);
  30. /************************************/
  31. uchar code dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  32.                           0x80,0x90,0xFF,0x7F};
  33. /* 共阳七段LED段码表  "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" */
  34. /********1毫秒延时子函数**********/
  35. delay1ms(uint t)
  36. {
  37. uint i,j;
  38. for(i=0;i<t;i++)
  39.    for(j=0;j<120;j++)
  40.    ;
  41. }
  42. /********************************************************报数 程序********************************************************/
  43. void sound(uchar k)
  44. {uint i;
  45. while(busy==0){display();}
  46. rest=1;
  47. display();
  48. rest=0;
  49. for(i=k;i>0;i--)
  50. {dat=1;
  51.   display();
  52.   dat=0;
  53.   }
  54. }
  55. //******************************************显示程序
  56. void display()
  57. {if(TZ==0)
  58. {P0=dis_7[num]; W1=0;   delay1ms(1);   W1=1;
  59.   P0=0xbf;            W2=0;        delay1ms(1);   W2=1;
  60.   P0=dis_7[n/10%10]; W3=0;         delay1ms(1);         W3=1;
  61.   P0=dis_7[n%10];   W4=0;         delay1ms(1);          W4=1;
  62. }
  63. else
  64. {P0=dis_7[time/10%10]; W1=0;   delay1ms(1);   W1=1;
  65.   P0=dis_7[time%10];point=0;            W2=0;        delay1ms(1);   W2=1;
  66.   P0=dis_7[dtime/10%10]; W3=0;         delay1ms(1);         W3=1;
  67.   P0=dis_7[dtime%10];   W4=0;         delay1ms(1);          W4=1;
  68. }

  69. }
  70. /********************************************************/
  71. /**********语音程序******************/
  72. void nose(uchar x)
  73. { switch (x)
  74. {        case 0:{sound(29);sound(17);break;}
  75.         case 1:{sound(num+1);sound(11);sound(12);sound(13);break;}
  76.         case 2:{sound(32);break;}
  77.         case 3:{sound(29);sound(25);break;}
  78.         case 4:{sound(num+1);sound(11);;sound(14);sound(12)break;}
  79.         case 5:{sound(28);sound(25);break;}               
  80.         default:        break;
  81. }
  82. }
  83. /*扫描程序*/

  84. /*****************************************/
  85. void keyscan()
  86. {
  87. if(P1!=0xFF&&TR0==0&&TZ==0)
  88. {num_1=P1;
  89.   switch(num_1)
  90.         {        case 0xfe: {num=1;nose(4);} break;  
  91.                 case 0xfd: {num=2;nose(4);} break;
  92.                 case 0xfb: {num=3;nose(4);} break;
  93.                 case 0xf7: {num=4;nose(4);} break;
  94.                 case 0xef: {num=5;nose(4);} break;
  95.                 case 0xdf: {num=6;nose(4);} break;
  96.                 case 0xbf: {num=7;nose(4);} break;
  97.                 case 0x7f: {num=8;nose(4);} break;
  98.                 default: break;
  99.         }
  100.         while(key2==1){display();}       
  101.         {sound(32);                        
  102.          num=0;   
  103.         }               
  104.         while(key2==0);  
  105. }
  106. if(key1==0)  
  107. {delay1ms(20);
  108. if(key1==0)
  109. { sound(32);            
  110.    while(key1==0);
  111.    TR0=1;
  112.    RUN=0;
  113.    n=time;     
  114.    
  115. while(TR0!=0&&P1==0xff)   
  116. {display();
  117. if(key2==0)
  118. {while(key2==0);
  119. n=0;
  120. num=0;
  121. TR0=0;               
  122. }
  123. }
  124. TR0=0;m=0;   
  125. num_1=P1;   
  126. switch(num_1)
  127.         {        case 0xfe: {num=1;nose(1);RUN=1;n=dtime;TR0=1;} break;
  128.                   
  129.                 case 0xfd: {num=2;nose(1);RUN=1;n=dtime;TR0=1;} break;
  130.                 case 0xfb: {num=3;nose(1);RUN=1;n=dtime;TR0=1;} break;
  131.                 case 0xf7: {num=4;nose(1);RUN=1;n=dtime;TR0=1;} break;
  132.                 case 0xef: {num=5;nose(1);RUN=1;n=dtime;TR0=1;} break;
  133.                 case 0xdf: {num=6;nose(1);RUN=1;n=dtime;TR0=1;} break;
  134.                 case 0xbf: {num=7;nose(1);RUN=1;n=dtime;TR0=1;} break;
  135.                 case 0x7f: {num=8;nose(1);RUN=1;n=dtime;TR0=1;} break;
  136.                 default: break;
  137.         }
  138.         while(TR0!=0)   
  139.     {display();
  140.     if(key2==0)           
  141.     {while(key2==0);
  142.      n=0;
  143.      num=0;
  144.      TR0=0;
  145.      }
  146.     }
  147.         num=0;m=0;
  148. }
  149. }

  150. if(key2==0)     
  151. {delay1ms(20);
  152. if(key2==0)
  153. {while(key2==0);
  154. n=0;
  155. num=0;         
  156. TR0=0;
  157. TZ=0;
  158. }
  159. }

  160. if(key3==0&&TR0==0&&num==0)   
  161. {delay1ms(20);         
  162. if(key3==0)
  163. {while(key3==0);  
  164.   TZ=1;           
  165. }
  166. }

  167. if(key4==0&&TR0==0&&num==0)   
  168. {delay1ms(20);
  169. if(key4==0)
  170. {while(key4==0);
  171.   TZ=0;            
  172. }
  173. }

  174. if(key5==0&&TZ==1)   
  175. {delay1ms(20);
  176. if(key5==0)
  177. {while(key5==0);
  178. if(time>=89)      
  179. {time=90;
  180. }
  181. else
  182. {time++;
  183. }
  184. display();           
  185. }
  186. }

  187. if(key6==0&&TZ==1)   
  188. {delay1ms(20);
  189. if(key6==0)
  190. {while(key6==0);
  191. if(time<=6)
  192. {time=5;              
  193. else
  194. {time--;
  195. }
  196. display();           
  197. }
  198. }
  199. if(key7==0&&TZ==1)   
  200. {delay1ms(20);                    
  201. if(key7==0)            
  202. {while(key7==0);
  203. if(dtime>=89)
  204. {dtime=90;            
  205. }
  206. else
  207. {dtime++;
  208. }
  209. display();
  210. }                    
  211. }

  212. if(key8==0&&TZ==1)   
  213. {delay1ms(20);
  214. if(key8==0)
  215. {while(key8==0);     
  216. if(time<=6)                  
  217. {dtime=5;
  218. }
  219. else
  220. {dtime--;
  221. }
  222. display();
  223. }
  224. }

  225. }                     
  226. /*主程序*/
  227. void main()
  228. ……………………

  229. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
新建 WinRAR 压缩文件.rar (103.02 KB, 下载次数: 59)


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

使用道具 举报

沙发
ID:340286 发表于 2018-12-3 09:44 | 只看该作者
谢谢大佬分享!
回复

使用道具 举报

板凳
ID:782689 发表于 2020-6-21 18:50 | 只看该作者

谢谢大佬分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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