找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机7人多数表决器源程序与电路原理图设计

  [复制链接]
ID:664167 发表于 2020-11-1 17:00 | 显示全部楼层 |阅读模式
主要内容:

设计一个七人多数表决器,表决器的功能是将所投票者的结果综合起来,超过半数赞成则表示结果通过,反之则不通过。而七人表决器由七个人来投票,当赞成的票数大于或者等于4人,则认为通过,通过则显示1;当反对的票数大于或者等于4人时,则认为不通过,不通过则显示为0。
  
  
基本要求:
(1)7人多数表决逻辑:多数通过。
(2)在主持人控制下,10秒内表决有效。
(3)采用数码管显示表决10秒倒计时。
(4)表决结束后用发光二极管及数码管显示表决结果,数码管显示结果:通过、不通过,同意人数。
(5)设主持人控制键、暂停键、复位键。控制键:启动表决,暂停键:暂停表决,复位键:系统复位。
(6)支持表决者,则其对的LED就发光
(7)表决开始采用声音提示。
  
系统硬件电路设计

表决器器硬件电路由单片机最小系统模块、按键模块、显示模块、状态指示模块组成。图3-1所示为表决器电路原理图 。

图3-1  表决器电路原理图



按键模块由10个按键组成,分为按键开始部分和表决部分。按键开始部分,分别接AT89C52单片机的P2端口的P2.0、P2.1、P2.2引脚。当主理人按下对应的按键,即给对应的引脚一个低电平。在软件设计的程序中写入相应的操作,即可实现开始、暂停和复位的功能。即当按下S1时,系统开始运行;当按下S2时,系统停止运行;当按下S3时,系统恢复初始状态。

表决按键部分由七个按键组成,分别是S4-S10在7个按。按键一端接地,一端连接AT89C52单片机的P1端口。在表决时,当表决人按下他们相对应的按键,即给对应的引脚一个低电平,系统就会对其进行记录,当表决时间结束后,就会在数码管第四位显示同意表决的人数。以此来统计投票情况。表决按键模块的电路原理图如图3-3所示。

图3-3  表决按键模块电路原理图

3.3 状态指示模块

状态指示模块由7个LED灯组成,LED一端接电源,另一端接单片机P3端口,LED灯用来指示表决时的表决人的状态,当表决人按了自己相对应的按键他自己相对应的LED灯就会发出黄色的光。在连接LED灯时,不能直接将LED灯连接到单片机的端口上,如果直接连接的话,LED灯就会烧掉,从而其不到相应的功能,这时我们需要在相应的LED灯的位置连接一个电阻来起到保险作用,而我们接的电阻的大小直接影响到LED灯的发光程度,最好选择200欧姆的电阻,也可以将全部的LED串到一个电阻上来实现这个功能。状态指示模块电路原理图如图3-4所示。

图3-4  状态指示模块电路原理图

3.4 显示模块

在应用场景中,还需显示表决倒计时的时间、表决的结果及同意表决的人数等信息,这部分由显示模块完成。表决倒计时的时间在系统开始运行时,数码管的第三和第四位显示;表决的结果在系统运行结束后,在数码管的第一位显示,如果显示数字“1”,这表示表决通过,如果显示数字“0”;表决的同意人数在数码管的第四位显示。这显示模块在本设计中,使用共阴极4位数码管连接到AT80C52的P0端口。我们在连接数码管的时候不能直接将数码管直接连接到P0端口上,这样连接了,你按下开始按键数码管也不会显示数字,我们在连接的时候需要并连一个排阻,也可以用8个1K的电阻来代替,因为P0端口在AT89C52单片机的内部没有驱动电阻,然而不接电阻的话就没有足够的电能来驱动数码管。如图3-4所示

图3-4  显示模块图

4系统软件设计
4.1主程序设计

