1、前言 在社會(huì)高速發(fā)展的當(dāng)下,各方各面效率的提升得到了人們的重視,投票表決環(huán)節(jié)也不例外。按照傳統(tǒng)的用紙條投票,會(huì)耽誤大量的時(shí)間,其中就包括制作紙條的時(shí)間,分發(fā)和回收紙條的時(shí)間。也許大家說手機(jī)網(wǎng)絡(luò)投票,網(wǎng)絡(luò)手機(jī)投票往往要要打開網(wǎng)頁,但前提是網(wǎng)速要好。在這種情況下,如果在座位旁安裝一個(gè)投票按鈕,隨手可按,輕松、隨意。這樣子既可以節(jié)省大量的時(shí)間和精力,同時(shí)也可以排除網(wǎng)絡(luò)不穩(wěn)定而導(dǎo)致無法網(wǎng)絡(luò)投票的問題。這樣的一個(gè)投票系統(tǒng),具有巨大的意義,充分節(jié)省時(shí)間和精力,有很大的便捷性,同時(shí)發(fā)揮了公平的原則,讓人人都可以表達(dá)出自己的意愿,有效調(diào)動(dòng)了大家的積極性,提高大家對(duì)投票結(jié)果的認(rèn)可度,減少了沖突的發(fā)生,并且實(shí)時(shí)傳遞出投票訊息,在一些比賽娛樂節(jié)目中具有很高的實(shí)用價(jià)值。 2、使用及應(yīng)用說明 2.1、投票表決器的使用 根據(jù)使用方便原則,本投票表決器采用充電寶供電。將充電寶輸出端接于本投票表決器的USB接口上(由于買的USB接口比較廉價(jià),需要按緊外皮后再插入到充電寶中),此時(shí)顯示屏亮起,顯示屏左邊數(shù)字表示反對(duì)票數(shù)目,對(duì)應(yīng)于五對(duì)按鍵中的左方按鍵(×),顯示屏右邊數(shù)字表示贊成票數(shù)目,對(duì)應(yīng)于五對(duì)按鍵中的右方按鍵(√)。通電以后,依次輸入贊成或者反對(duì)(即按下每一對(duì)按鍵左邊或者右邊的按鍵),然后按下藍(lán)色的確定按鍵,此時(shí)芯片判斷輸入的贊成反對(duì)票數(shù),當(dāng)贊成票數(shù)大于反對(duì)票數(shù)時(shí),流水燈開始亮起顯示效果,贊成與反對(duì)票數(shù)相同時(shí),黃燈亮起,反對(duì)票數(shù)大于贊成票數(shù)時(shí),紅燈亮起,整個(gè)投票過程中顯示屏都實(shí)時(shí)顯示贊成和反對(duì)的票數(shù)。 若要進(jìn)行下一次判斷或者需要重置票數(shù),則按下左下方黃色按鈕,重置票數(shù),此時(shí)顯示屏顯示0.0 ,以后即可進(jìn)行下一次投票。 2.2、應(yīng)用 當(dāng)需要進(jìn)行投票時(shí),接通充電寶電源,
即可按照以上方法依次進(jìn)行投票。
3、原理
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image002.jpg
本投票表決器是基于兩塊51單片機(jī)來制作的,右邊一塊的下方引腳用來讀取十二個(gè)獨(dú)立按鍵的電平值并進(jìn)行分析,當(dāng)單片機(jī)統(tǒng)計(jì)到贊成票數(shù)和反對(duì)票數(shù)的總數(shù)時(shí),實(shí)時(shí)地給上端p口分配相應(yīng)電平值以點(diǎn)亮數(shù)碼管相應(yīng)段位(其中數(shù)碼管與單片機(jī)p口中間用了三極管擴(kuò)流)。 file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image004.jpg 三極管擴(kuò)流 file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image006.jpg 獨(dú)立按鍵 同時(shí),單片機(jī)程序會(huì)對(duì)贊成票數(shù)和反對(duì)票數(shù)進(jìn)行分析,若反對(duì)票數(shù)大于贊成票數(shù)時(shí)給予紅色LED管以高電平,若持平給予黃色LED管以高電平,若贊成票大于反對(duì)票將投票通過的結(jié)果通過串口(右邊單片機(jī)上端的一個(gè)p口)傳送到左邊單片機(jī),左邊單片機(jī)執(zhí)行點(diǎn)亮綠色LED愛心陣列的程序。
file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image008.jpg 愛心陣列
本投票表決器通過usb口用充電寶作為5V電源供電,為解決工作電流太小而導(dǎo)致充電寶自動(dòng)關(guān)閉的情況,我們?cè)陔娫淳兩端并聯(lián)了一個(gè)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 背面焊接圖
另外,我們?cè)谠O(shè)計(jì)電路的過程中,給兩塊單片機(jī)芯片都分別預(yù)留了兩個(gè)p口,可以隨時(shí)對(duì)程序進(jìn)行修改并燒錄進(jìn)芯片。
心形燈接線原理圖: file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_image016.jpg
附: 右邊單片機(jī)芯片源代碼為: #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; //設(shè)置定時(shí)器模式 TMOD |= 0x01; //設(shè)置定時(shí)器模式 TL0 = 0x00; //設(shè)置定時(shí)初值 TH0 = 0xEE; //設(shè)置定時(shí)初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時(shí)器0開始計(jì)時(shí) }
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; //設(shè)置定時(shí)初值 TH0 = 0xEE; //設(shè)置定時(shí)初值 TR0_5ms_FLAG = 1; }
左邊單片機(jī)芯片源代碼為: #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; //設(shè)置定時(shí)器模式 TMOD |=0x01; //設(shè)置定時(shí)器模式 TL0 =0x00; //設(shè)置定時(shí)初值 TH0 =0x4C; //設(shè)置定時(shí)初值 TF0 =0; //清除TF0標(biāo)志 TR0 =0; //定時(shí)器0開始計(jì)時(shí) ET0 = 1; G_TR0_FLAG =0; g_tr0_cnt =0; }
void uart_init(void){ SCON = 0x50; //UART為模式1,8位數(shù)據(jù),不允許接收 TMOD |= 0x20; //定時(shí)器1為模式2,8位自動(dòng)重裝 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; //設(shè)置定時(shí)初值 TH0 =0x4C; //設(shè)置定時(shí)初值 G_TR0_FLAG =1; }
void uart_int() interrupt 4 { if(TI){ TI = 0; } else { RI = 0; g_uart_char = SBUF; G_UART_RECVED = 1; } }
|