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

標題: 基于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在线| 成人在线视频免费观看 | 亚洲日本欧美 | 日韩视频在线观看一区二区 |