系统主程序开始以后,首先是对系统环境进行初始化,包括设置串口、定时器、中断和端口。进入主程序之后,首先进行键盘扫描,检测主持人的开始抢答按键和复位按键的状态。如没有任何动作,则数码管与状态指示灯设置为初始状态;如果开始抢答按键按下,则为定时器0设置初值,并开启定时器0,开始抢答倒计时,从10到0倒数,并设置状态指示灯。这时开始检测是否有表决人按下按键。如果10s内没有表决人按下按键,则判断是否还要继续表决,并回到键盘扫描。如果 10s内有表决人按下按键,表决人对应的LED发光。倒计时10s结束,数码管第四位显示表决同意人数,如果表决同意人数大于等于4人,数码管第一位显示数字“1”,表决同意人数小于4人,数码管的第一位就显示数字“0”。表决完成,则由主持人按复位键,回到按键扫描状态。抢答器系统程序流程图如图4-1所示。

图4-1  主程序设计流程图

4.2子程序设计
4.2.1 子程序设计1

系统开始10s倒计时,表决人按下按键,表决人对应的LED灯就会发光,10s倒计时结束,数码管的第四位显示表决同意通过的人数,如果表决的人数大于等于4人时,数码管的第一位显示数字“1”,如果表决人数小于4人,数码管的第一位显示数字“0”。主持人看是否进行下一次的表决,如果进行下次表决,主持人就按下复位按键,开始新一轮的表决。如图4-2所示。

图4-2  子程序设计1流程图

4.2.2 子程序设计2

系统10s倒计时结束,数码管的第四位显示表决同意的结果,如果表决同意的人数大于等于4人时,数码管的第一位显示数字“1”,如果表决的人数小于4人时,数码管的第一位显示数字“0”。主持人看是否进行下一次的表决,如果进行下次表决,主持人就按下复位按键,开始新一轮的表决。如图4-3所示。

图4-2  子程序设计2图

5系统性能测试和结果分析

系统开始运行,主持人按下开始按键,蜂鸣器发给“滴滴”声,数码管的第3,4位开始进行10s的倒计时。如图5-1所示,数码管倒计时显示倒计时到了9s时的图形。

图5-1 系统开始运行

系统运行中,主持人可以紧急情况下按暂停按键,暂停表决,表决人可以按下自己对应的按键进行表决,当表决人按下自己的按键时,他自己对应的LED就会发光。如图5-2所示,数码管倒计时到3s的时候,有2号、3号、5号和7号表决人按下了自己的表决按键。

图5-2 系统运行中的图

系统运行结束后,数码管不再显示倒计时的数据,数码管的第一位会显示表决是否通过,通过即显示数字“1”,不通过即显示数字“0”,数码管的四位显示表决同意的人数。表决结束要开始新的表决主持人可以按下复位按键进行下一次的表决。如图5-3所示,10s倒计时结束,数码管的第四位显示为四,则说明有4人同意表决,由LED可以看出是2号、3号、5号和7号表决人同意表决,数码管第一位显示为数字“1”,则显示表决通过。

