|
本帖最后由 1979759100Ls 于 2022-5-20 02:40 編輯
原創(chuàng)!!!全網(wǎng)沒有找到,所以自己做了一個51單片機(jī)七人多數(shù)表決器!!
規(guī)定的要求如下:
51hei圖片20220514233102.png (254.18 KB, 下載次數(shù): 67)
下載附件
要求
2022-5-14 23:31 上傳
用時兩天,創(chuàng)作不易,請留下點(diǎn)贊,myQ制作736142345,純粹個人興趣,現(xiàn)在分享給大家,還參考別人的文檔做了一個WORD說明書(文檔),也一并上傳了,在附件里,自取。文件全部放在附件中了,自行下載,包含仿真、程序+詳細(xì)注釋,原理圖和PCB,非常詳細(xì)。實(shí)際測試仿真是完全沒問題的,實(shí)物沒來的及做,數(shù)碼管顯示可能會出現(xiàn)驅(qū)動不足的問題,增加控制端口的驅(qū)動即可,猜測是這樣,感興趣的可以試一試!歡迎積極留言討論。
- 單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- sbit smg1=P2^0; //定義數(shù)碼管第一位
- sbit smg2=P2^1; //定義數(shù)碼管第二位
- sbit smg3=P2^2; //定義數(shù)碼管第三位
- sbit smg4=P2^3; //定義數(shù)碼管第四位
- sbit smg5=P2^4; //定義數(shù)碼管第五位
- sbit smg6=P2^5; //定義數(shù)碼管第六位
- sbit keyks=P3^7; //定義開始按鍵
- sbit spk=P3^2; //定義蜂鳴器
- int djs,js=0; //djs和js是初始倒計(jì)時時間
- int buzzbiaozhi=1; //10S倒計(jì)時結(jié)束后蜂鳴器響一下的標(biāo)志位
- //int buzzbiaozhi1=1; //開始投票按鍵按下標(biāo)志位//矩陣
- int 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,flagD=0,bjs=0;bjs1;bjs2;
- //flag1~14用來保證在同意和反對的唯一性 , flagD用來控制是否顯示倒計(jì)時, bjs表決總計(jì)數(shù),bjs1同意計(jì)數(shù),bjs2反對計(jì)數(shù)
- unsigned char key_num; //按鍵鍵值返回值
- int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x77,0x5c,0X73,0X71}; /// 共陰 cc 數(shù)碼管段碼
- // // 0 1 2 3 4 5 6 7 8 9 - A o P f ///
- //******延時程序****//
- void delayms(unsigned z)
- {
- unsigned x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- ////****矩陣按鍵判鍵程序*****///
- unsigned char key_scan() //有返回值
- {
- unsigned char key_temp0,key_temp1;
- unsigned char key_num=0;
- P1=0x0f;
- key_temp0=P1; //讀取P1端口的值
- if(key_temp0!=0x0f)
- {
- delayms(5); //延時去抖動
- key_temp0=P1; //再次讀取P1端口的值
- if(key_temp0!=0x0f)
- {
- P1=0xf0;
- key_temp1=P1;
- if(key_temp0==0x0e) //判斷第一行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=4;break; //檢測到第一行第四個鍵按下
- case 0xd0: key_num=3;break; //檢測到第一行第三個鍵按下
- case 0xb0: key_num=2;break; //檢測到第一行第二個鍵按下
- case 0x70: key_num=1;break; //檢測到第一行第一個鍵按下
- default:key_num=0;break;
- }
- }
- else if(key_temp0==0x0d) //判斷第二行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=8;break; //檢測到第二行第四個鍵按下
- case 0xd0: key_num=7;break; //檢測到第二行第三個鍵按下
- case 0xb0: key_num=6;break; //檢測到第二行第二個鍵按下
- case 0x70: key_num=5;break; //檢測到第二行第一個鍵按下
- default:key_num=0;break;
- }
- }
- else if(key_temp0==0x0b) //判斷第三行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=12;break; //檢測到第三行第四個鍵按下
- case 0xd0: key_num=11;break; //檢測到第三行第三個鍵按下
- case 0xb0: key_num=10;break; //檢測到第三行第二個鍵按下
- case 0x70: key_num=9;break; //檢測到第三行第一個鍵按下
- default:key_num=0;break;
- }
- }
- else if(key_temp0==0x07) //判斷第四行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=16;break; //檢測到第四行第四個鍵按下
- case 0xd0: key_num=15;break; //檢測到第四行第三個鍵按下
- case 0xb0: key_num=14;break; //檢測到第四行第二個鍵按下
- case 0x70: key_num=13;break; //檢測到第四行第一個鍵按下
- default:key_num=0;break;
- }
- }
- }
- }
- return key_num;
- }
- void Timer0_init() //定時器0初始化
- {
- js=0;
- TMOD=0x01; //設(shè)置定時器0為工作方式1(M1M0為01)
- TH0=(65536-50000)/256; //裝初值12M晶振定時50ms數(shù)為50000,1US是1000初始值,所以50ms是5萬
- TL0=(65536-50000)%256;
- ET0=1; //開定時器0中斷
- EA=1; //開總中斷
- }
- void timer0() interrupt 1 using 1 //定時器0中斷服務(wù)函數(shù)
- {
- TH0=(65536-50000)/256; //裝初值12M晶振定時50ms數(shù)為50000
- TL0=(65536-50000)%256;
- js++; //疊加20次
- if(js==20)
- {
- js=0; //清空
- djs--; //產(chǎn)生1s的倒計(jì)時
- }
- }
- ///倒計(jì)時函數(shù)////
- void djsxs() //第一位,第二位顯示倒計(jì)時函數(shù)
- {
- int b1,b2;
- b1=djs/10;
- b2=djs%10; //將倒計(jì)時時間分成高低位
- P0=table[b1];
- smg1=0; //第1位顯示十位
- delayms(3);
- smg1=1; //顯示十位數(shù)字
- P0=table[b2];
- smg2=0; //第2位顯示各位
- delayms(3); //顯示個位數(shù)字
- smg2=1;
- }
- //**顯示P通過,顯示F沒通過**//
- void djsxs01() //第一位數(shù)碼管顯示 P表示通過
- {
- P0=0X73; //第一位數(shù)碼管顯示P
- smg1=0;
- delayms(3);
- smg1=1;
- }
- void djsxs10() //第一位數(shù)碼管顯示F 表示沒通過
- {
- P0=0X71; //第一位數(shù)碼管顯示F
- smg1=0;
- delayms(3);
- smg1=1;
- }
- //**第三位顯示A,第五位顯示0**//
- void djsxs20() //第三位數(shù)碼管顯示 A
- {
- P0=0X77; //第三位數(shù)碼管顯示A
- smg3=0;
- delayms(3);
- smg3=1;
- }
- void djsxs30() //第五位數(shù)碼管顯示 -
- {
- P0=0x5c; //第五位數(shù)碼管顯示0
- smg5=0;
- delayms(3);
- smg5=1;
- }
- ////*****計(jì)數(shù)顯示,第四位顯示同意人數(shù) *********///////
- void djsxs0() //第四位數(shù)碼管顯示0
- {
- P0=table[0];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示0
- }
- void djsxs1() //第四位數(shù)碼管顯示1
- {
- P0=table[1]; //第四位數(shù)碼管顯示1
- smg4=0;
- delayms(3);
- smg4=1;
- }
- void djsxs2() //第四位數(shù)碼管顯示2
- {
- P0=table[2];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示2
- }
- void djsxs3() //第四位數(shù)碼管顯示3
- {
- P0=table[3];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示3
- }
- void djsxs4() //第四位數(shù)碼管顯示4
- {
- P0=table[4];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示4
- }
- void djsxs5() //第四位數(shù)碼管顯示5
- {
- P0=table[5];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示5
- }
- void djsxs6() //第四位數(shù)碼管顯示6
- {
- P0=table[6];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示6
- }
- void djsxs7() //第四位數(shù)碼管顯示7
- {
- P0=table[7];
- smg4=0;
- delayms(3);
- smg4=1; //第四位數(shù)碼管顯示7
- }
- ////*****計(jì)數(shù)顯示,第六位顯示不同意人數(shù) *********///////
- void djsxs00() //第六位數(shù)碼管顯示0
- {
- P0=table[0];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示0
- }
- void djsxs11() //第六位數(shù)碼管顯示1
- {
- P0=table[1]; //第六位數(shù)碼管顯示1
- smg6=0;
- delayms(3);
- smg6=1;
- }
- void djsxs22() //第六位數(shù)碼管顯示2
- {
- P0=table[2];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示2
- }
- void djsxs33() //第六位數(shù)碼管顯示3
- {
- P0=table[3];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示3
- }
- void djsxs44() //第六位數(shù)碼管顯示4
- {
- P0=table[4];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示4
- }
- void djsxs55() //第六位數(shù)碼管顯示5
- {
- P0=table[5];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示5
- }
- void djsxs66() //第六位數(shù)碼管顯示6
- {
- P0=table[6];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示6
- }
- void djsxs77() //第六位數(shù)碼管顯示7
- {
- P0=table[7];
- smg6=0;
- delayms(3);
- smg6=1; //第六位數(shù)碼管顯示7
- }
- void main()
- {
- //buzzbiaozhi1=0; //開始按鍵標(biāo)志位//矩陣
- bjs=0; //總表決計(jì)數(shù)
- bjs1=0; //同意票數(shù)統(tǒng)計(jì)
- bjs2=0; //反對票數(shù)統(tǒng)計(jì)
- djs=10; //修改倒計(jì)時初始值
- Timer0_init(); //初始化定時器中斷
- while(1)
- {
- key_num=key_scan();
- ////// if(key_num==16) ///測試按鍵位置 橫著按鍵排布為1 2 3 4第二排5 6 7 8,順延9 10 11 12,13 14 15 16//
- ////// { djsxs0();
- ////// }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(djs<=0) //倒計(jì)時10s時間到
- {
- // buzzbiaozhi1=0;
- flagD=0; //不再顯示時間
- TR0=0; //關(guān)閉定時器
- 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)閉選手的按鍵
- // switch(bjs) //顯示結(jié)果,此處顯示 1或0(通不通過) -- 同意人數(shù)
- // {
- // case 0: djsxs10();break;
- // case 1: djsxs10();break;
- // case 2: djsxs10();break; //老方法太麻煩那
- // case 3: djsxs10();break;
- // case 4: djsxs11();break;
- // case 5: djsxs11();break;
- // case 6: djsxs11();break;
- // case 7: djsxs11();break;
- // default: ;
- // }
- /////*****判斷是否通過******/////// //新方法好用
- if(bjs1>=4) djsxs01();
- if(bjs1<4) djsxs10(); //大于四票顯示通過,P代表通過 ,否則不通過 ,F(xiàn)表示
- 附件里下載哈
復(fù)制代碼
|
-
%C(1WJ}V[U77240T}2QU5}N.png
(24.07 KB, 下載次數(shù): 72)
下載附件
2022-5-14 23:25 上傳
原理圖
-
_~V9I[DR{FVS{WV([T)G0L2.png
(49.59 KB, 下載次數(shù): 72)
下載附件
2022-5-14 23:25 上傳
PCB
-
0O66Q3~28H]IHXK51WR54R6.png
(70.21 KB, 下載次數(shù): 134)
下載附件
2022-5-14 23:25 上傳
主流程圖
-
WJ84](1LIAQF73`1D0@E1UE.png
(180.96 KB, 下載次數(shù): 148)
下載附件
2022-5-14 23:25 上傳
Proteus仿真效果圖
-
-
表決器程序 注釋.rar
2022-5-16 16:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
42.85 KB, 下載次數(shù): 48, 下載積分: 黑幣 -5
程序
-
-
7人多數(shù)表決器設(shè)計(jì)嘿嘿嘿.docx
2022-5-16 16:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.74 MB, 下載次數(shù): 27, 下載積分: 黑幣 -5
文檔
-
-
表決器仿真.rar
2022-5-16 16:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
172.45 KB, 下載次數(shù): 36, 下載積分: 黑幣 -5
仿真
-
-
biaojueqi-yuanlitu -原理圖-模塊化.rar
2022-5-20 02:39 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
3.57 MB, 下載次數(shù): 15, 下載積分: 黑幣 -5
pcb+原理圖
評分
-
查看全部評分
|