標題: 基于51單片機的投票表決器制作~~ [打印本頁]
作者: lvzhibi 時間: 2017-3-4 19:58
標題: 基于51單片機的投票表決器制作~~
1、前言
在社會高速發展的當下,各方各面效率的提升得到了人們的重視,投票表決環節也不例外。按照傳統的用紙條投票,會耽誤大量的時間,其中就包括制作紙條的時間,分發和回收紙條的時間。也許大家說手機網絡投票,網絡手機投票往往要要打開網頁,但前提是網速要好。在這種情況下,如果在座位旁安裝一個投票按鈕,隨手可按,輕松、隨意。這樣子既可以節省大量的時間和精力,同時也可以排除網絡不穩定而導致無法網絡投票的問題。這樣的一個投票系統,具有巨大的意義,充分節省時間和精力,有很大的便捷性,同時發揮了公平的原則,讓人人都可以表達出自己的意愿,有效調動了大家的積極性,提高大家對投票結果的認可度,減少了沖突的發生,并且實時傳遞出投票訊息,在一些比賽娛樂節目中具有很高的實用價值。
2、使用及應用說明
2.1、投票表決器的使用
根據使用方便原則,本投票表決器采用充電寶供電。將充電寶輸出端接于本投票表決器的USB接口上(由于買的USB接口比較廉價,需要按緊外皮后再插入到充電寶中),此時顯示屏亮起,顯示屏左邊數字表示反對票數目,對應于五對按鍵中的左方按鍵(×),顯示屏右邊數字表示贊成票數目,對應于五對按鍵中的右方按鍵(√)。通電以后,依次輸入贊成或者反對(即按下每一對按鍵左邊或者右邊的按鍵),然后按下藍色的確定按鍵,此時芯片判斷輸入的贊成反對票數,當贊成票數大于反對票數時,流水燈開始亮起顯示效果,贊成與反對票數相同時,黃燈亮起,反對票數大于贊成票數時,紅燈亮起,整個投票過程中顯示屏都實時顯示贊成和反對的票數。
若要進行下一次判斷或者需要重置票數,則按下左下方黃色按鈕,重置票數,此時顯示屏顯示0.0 ,以后即可進行下一次投票。
2.2、應用
當需要進行投票時,接通充電寶電源,
即可按照以上方法依次進行投票。
3、原理
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image002.jpg
本投票表決器是基于兩塊51單片機來制作的,右邊一塊的下方引腳用來讀取十二個獨立按鍵的電平值并進行分析,當單片機統計到贊成票數和反對票數的總數時,實時地給上端p口分配相應電平值以點亮數碼管相應段位(其中數碼管與單片機p口中間用了三極管擴流)。
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image004.jpg
三極管擴流
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image006.jpg
獨立按鍵
同時,單片機程序會對贊成票數和反對票數進行分析,若反對票數大于贊成票數時給予紅色LED管以高電平,若持平給予黃色LED管以高電平,若贊成票大于反對票將投票通過的結果通過串口(右邊單片機上端的一個p口)傳送到左邊單片機,左邊單片機執行點亮綠色LED愛心陣列的程序。
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image008.jpg
愛心陣列
本投票表決器通過usb口用充電寶作為5V電源供電,為解決工作電流太小而導致充電寶自動關閉的情況,我們在電源線兩端并聯了一個68歐姆的電阻,如下圖所示。
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image010.jpg
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image012.jpg
USB線
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image014.jpg
背面焊接圖
另外,我們在設計電路的過程中,給兩塊單片機芯片都分別預留了兩個p口,可以隨時對程序進行修改并燒錄進芯片。
心形燈接線原理圖:
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image016.jpg
附:
右邊單片機芯片源代碼為:
#include<reg51.h>
#include<intrins.h>
#defineAGREE_P P1
#defineDISAGREE_P P2
typedef unsigned char uchar;
sbit RESET_P = P3^3;
sbit RE_AGREE_P = P3^4;
sbit RE_EQUAL_P = P3^5;
sbit RE_DISAGREE_P = P3^6;
sbit SHOW_RESULT_P = P3^2;
bit TR0_5ms_FLAG = 0;
voidTimer0Init(void) //5毫秒@11.0592MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0xEE; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
ucharpops(uchar n){
char cnt = 0;
while(n){
if(n&0x01)
++cnt;
n >>= 1;
}
return cnt;
}
voidshow_result(uchar agree,uchar disagree,uchar init){
if(init){
RE_AGREE_P = 1;
RE_EQUAL_P = 1;
RE_DISAGREE_P = 1;
return ;
}
if(agree > disagree){
RE_AGREE_P = 0;
RE_EQUAL_P = 1;
RE_DISAGREE_P = 1;
}
else if(agree < disagree){
RE_AGREE_P = 1;
RE_EQUAL_P = 1;
RE_DISAGREE_P = 0;
}
else {
RE_AGREE_P = 1;
RE_EQUAL_P = 0;
RE_DISAGREE_P = 1;
}
}
void main()
{
uchar reset_p_last = 0;
uchar agree_p_last = 0x00;
uchar disagree_p_last = 0x00;
uchar agree_last = 0x00,disagree_last =0x00;
uchar agree,disagree;
uchar show_result_last = 0;
uchar show_on = 0;
uchar t;
show_result(0,0,1);
Timer0Init();
ET0 = 1;
EA = 1;
while(1){
if(TR0_5ms_FLAG){
TR0_5ms_FLAG = 0;
agree = RESET_P;
t = reset_p_last;
reset_p_last = agree;
if(!agree && t){
agree_p_last = 0x00;
disagree_p_last = 0x00;
agree_last = 0x00;
disagree_last = 0x00;
show_result_last = 0;
show_on = 0;
show_result(0,0,1);
continue;
}
agree = SHOW_RESULT_P;
t = show_result_last;
show_result_last = agree;
if(!agree && t){
show_on = 1;
}
agree = AGREE_P;
disagree = DISAGREE_P;
t = agree_p_last;
agree_p_last = agree;
agree = t & (~agree);
t = disagree_p_last;
disagree_p_last = disagree;
disagree = t & (~disagree);
agree_last |= agree;
disagree_last |= disagree;
if(show_on)
show_result(pops(agree_last),pops(disagree_last),0);
}
}
}
void tr0() interrupt1{
TL0 = 0x00; //設置定時初值
TH0 = 0xEE; //設置定時初值
TR0_5ms_FLAG = 1;
}
左邊單片機芯片源代碼為:
#include<reg51.h>
voiduart_init(void);
bitG_UART_RECVED;
bitG_TR0_FLAG;
unsignedchar g_uart_char = 0;
intg_tr0_cnt = 0;
void led_set(unsignedchar led_index,char on);
voidled_off(void);
sbit LED_13= P2^7;
sbit LED_14= P0^7;
#define BLINK_IM_MAX (4)
codeunsigned char blink_tm_by_50ms[BLINK_IM_MAX] = {2,2,4,12};
codeunsigned char blink_cnts[BLINK_IM_MAX] = {30,28,15,8};
#define LED_NUM (30)
void led_set(unsigned char led_index,char on){
unsignedchar t;
if(led_index< 7){
t =0x01<<(6-led_index);
if(on)
P2&= ~t;
else
P2|= t;
}
else if(led_index< 13){
t =0x01<<(14-led_index);
if(on)
P3&= ~t;
else
P3|= t;
}
elseif(led_index == 13){
LED_13 =on ? 0 : 1;
}
elseif(led_index == 14){
LED_14 =on ? 0 : 1;
}
elseif(led_index < 23){
t =0x01<<(22-led_index);
if(on)
P1&= ~t;
else
P1|= t;
}
elseif(led_index < 30){
t =0x01<<(led_index -23);
if(on)
P0&= ~t;
else
P0 |= t;
}
else {
;
}
}
void led_off(void){
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 |= 0xFC;
}
void led_on(void){
P0 = 0x00;
P1 = 0x00;
P2 = 0x00;
P3 &=0x03;
}
void tr0_init(void){ // 50ms
TMOD &=0xF0; //設置定時器模式
TMOD |=0x01; //設置定時器模式
TL0 =0x00; //設置定時初值
TH0 =0x4C; //設置定時初值
TF0 =0; //清除TF0標志
TR0 =0; //定時器0開始計時
ET0 = 1;
G_TR0_FLAG =0;
g_tr0_cnt =0;
}
void uart_init(void){
SCON = 0x50; //UART為模式1,8位數據,不允許接收
TMOD |= 0x20; //定時器1為模式2,8位自動重裝
PCON |= 0x80; //SMOD=1;
TH1 = 0xFD; //Baud:19200fosc="11".0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 =1; // timer 1 run
TI=1;
ES = 1;
}
void led_show(unsigned char blink_im,unsigned charblink_cnt){
if(!blink_cnt)
led_off();
switch(blink_im){
case 0 :if(blink_cnt)
led_set(blink_cnt-1,0);
led_set(blink_cnt,1);break;
case 1 : if(blink_cnt){
led_set(blink_cnt-1,0);
led_set(blink_cnt+2,1);
}
else {
led_set(0,1),led_set(1,1),led_set(2,1);
}
break;
case 2 :led_set(blink_cnt,1),led_set(29-blink_cnt,1);break;
case 3 :if(blink_cnt&0x01)
led_on();
else
led_off();
break;
default: ;
}
}
void main(){
charled_blink = 0;
unsignedchar blink_im_cnt = 0;
unsignedchar blink_cnt = 0;
tr0_init();
uart_init();
//G_UART_RECVED = 1;
//g_uart_char = 'S';
EA = 1;
while(1){
if(G_UART_RECVED){
G_UART_RECVED = 0;
switch(g_uart_char){
case'E' : led_blink = 0; led_off();TR0 = 0; break;
case'S' : led_blink = 1; blink_im_cnt = 0;
blink_cnt =0;
g_tr0_cnt =0;
G_TR0_FLAG = 0;
TR0 = 1;
break;
default: ;
}
}
if(G_TR0_FLAG){
G_TR0_FLAG = 0;
if(led_blink){
led_show(blink_im_cnt,blink_cnt);
if(++g_tr0_cnt == blink_tm_by_50ms[blink_im_cnt]){
g_tr0_cnt = 0;
if(++blink_cnt == blink_cnts[blink_im_cnt]){
blink_cnt = 0;
if(++blink_im_cnt == BLINK_IM_MAX){
G_UART_RECVED = 1;
g_uart_char = 'E';
}
}
}
}
}
}
}
void tr0_int() interrupt 1 {
TL0 =0x00; //設置定時初值
TH0 =0x4C; //設置定時初值
G_TR0_FLAG =1;
}
void uart_int() interrupt 4 {
if(TI){
TI = 0;
}
else {
RI = 0;
g_uart_char = SBUF;
G_UART_RECVED = 1;
}
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
亚洲免费观看视频网站
|
性大毛片视频
|
我想看一级黄色毛片
|
一区在线免费视频
|
婷婷综合色
|
日本亚洲欧美
|
久久久久久亚洲精品不卡
|
国产精品一区在线
|
久久久久久亚洲精品
|
色悠悠久
|
午夜在线
|
性高湖久久久久久久久3小时
|
久草视频网站
|
午夜影院网站
|
日韩在线一区二区
|
亚洲成在线观看
|
成人黄在线观看
|
国产一区二区三区
|
亚洲国产成人精
|
91成人在线视频
|
免费观看一级毛片
|
日韩精品在线观看一区二区三区
|
色视频成人在线观看免
|
国产欧美在线
|
自拍偷拍3p
|
天天躁日日躁狠狠躁2018小说
|
视频一区二区在线观看
|
在线黄av
|
www.国产|
国产伦精品一区二区三区照片91
|
拍戏被cao翻了h承欢
|
亚洲一区二区三区四区五区午夜
|
成人免费观看视频
|
免费观看羞羞视频网站
|
欧美午夜在线
|
久久国产精品一区二区
|
国产专区在线
|
www.av在线|
成人在线视频免费观看
|
亚洲日本欧美
|
日韩视频在线观看一区二区
|