图5-3 系统运行结束图

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. sbit smg1=P2^4;                            //定义数码管第一位
  4. sbit smg2=P2^6;                            //定义数码管第二位
  5. sbit smg3=P2^7;                            //定义数码管第三位
  6. sbit smg4=P2^5;                            //定义数码管第四位

  7. sbit keyks=P2^2;              //定义开始按键
  8. sbit keyqc=P2^0;              //定义复位按键

  9. sbit key1=P1^0;                            //定义1号表决人            
  10. sbit key2=P1^1;                            //定义2号表决人
  11. sbit key3=P1^2;                            //定义3号表决人
  12. sbit key4=P1^3;                            //定义4号表决人
  13. sbit key5=P1^4;                            //定义5号表决人
  14. sbit key6=P1^5;                            //定义6号表决人
  15. sbit key7=P1^6;                            //定义7号表决人

  16. sbit l1=P3^0;                            //定义第1灯
  17. sbit l2=P3^1;                            //定义第2灯
  18. sbit l3=P3^2;                            //定义第3灯
  19. sbit l4=P3^3;                            //定义第4灯
  20. sbit l5=P3^4;                            //定义第5灯
  21. sbit l6=P3^5;                            //定义第6灯
  22. sbit l7=P3^6;                            //定义第7灯

  23. sbit zt=P2^1;   //定义暂停
  24. sbit spk=P1^7;                            //定义蜂鸣器

  25. int djs,js=0;                  //djs和bt是初始倒计时时间            
  26. //flag1~7用来保证在未开始表决之前误按   flagD用来控制是否显示倒计时  bjs表决计数
  27. int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flagD=0,bjs=0;            
  28. int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80,0x9b};
  29.       //   0    1   2    3    4    5    6     7    8     9      E
  30. void delayms(unsigned z)            
  31. {
  32.               unsigned x,y;
  33.     for(x=z;x>0;x--)
  34.       for(y=110;y>0;y--);  
  35. }

  36. void Timer0_init()                                          //定时器0初始化
  37. {
  38.     js=0;
  39.               TMOD=0x01;                                                        //设置定时器0为工作方式1(M1M0为01)
  40.               TH0=(65536-45872)/256;              //装初值11.0592M晶振定时50ms数为45872
  41.               TL0=(65536-45872)%256;                           
  42.               ET0=1;                                                                                    //开定时器0中断
  43.               EA=1;                                                                                    //开总中断
  44. }

  45. void timer0() interrupt 1 using 1              //定时器0中断服务函数
  46. {
  47.               TH0=(65536-45872)/256;                            //装初值11.0592M晶振定时50ms数为45872
  48.               TL0=(65536-45872)%256;            
  49.               js++;                                                                                    //叠加20次
  50.               if(js==20)
  51.               {
  52.                 js=0;                                                                                    //清空
  53.                 djs--;                                                                      //产生1s的倒计时
  54.               }
  55. }

  56. void djsxs()   //显示倒计时函数
  57. {            
  58.               int b1,b2;
  59.               b1=djs/10;
  60.               b2=djs%10;                                                          //将倒计时时间分成高低位
  61.               P0=table[b1];                                          
  62.               smg2=0;
  63.               delayms(3);
  64.               smg2=1;                                                                      //显示十位数字
  65.             
  66.               P0=table[b2];
  67.               smg3=0;
  68.               delayms(3);                                                        //显示个位数字
  69.               smg3=1;
  70. }
  71. void djsxs10() //第一位数码管显示 0
  72. {
  73.               P0=0x5f;                                          //第一位数码管显示0
  74.     smg1=0;
  75.     delayms(3);
  76.     smg1=1;
  77. }
  78. void djsxs11() //第一位数码管显示1
  79. {
  80.               P0=0x44;                                          //第一位数码管显示1
  81.     smg1=0;
  82.     delayms(3);
  83.     smg1=1;
  84. }
  85. void djsxs20() //第二位数码管显示 -
  86. {
  87.               P0=0x80;                                          //第二位数码管显示-
  88.               smg4=0;
  89.               delayms(3);                                            
  90.               smg4=1;
  91. }
  92. void djsxs30() //第三位数码管显示 -
  93. {
  94.               P0=0x80;                                          //第三位数码管显示-
  95.               smg2=0;
  96.               delayms(3);                                            
  97.               smg2=1;
  98. }
  99. void djsxs0()  //第四位数码管显示0
  100. {
  101.               P0=table[0];
  102.     smg3=0;
  103.     delayms(3);
  104.     smg3=1;                            //第四位数码管显示0

  105. }
  106. void djsxs1()  //第四位数码管显示1
  107. {
  108.               P0=table[1];                  //第四位数码管显示1
  109.     smg3=0;
  110.     delayms(3);
  111.     smg3=1;                                                         

  112. }
  113. void djsxs2()  //第四位数码管显示2
  114. {
  115.               P0=table[2];
  116.     smg3=0;
  117.     delayms(3);
  118.     smg3=1;                                                        //第四位数码管显示2

  119. }
  120. void djsxs3()  //第四位数码管显示3
  121. {
  122.               P0=table[3];
  123.     smg3=0;
  124.     delayms(3);
  125.     smg3=1;                                            //第四位数码管显示3

  126. }
  127. void djsxs4()  //第四位数码管显示4
  128. {
  129.               P0=table[4];
  130.     smg3=0;
  131.     delayms(3);
  132.     smg3=1;                                          //第四位数码管显示4

  133. }
  134. void djsxs5()  //第四位数码管显示5
  135. {
  136.               P0=table[5];
  137.     smg3=0;
  138.     delayms(3);
  139.     smg3=1;                               //第四位数码管显示5

  140. }
  141. void djsxs6()  //第四位数码管显示6
  142. {
  143.               P0=table[6];
  144.     smg3=0;
  145.     delayms(3);
  146.     smg3=1;                                          //第四位数码管显示6

  147. }
  148. void djsxs7()  //第四位数码管显示7
  149. {
  150.               P0=table[7];
  151.     smg3=0;
  152.     delayms(3);
  153.     smg3=1;                              //第四位数码管显示7
  154. }


  155. void main()
  156. {
  157.               int djs1=10;                                             //修改倒计时第一处,共两处
  158.               djs=10;                                           //修改倒计时第二处,共两处
  159.               bjs=0;                                                                         //表决计数
  160.               Timer0_init();             //初始化定时器中断
  161.               while(1)
  162.               {
  163. ////////////////////////////////////////////////////////////////////////////////////////////////                                                                                      
  164.               if(djs<=0)                                               //倒计时10s时间到
  165.               {
  166.                 flagD=0;                                                            //不再显示时间
  167.                 TR0=0;                                                           //关闭定时器
  168.                 flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0;              //关闭选手的按键
  169.                 djsxs20();djsxs30();                 //显示结果,此处显示  --
  170.                 switch(bjs)              //显示结果,此处显示 1或0(通不通过) --              同意人数
  171.                 {
  172.                             case 0:              djsxs0();djsxs10();  break;
  173.                             case 1: djsxs1();djsxs10();  break;     
  174.                             case 2:              djsxs2();djsxs10();  break;
  175.                             case 3: djsxs3();djsxs10();  break;
  176.                             case 4:              djsxs4();djsxs11();  break;
  177.                             case 5: djsxs5();djsxs11();  break;     
  178.                             case 6:              djsxs6();djsxs11();  break;
  179.                             case 7: djsxs7();djsxs11();  break;                                      
  180.                             default:  ;
  181.        }
  182.                 }
  183. ////////////////////////////////////////////////////////////////////////////////////////////////
  184.               if(flagD==1) djsxs();                 //显示倒计时函数
  185. ////////////////////////////////////////////////////////////////////////////////////////////////
  186.               if(keyks==0)  //开始按键
  187.               {            
  188.                  delayms(3);                            //去除按键抖动
  189.                  if(keyks==0)
  190.                  {
  191.                   while(!keyks);                //以上表示按下开始按键
  192.                             spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鸣器响响
  193.                             TR0=1;                                             //启动定时器 开始倒计时
  194.                   flagD=1;                               //显示倒计时函数
  195.                             bjs=0;                                             //归零
  196.                             flag1=1,flag2=1,flag3=1,flag4=1,flag5=1,flag6=1,flag7=1;//开启使能使选手按键按下有效
  197.                                           }
  198.                             }
  199. ////////////////////////////////////////////////////////////////////////////////////////////////
  200.               if(keyqc==0)  //复位按键
  201.               {            
  202.                             P3=0xff;
  203.                  delayms(3);                            //去除按键抖动
  204.                  if(keyqc==0)
  205.                  {
  206.                   while(!keyqc);                //以上表示按下开始按键
  207.                             spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鸣器响响
  208.                             TR0=0;                                             //关闭定时器
  209.                   djs=djs1;                               //倒计时10s重新赋值
  210.                                           }
  211.                             }
  212. ////////////////////////////////////////////////////////////////////////////////////////////////
  213.                             if(zt==0)    //暂停系统
  214.                             {
  215.                                           TR0=~TR0;
  216.                                           while(zt==0);
  217.                             }
  218. ///////////////////////////////////////////////////////////////////////////////////////////////
  219.               if((key1==0)&&(TR0==1)&&(flag1==1))              //在定时器运行状态下,key1==0 则说明1号表决人按下按键
  220.               {                           
  221.                             l1=0;
  222.                  delayms(3);
  223.               if(key1==0)
  224. ……………………

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

复制代码
以上的Word格式文档51黑下载地址(注意暂时不提供仿真文件):
7人多数表决器.doc (757 KB, 下载次数: 112)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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