久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3464|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于51的單片機(jī)的七人多數(shù)表決器程序仿真(14個表決按鍵)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 1979759100Ls 于 2022-5-20 02:40 編輯

原創(chuàng)!!!全網(wǎng)沒有找到,所以自己做了一個51單片機(jī)七人多數(shù)表決器!!
規(guī)定的要求如下:

用時兩天,創(chuàng)作不易,請留下點(diǎn)贊,myQ制作736142345,純粹個人興趣,現(xiàn)在分享給大家,還參考別人的文檔做了一個WORD說明書(文檔),也一并上傳了,在附件里,自取。
文件全部放在附件中了,自行下載,包含仿真、程序+詳細(xì)注釋,原理圖和PCB,非常詳細(xì)。實(shí)際測試仿真是完全沒問題的,實(shí)物沒來的及做,數(shù)碼管顯示可能會出現(xiàn)驅(qū)動不足的問題,增加控制端口的驅(qū)動即可,猜測是這樣,感興趣的可以試一試!歡迎積極留言討論。

  1. 單片機(jī)源程序如下:
  2. #include<reg51.h>
  3. #include<intrins.h>
  4. sbit smg1=P2^0;      //定義數(shù)碼管第一位
  5. sbit smg2=P2^1;      //定義數(shù)碼管第二位
  6. sbit smg3=P2^2;      //定義數(shù)碼管第三位
  7. sbit smg4=P2^3;      //定義數(shù)碼管第四位
  8. sbit smg5=P2^4;      //定義數(shù)碼管第五位
  9. sbit smg6=P2^5;      //定義數(shù)碼管第六位
  10. sbit keyks=P3^7;  //定義開始按鍵
  11. sbit spk=P3^2;       //定義蜂鳴器
  12. int djs,js=0;    //djs和js是初始倒計(jì)時時間
  13. int buzzbiaozhi=1;   //10S倒計(jì)時結(jié)束后蜂鳴器響一下的標(biāo)志位
  14. //int buzzbiaozhi1=1;    //開始投票按鍵按下標(biāo)志位//矩陣
  15. int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flag8=0,flag9=0,
  16. flag10=0,flag11=0,flag12=0,flag13=0,flag14=0,flagD=0,bjs=0;bjs1;bjs2;
  17. //flag1~14用來保證在同意和反對的唯一性 ,  flagD用來控制是否顯示倒計(jì)時, bjs表決總計(jì)數(shù),bjs1同意計(jì)數(shù),bjs2反對計(jì)數(shù)
  18. unsigned char key_num;   //按鍵鍵值返回值
  19. int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x77,0x5c,0X73,0X71};    /// 共陰   cc    數(shù)碼管段碼
  20. //      //    0    1   2    3    4    5    6     7    8    9   -     A   o     P f ///

  21. //******延時程序****//
  22. void delayms(unsigned z)
  23. {
  24.     unsigned x,y;
  25.     for(x=z;x>0;x--)
  26.       for(y=110;y>0;y--);   
  27. }

  28. ////****矩陣按鍵判鍵程序*****///
  29. unsigned char key_scan()          //有返回值
  30. {
  31.         unsigned char key_temp0,key_temp1;
  32.         unsigned char key_num=0;
  33.         P1=0x0f;
  34.         key_temp0=P1;                                   //讀取P1端口的值
  35.         if(key_temp0!=0x0f)
  36.         {
  37.                 delayms(5);                            //延時去抖動
  38.                 key_temp0=P1;                           //再次讀取P1端口的值
  39.                 if(key_temp0!=0x0f)
  40.                 {
  41.                     P1=0xf0;
  42.                     key_temp1=P1;
  43.                     if(key_temp0==0x0e)                    //判斷第一行
  44.                   {
  45.                       switch(key_temp1)
  46.                      {
  47.                        case 0xe0: key_num=4;break;          //檢測到第一行第四個鍵按下
  48.                        case 0xd0: key_num=3;break;          //檢測到第一行第三個鍵按下
  49.                        case 0xb0: key_num=2;break;          //檢測到第一行第二個鍵按下
  50.                        case 0x70: key_num=1;break;          //檢測到第一行第一個鍵按下
  51.                        default:key_num=0;break;
  52.                      }
  53.                     }
  54.                        else if(key_temp0==0x0d)                  //判斷第二行
  55.                         {
  56.                            switch(key_temp1)
  57.                                 {
  58.                                  case 0xe0: key_num=8;break;       //檢測到第二行第四個鍵按下
  59.                                  case 0xd0: key_num=7;break;       //檢測到第二行第三個鍵按下
  60.                                  case 0xb0: key_num=6;break;       //檢測到第二行第二個鍵按下
  61.                                  case 0x70: key_num=5;break;       //檢測到第二行第一個鍵按下
  62.                                  default:key_num=0;break;
  63.                                 }
  64.                         }
  65.                         else if(key_temp0==0x0b)                   //判斷第三行
  66.                         {
  67.                                 switch(key_temp1)
  68.                                 {
  69.                                  case 0xe0: key_num=12;break;         //檢測到第三行第四個鍵按下
  70.                                  case 0xd0: key_num=11;break;         //檢測到第三行第三個鍵按下
  71.                                  case 0xb0: key_num=10;break;         //檢測到第三行第二個鍵按下
  72.                                  case 0x70: key_num=9;break;         //檢測到第三行第一個鍵按下
  73.                                  default:key_num=0;break;
  74.                                 }
  75.                         }
  76.                         else if(key_temp0==0x07)                  //判斷第四行
  77.                         {
  78.                                 switch(key_temp1)
  79.                                 {
  80.                                  case 0xe0: key_num=16;break;        //檢測到第四行第四個鍵按下
  81.                                  case 0xd0: key_num=15;break;        //檢測到第四行第三個鍵按下
  82.                                  case 0xb0: key_num=14;break;        //檢測到第四行第二個鍵按下
  83.                                  case 0x70: key_num=13;break;         //檢測到第四行第一個鍵按下
  84.                                  default:key_num=0;break;
  85.                                 }
  86.                         }
  87.                 }
  88.         }
  89. return key_num;
  90. }



  91. void Timer0_init()          //定時器0初始化
  92. {
  93.     js=0;
  94.     TMOD=0x01;           //設(shè)置定時器0為工作方式1(M1M0為01)
  95.     TH0=(65536-50000)/256;   //裝初值12M晶振定時50ms數(shù)為50000,1US是1000初始值,所以50ms是5萬
  96.     TL0=(65536-50000)%256;      
  97.     ET0=1;                   //開定時器0中斷
  98.     EA=1;                    //開總中斷
  99. }

  100. void timer0() interrupt 1 using 1  //定時器0中斷服務(wù)函數(shù)
  101. {
  102.     TH0=(65536-50000)/256;      //裝初值12M晶振定時50ms數(shù)為50000
  103.     TL0=(65536-50000)%256;   
  104.     js++;                    //疊加20次
  105.     if(js==20)
  106.     {
  107.       js=0;                     //清空
  108.       djs--;                 //產(chǎn)生1s的倒計(jì)時
  109.      }
  110. }
  111. ///倒計(jì)時函數(shù)////
  112. void djsxs()   //第一位,第二位顯示倒計(jì)時函數(shù)
  113. {   
  114.     int b1,b2;
  115.     b1=djs/10;
  116.     b2=djs%10;             //將倒計(jì)時時間分成高低位
  117.     P0=table[b1];         
  118.     smg1=0;                     //第1位顯示十位
  119.     delayms(3);
  120.     smg1=1;                  //顯示十位數(shù)字
  121.     P0=table[b2];
  122.     smg2=0;                     //第2位顯示各位
  123.     delayms(3);              //顯示個位數(shù)字
  124.     smg2=1;
  125. }



  126. //**顯示P通過,顯示F沒通過**//
  127. void djsxs01() //第一位數(shù)碼管顯示 P表示通過
  128. {                                 
  129.     P0=0X73;          //第一位數(shù)碼管顯示P
  130.     smg1=0;
  131.     delayms(3);
  132.     smg1=1;
  133. }
  134. void djsxs10() //第一位數(shù)碼管顯示F 表示沒通過
  135. {
  136.     P0=0X71;          //第一位數(shù)碼管顯示F
  137.     smg1=0;
  138.     delayms(3);
  139.     smg1=1;
  140. }
  141. //**第三位顯示A,第五位顯示0**//  
  142. void djsxs20() //第三位數(shù)碼管顯示 A
  143. {
  144.     P0=0X77;          //第三位數(shù)碼管顯示A
  145.     smg3=0;
  146.     delayms(3);            
  147.     smg3=1;
  148. }
  149. void djsxs30() //第五位數(shù)碼管顯示 -
  150. {
  151.     P0=0x5c;          //第五位數(shù)碼管顯示0
  152.     smg5=0;
  153.     delayms(3);            
  154.     smg5=1;
  155. }
  156. ////*****計(jì)數(shù)顯示,第四位顯示同意人數(shù) *********///////
  157. void djsxs0()  //第四位數(shù)碼管顯示0
  158. {
  159.     P0=table[0];
  160.     smg4=0;
  161.     delayms(3);
  162.     smg4=1;       //第四位數(shù)碼管顯示0
  163. }
  164. void djsxs1()  //第四位數(shù)碼管顯示1
  165. {
  166.     P0=table[1];      //第四位數(shù)碼管顯示1
  167.     smg4=0;
  168.     delayms(3);
  169.     smg4=1;               
  170. }
  171. void djsxs2()  //第四位數(shù)碼管顯示2
  172. {
  173.     P0=table[2];
  174.     smg4=0;
  175.     delayms(3);
  176.     smg4=1;              //第四位數(shù)碼管顯示2
  177. }
  178. void djsxs3()  //第四位數(shù)碼管顯示3
  179. {
  180.     P0=table[3];
  181.     smg4=0;
  182.     delayms(3);
  183.     smg4=1;            //第四位數(shù)碼管顯示3
  184. }
  185. void djsxs4()  //第四位數(shù)碼管顯示4
  186. {
  187.     P0=table[4];
  188.     smg4=0;
  189.     delayms(3);
  190.     smg4=1;          //第四位數(shù)碼管顯示4
  191. }
  192. void djsxs5()  //第四位數(shù)碼管顯示5
  193. {
  194.     P0=table[5];
  195.     smg4=0;
  196.     delayms(3);
  197.     smg4=1;          //第四位數(shù)碼管顯示5
  198. }
  199. void djsxs6()  //第四位數(shù)碼管顯示6
  200. {
  201.     P0=table[6];
  202.     smg4=0;
  203.     delayms(3);
  204.     smg4=1;          //第四位數(shù)碼管顯示6
  205. }
  206. void djsxs7()  //第四位數(shù)碼管顯示7
  207. {
  208.     P0=table[7];
  209.     smg4=0;
  210.     delayms(3);
  211.     smg4=1;         //第四位數(shù)碼管顯示7
  212. }
  213. ////*****計(jì)數(shù)顯示,第六位顯示不同意人數(shù) *********///////
  214. void djsxs00()  //第六位數(shù)碼管顯示0
  215. {
  216.     P0=table[0];
  217.     smg6=0;
  218.     delayms(3);
  219.     smg6=1;       //第六位數(shù)碼管顯示0
  220. }
  221. void djsxs11()  //第六位數(shù)碼管顯示1
  222. {
  223.     P0=table[1];      //第六位數(shù)碼管顯示1
  224.     smg6=0;
  225.     delayms(3);
  226.     smg6=1;               
  227. }
  228. void djsxs22()  //第六位數(shù)碼管顯示2
  229. {
  230.     P0=table[2];
  231.     smg6=0;
  232.     delayms(3);
  233.     smg6=1;              //第六位數(shù)碼管顯示2

  234. }
  235. void djsxs33()  //第六位數(shù)碼管顯示3
  236. {
  237.     P0=table[3];
  238.     smg6=0;
  239.     delayms(3);
  240.     smg6=1;            //第六位數(shù)碼管顯示3
  241. }
  242. void djsxs44()  //第六位數(shù)碼管顯示4
  243. {
  244.     P0=table[4];
  245.     smg6=0;
  246.     delayms(3);
  247.     smg6=1;          //第六位數(shù)碼管顯示4
  248. }
  249. void djsxs55()  //第六位數(shù)碼管顯示5
  250. {
  251.     P0=table[5];
  252.     smg6=0;
  253.     delayms(3);
  254.     smg6=1;          //第六位數(shù)碼管顯示5
  255. }
  256. void djsxs66()  //第六位數(shù)碼管顯示6
  257. {
  258.     P0=table[6];
  259.     smg6=0;
  260.     delayms(3);
  261.     smg6=1;          //第六位數(shù)碼管顯示6
  262. }
  263. void djsxs77()  //第六位數(shù)碼管顯示7
  264. {
  265.     P0=table[7];
  266.     smg6=0;
  267.     delayms(3);
  268.     smg6=1;         //第六位數(shù)碼管顯示7
  269. }
  270. void main()
  271. {
  272.     //buzzbiaozhi1=0;          //開始按鍵標(biāo)志位//矩陣
  273.     bjs=0;                      //總表決計(jì)數(shù)
  274.      bjs1=0;                 //同意票數(shù)統(tǒng)計(jì)
  275.      bjs2=0;                 //反對票數(shù)統(tǒng)計(jì)
  276.      djs=10;                  //修改倒計(jì)時初始值
  277.      Timer0_init();             //初始化定時器中斷
  278.     while(1)
  279.     {
  280.       key_num=key_scan();
  281. //////    if(key_num==16)             ///測試按鍵位置   橫著按鍵排布為1 2 3 4第二排5 6 7 8,順延9 10 11 12,13 14 15 16//
  282. //////       { djsxs0();
  283. //////       }                                                               
  284. ////////////////////////////////////////////////////////////////////////////////////////////////                        
  285.      if(djs<=0)             //倒計(jì)時10s時間到
  286.      {
  287. //    buzzbiaozhi1=0;
  288.       flagD=0;                  //不再顯示時間
  289.       TR0=0;                //關(guān)閉定時器
  290.       flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0;flag8=0,flag9=0,flag10=0,flag11=0,flag12=0,flag13=0,flag14=0;    //關(guān)閉選手的按鍵                                                                        
  291. //    switch(bjs) //顯示結(jié)果,此處顯示 1或0(通不通過) --   同意人數(shù)
  292. //    {
  293. //     case 0:    djsxs10();break;
  294. //     case 1: djsxs10();break;      
  295. //     case 2:    djsxs10();break;                          //老方法太麻煩那
  296. //     case 3: djsxs10();break;
  297. //     case 4:    djsxs11();break;
  298. //     case 5: djsxs11();break;      
  299. //     case 6:    djsxs11();break;
  300. //     case 7: djsxs11();break;               
  301. //     default:  ;
  302. //       }
  303.        /////*****判斷是否通過******///////       //新方法好用
  304.        if(bjs1>=4) djsxs01();
  305.        if(bjs1<4) djsxs10();       //大于四票顯示通過,P代表通過 ,否則不通過 ,F(xiàn)表示

  306.    附件里下載哈
復(fù)制代碼

%C(1WJ}V[U77240T}2QU5}N.png (24.07 KB, 下載次數(shù): 72)

原理圖

原理圖

_~V9I[DR{FVS{WV([T)G0L2.png (49.59 KB, 下載次數(shù): 72)

PCB

PCB

0O66Q3~28H]IHXK51WR54R6.png (70.21 KB, 下載次數(shù): 134)

主流程圖

主流程圖

WJ84](1LIAQF73`1D0@E1UE.png (180.96 KB, 下載次數(shù): 148)

Proteus仿真效果圖

Proteus仿真效果圖

表決器程序 注釋.rar

42.85 KB, 下載次數(shù): 48, 下載積分: 黑幣 -5

程序

7人多數(shù)表決器設(shè)計(jì)嘿嘿嘿.docx

1.74 MB, 下載次數(shù): 27, 下載積分: 黑幣 -5

文檔

表決器仿真.rar

172.45 KB, 下載次數(shù): 36, 下載積分: 黑幣 -5

仿真

biaojueqi-yuanlitu -原理圖-模塊化.rar

3.57 MB, 下載次數(shù): 15, 下載積分: 黑幣 -5

pcb+原理圖

評分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:262 發(fā)表于 2022-5-15 05:25 | 只看該作者
難的一見的好作品,描述清楚,程序注釋詳細(xì)
PCB其實(shí)只要吧history目錄給刪掉再用7z貨rar壓縮就很小了,一般也就幾兆
回復(fù)

使用道具 舉報

板凳
ID:312929 發(fā)表于 2022-5-15 11:33 | 只看該作者
heicad 發(fā)表于 2022-5-15 05:25
難的一見的好作品,描述清楚,程序注釋詳細(xì)
PCB其實(shí)只要吧history目錄給刪掉再用7z貨rar壓縮就很小了,一般也 ...

那這樣他們就沒有封裝了吧,我試試哈
回復(fù)

使用道具 舉報

地板
ID:161164 發(fā)表于 2022-5-16 11:19 | 只看該作者
鍵盤掃描代碼不能掃到同時按鍵的情況
如第一行第二個鍵按下
key_temp1 = 0xB0
key_num = 2
這時第一行第一個鍵按下
key_temp1 = 0x30
switch 中沒有這 case
key_num = 0
然后第一行第一個鍵放開
key_temp1 = 0xB0
key_num = 2
第一行第一個鍵按下的情況被屏蔽了
就是說只要有人按著不放
那一行就會只有一個投票
回復(fù)

使用道具 舉報

5#
ID:312929 發(fā)表于 2022-5-16 11:23 | 只看該作者
lkc8210 發(fā)表于 2022-5-16 11:19
鍵盤掃描代碼不能掃到同時按鍵的情況
如第一行第二個鍵按下
key_temp1 = 0xB0

非常有道理,但是呢在表決過程中這個小細(xì)節(jié)我個人認(rèn)為是可以忽略的,到誰表決了再按鍵,表決完了下一個人,我是這樣理解的
回復(fù)

使用道具 舉報

6#
ID:161164 發(fā)表于 2022-5-16 11:56 | 只看該作者
本帖最后由 lkc8210 于 2022-5-16 12:00 編輯
1979759100Ls 發(fā)表于 2022-5-16 11:23
非常有道理,但是呢在表決過程中這個小細(xì)節(jié)我個人認(rèn)為是可以忽略的,到誰表決了再按鍵,表決完了下一個人 ...

還以為是10秒內(nèi)所有人一起表決
那還要啥矩陣鍵盤
只要三個按鍵接口:開始, 同意和反對
同意和反對鍵要多少并多少

回復(fù)

使用道具 舉報

7#
ID:312929 發(fā)表于 2022-5-16 14:59 | 只看該作者
lkc8210 發(fā)表于 2022-5-16 11:56
還以為是10秒內(nèi)所有人一起表決
那還要啥矩陣鍵盤
只要三個按鍵接口:開始, 同意和反對

那不是有要求的么老師故意布置的任務(wù),為了增加難度吧應(yīng)該
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久成人一区二区免费影院 | aaa综合国产 | 在线看片网站 | 久久精品国产99国产精品 | 国内精品视频免费观看 | 亚洲精品乱码久久久久久按摩观 | 久久久这里都是精品 | 国产精品成人在线 | 欧美精品中文字幕久久二区 | 欧美国产精品 | 久久99精品国产自在现线小黄鸭 | 国产亚洲精品久久久久动 | 亚洲区中文字幕 | 久久大香 | 中文字幕日韩欧美一区二区三区 | 久久久久一区二区三区 | 成人影院网站ww555久久精品 | 久久免费视频1 | 黑人精品xxx一区一二区 | 国产一级特黄aaa大片评分 | 精品一区欧美 | 99亚洲精品| 亚洲激情在线观看 | 日韩av一区二区在线观看 | 国产探花在线精品一区二区 | 国产精品欧美一区二区 | 亚洲美女视频 | 天堂成人国产精品一区 | 国产黄色大片在线免费观看 | 精品欧美乱码久久久久久 | 亚洲精品二区 | 日本在线中文 | 国产wwwcom | 国产成人精品一区二区三区网站观看 | 日韩在线| 在线视频一区二区 | 亚洲视频在线一区 | 午夜av一区二区 | av在线免费网站 | 国产免费福利小视频 | 最新中文在线视频 |