找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4593|回复: 0
收起左侧

基于单片机的16路抢答器仿真+代码

[复制链接]
ID:231965 发表于 2017-9-8 21:08 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
QQ图片20170908210416.png
0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x84};
  5. uchar code table0[]={0xf7,0xfe,0xfd,0xfb};
  6. unsigned char code table2[]={0xef,0xdf,0xbf,0x7f};
  7. uchar display[]={0,0,0,0};
  8. void sw1();
  9. void sw2();
  10. void sw3();
  11. void sw4();
  12. void xianshi();
  13. void init();
  14. uchar temp,num2,x,x1,x2,a,count;
  15. int num,num1;
  16. uchar key;
  17. uchar i,j;
  18. sbit k1=P1^0;
  19. sbit k2=P1^1;
  20. sbit k3=P1^2;
  21. sbit k4=P1^3;
  22. sbit sp=P1^4;
  23. sbit l1=P1^5;
  24. sbit l2=P1^6;
  25. sbit P3_4=P3^4;
  26. sbit P3_5=P3^5;
  27. sbit P3_6=P3^6;
  28. sbit P3_7=P3^7;
  29. void delay(uchar z)
  30. {
  31. uchar x,y;
  32. for(x=z;x>0;x--)
  33. for(y=110;y>0;y--);
  34. }
  35. void init()
  36. {
  37. a=0;
  38. TMOD=0x01;
  39. TH0=(65536-10000)/256;
  40. TL0=(65536-10000)%256;
  41. EA=1;
  42. ET0=1;
  43. if(k1==0)
  44. {
  45. delay(5);
  46. if(k1==0)
  47. {
  48. num++;
  49. if(num==99)
  50. {
  51. num=0;
  52. }
  53. num2=num;
  54. while(k1==0);
  55. }
  56. }
  57. if(k2==0)
  58. {
  59. delay(5);
  60. if(k2==0)
  61. {
  62. num--;
  63. if(num==-1)
  64. {
  65. num=99;
  66. }
  67. num2=num;
  68. while(k2==0);
  69. }
  70. }
  71. if(k3==0)
  72. {
  73. delay(5);
  74. if(k3==0)
  75. {
  76. x++;
  77. if(x==2)
  78. {
  79. x=0;
  80. }
  81. while(k3==0);
  82. }
  83. }
  84. }
  85. void keyboad()
  86. {
  87. while(1)
  88. {
  89. P3=0xff;
  90. P3_4=0;
  91. temp=P3;
  92. temp=temp & 0x0f;
  93. if (temp!=0x0f)
  94. {
  95. delay(5);
  96. temp=P3;
  97. temp=temp & 0x0f;
  98. if (temp!=0x0f)
  99. {
  100. temp=P3;
  101. temp=temp & 0x0f;
  102. switch(temp)
  103. {
  104. case 0x0e:
  105. {delay(5);num1=4;l2=0;xianshi();} break;
  106. case 0x0d:
  107. {delay(5);num1=3;l2=0;xianshi();}break;
  108. case 0x0b:
  109. {delay(5);num1=2;l2=0;xianshi();}break;
  110. case 0x07:
  111. {delay(5);num1=1;l2=0;xianshi();} break;
  112. }
  113. }
  114. }
  115. P3=0xff;
  116. P3_5=0;
  117. temp=P3;
  118. temp=temp & 0x0f;
  119. if (temp!=0x0f)
  120. {
  121. delay(5);
  122. temp=P3;
  123. temp=temp & 0x0f;
  124. if (temp!=0x0f)
  125. {
  126. temp=P3;
  127. temp=temp & 0x0f;
  128. switch(temp)
  129. {
  130. case 0x0e:
  131. {delay(5);num1=8;l2=0;xianshi();} break;
  132. case 0x0d:
  133. {delay(5);num1=7;l2=0;xianshi();} break;
  134. case 0x0b:
  135. {delay(5);num1=6;l2=0;xianshi();} break;
  136. case 0x07:
  137. {delay(5);num1=5;l2=0;xianshi();} break;
  138. }
  139. }
  140. }
  141. P3=0xff;
  142. P3_6=0;
  143. temp=P3;
  144. temp=temp & 0x0f;
  145. if (temp!=0x0f)
  146. {
  147. delay(5);
  148. temp=P3;
  149. temp=temp & 0x0f;
  150. if (temp!=0x0f)
  151. {
  152. temp=P3;
  153. temp=temp & 0x0f;
  154. switch(temp)
  155. {
  156. case 0x0e:
  157. {delay(5);num1=12;l2=0;xianshi();} break;
  158. case 0x0d:
  159. {delay(5);num1=11;l2=0;xianshi();} break;
  160. case 0x0b:
  161. {delay(5);num1=10;l2=0;xianshi();} break;
  162. case 0x07:
  163. {delay(5);num1=9;l2=0;xianshi();} break;
  164. }
  165. }
  166. }
  167. P3=0xff;
  168. P3_7=0;
  169. temp=P3;
  170. temp=temp & 0x0f;
  171. if (temp!=0x0f)
  172. {
  173. delay(5);
  174. temp=P3;
  175. temp=temp & 0x0f;
  176. if (temp!=0x0f)
  177. {
  178. temp=P3;
  179. temp=temp & 0x0f;
  180. switch(temp)
  181. {
  182. case 0x0e:
  183. {delay(5);num1=16;l2=0;xianshi();} break;
  184. case 0x0d:
  185. {delay(5);num1=15;l2=0;xianshi();} break;
  186. case 0x0b:
  187. {delay(5);num1=14;l2=0;xianshi();} break;
  188. case 0x07:
  189. {delay(5);num1=13;l2=0;xianshi();} break;
  190. }
  191. temp=P3;
  192. P0=table[key];
  193. }
  194. }
  195. }
  196. }
  197. void xianshi()
  198. {
  199. TR0=0;
  200. num=0;
  201. sp=1;
  202. delay(100);
  203. sp=0;
  204. while(1)
  205. {
  206. for(a=0;a<4;a++)
  207. {
  208. delay(5);
  209. P2=table0[a];
  210. P0=table[display[a]];
  211. }
  212. display[0]=num/10;
  213. display[1]=num%10;
  214. display[2]=num1/10;
  215. display[3]=num1%10;
  216. if(k4==0)
  217. {
  218. num=num2;
  219. num1=0;
  220. TR0=1;
  221. l1=1;
  222. l2=1;
  223. return;
  224. }
  225. }
  226. }
  227. void main()
  228. {
  229. l1=1;
  230. l2=1;
  231. sp=0;
  232. x=0;
  233. num=num2=30;
  234. while(1)
  235. {
  236. if(x==1)
  237. {
  238. delay(5);
  239. TR0=1;
  240. while(1)
  241. {
  242. keyboad();
  243. if(k4==0)
  244. {
  245. l1=1;
  246. l2=1;
  247. delay(5);
  248. num=num2;
  249. TR0=1;
  250. }
  251. }
  252. }
  253. else
  254. {
  255. for(a=0;a<4;a++)
  256. {
  257. delay(5);
  258. P2=table0[a];
  259. P0=table[display[a]];
  260. }
  261. display[0]=num/10;
  262. display[1]=num%10;
  263. display[2]=num1/10;
  264. display[3]=num1%10;
  265. init();
  266. }
  267. }
  268. }
  269. void time0() interrupt 1
  270. {
  271. TH0=(65536-10000)/256;
  272. TL0=(65536-10000)%256;
  273. count++;
  274. if(k4==0)
  275. {
  276. num=num2;
  277. TR0=1;
  278. num1=0;
  279. return;
  280. }
  281. for(a=0;a<4;a++)
  282. {
  283. delay(10);
  284. P2=table0[a];
  285. P0=table[display[a]];
  286. }
  287. display[0]=num/10;
  288. display[1]=num%10;
  289. display[2]=num1/10;
  290. display[3]=num1%10;
  291. if(count==100)
  292. {
  293. count=0;
  294. num--;
  295. if(num<5)
  296. {
  297. l1=~l1;
  298. ……………………

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

所有资料51hei提供下载:
16路抢答器.rar (80.55 KB, 下载次数: 119)




回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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