操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    基于51單片機實現秒表

    前言

    基于51單片機實現一個共陽極數碼管的秒表。

    一、實現功能 二、關鍵程序 (1)key函數

    我們在這里要做的是按鍵按下抬起有效,所以這里對按鍵按下和抬起都要有一個判斷。另外就是模式的指定,定義變量Mode來存貯不同按鍵對應的模式。

    void key()
    {
        //啟動
        if (key1 == 0)
        {
            //消抖
            delay(500);
            if (key1 == 0) key_1 = 1;
        }
        //如果按鍵曾經按下過并且現在抬起了(按下抬起有效)
        if (key1 == 1 && key_1 == 1)
        {
            key_1 = 0;
            Mode = 1;
        }
        //暫停
        if (key2 == 0)
        {
            delay(500);
            if (key2 == 0) key_2 = 1;
        }
        if (key2 == 1 && key_2 == 1)
        {
            key_2 = 0;
            Mode = 2;
        }
        //清零
        if (key3 == 0)
        {
            delay(500);
            if (key3 == 0) key_3 = 1;
        }
        if (key3 == 1 && key_3 == 1)
        {
            key_3 = 0;
            //清零時暫停秒表
            Mode = 3;
            secs = 0;
            sec = 0;
            min = 0;
    

    c語言入門經典程序_數碼管秒表c語言程序_高質量程序設計指南c /c語言

    } }

    (2)函數

    函數決定了數碼管如何顯示數據。為了使數碼管的 dot 能夠實時閃爍(如下圖紅色方框所示),這里用到了 按位取或 和 按位取與 。

    實現 dot 閃爍的示例代碼如下:

    P0 = seg[sec % 10] & (flag | 0x7f);
    

    分析:共陽極數碼管是低電平有效,數碼管的小數點在不用時一般不顯示,需要顯示時,對于共陽數碼管,只需讓數字編碼數據的最高位設置為有效電平即可。例如,共陽型數碼管的小數點顯示時,字形編碼數據和0x7f與運算,就可讓最高位為0,而其他位數據不變。如果要讓小數點1秒鐘閃爍一次,需要利用一個1秒鐘內狀態變化一次的變量和0x7f進行按位取或運算數碼管秒表c語言程序數碼管秒表c語言程序,然后整體再和字形編碼數據進行按位取與運算。

    void display()
    {
        //清屏
        P0 = 0xff;
        switch (choice)
        {
    	    case 0:
    	        P0 = seg[secs % 10];
    	        P2 = 0xfe;
    	        break;
    	    case 1:
    	        P0 = seg[secs / 10];
    	        P2 = 0xfd;
    	        break;
    	    case 2:
    	        P0 = seg[sec % 10] & (flag | 0x7f);
    	        P2 = 0xfb;
    	        break;
    	    case 3:
    	        P0 = seg[sec / 10];
    	        P2 = 0xf7;
    	        break;
    	    case 4:
    	        P0 = seg[min % 10] & (flag | 0x7f);
    	        P2 = 0xef;
    	        break;
    	    case 5:
    	        P0 = seg[min / 10];
    	        P2 = 0xdf;
    	        break;
        }
        choice++;
        if (choice >= 6)
            choice = 0;
    }
    

    高質量程序設計指南c /c語言_數碼管秒表c語言程序_c語言入門經典程序

    (3)中斷函數

    中斷函數決定了秒表的時間,關鍵點在于時間刻度的轉換。

    void time() interrupt 1
    {
        //填充初始值
        TH0 = (65536 - 10000); //10ms
        TL0 = (65536 - 10000);
        //調用顯示函數
        display();
        //只有在模式1下秒表才能啟動,其他模式處于暫停態
        if (Mode == 1)
        {
            secs++;
        }
        if (secs > 99)
        { //100 * 10ms = 1s
            secs = 0;
            sec++;
        }
        if (sec > 59)
        {
            sec = 0;
            min++;
        }
        if (min > 99)
            min = 0;
    }
    

    三、完整程序

    #include 
    //定義段選數組
    unsigned char code seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
    //定義全局變量
    char choice, sec, min, secs, flag, key_1, key_2, key_3, Mode;
    //定義按鍵
    sbit key1 = P3 ^ 0;
    sbit key2 = P3 ^ 1;
    sbit key3 = P3 ^ 2;
    //定義延遲函數
    void delay(unsigned int x)
    {
        while (x--);
    }
    

    高質量程序設計指南c /c語言_數碼管秒表c語言程序_c語言入門經典程序

    //定義按鍵函數 void key() { //啟動 if (key1 == 0) { //消抖 delay(500); if (key1 == 0) key_1 = 1; } //如果按鍵曾經按下過并且現在抬起了 if (key1 == 1 && key_1 == 1) { key_1 = 0; Mode = 1; } //暫停 if (key2 == 0) { delay(500); if (key2 == 0) key_2 = 1; } if (key2 == 1 && key_2 == 1) { key_2 = 0; Mode = 2; } //清零 if (key3 == 0) { delay(500); if (key3 == 0) key_3 = 1; } if (key3 == 1 && key_3 == 1) { key_3 = 0; //清零時暫停秒表 Mode = 3; secs = 0; sec = 0; min = 0; } }

    高質量程序設計指南c /c語言_數碼管秒表c語言程序_c語言入門經典程序

    //初始化函數 void start() { //總控 EA = 1; //分控 ET0 = 1; //設置TMOD TMOD = 0x01; //填充初始值 TH0 = (65536 - 10000); TL0 = (65536 - 10000); //啟動 TR0 = 1; } //顯示函數 void display() { //清屏 P0 = 0xff; switch (choice) { case 0: P0 = seg[secs % 10]; P2 = 0xfe; break; case 1: P0 = seg[secs / 10]; P2 = 0xfd; break; case 2: P0 = seg[sec % 10] & (flag | 0x7f); P2 = 0xfb; break; case 3: P0 = seg[sec / 10]; P2 = 0xf7; break; case 4: P0 = seg[min % 10] & (flag | 0x7f); P2 = 0xef; break; case 5: P0 = seg[min / 10]; P2 = 0xdf; break;

    數碼管秒表c語言程序_高質量程序設計指南c /c語言_c語言入門經典程序

    } choice++; if (choice >= 6) choice = 0; } //設置時間中斷函數 void time() interrupt 1 { //填充初始值 TH0 = (65536 - 10000); //10ms TL0 = (65536 - 10000); //調用顯示函數 display(); if (Mode == 1) { secs++; } if (secs > 99) { //100 * 10ms = 1s secs = 0; sec++; } if (sec > 59) { sec = 0; min++; } if (min > 99) min = 0; } //主函數 void main() { //調用初始化函數 start(); while (1) { //調用按鍵函數 key(); } }

    四、仿真

    五、效果展示

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有