冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 683|回覆: 0
打印 上一主題 下一主題

[討論] PIC16F877A

[複製鏈接]

2609

主題

0

好友

945

積分

高級會員

Rank: 4

UID
373967
帖子
7378
主題
2609
精華
0
積分
945
楓幣
914
威望
925
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
405 小時
註冊時間
2023-1-12
最後登入
2024-4-27

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-30 09:40:44 |只看該作者 |倒序瀏覽
製作含勾錶的三用電表,你所需要的零件包括:

PIC16F877A 微控制器
AC/DC 交直流電表模組
16x2 字元液晶顯示器模組
4 顆按鈕開關
2 個 10K 歐姆電位器
電容:10uF、22pF
晶振:20MHz
電阻:1K、10K、220K、470K

以下是程式碼,使用 CCS C 編譯器:


#include <16F877A.h>
#include <stdlib.h>
#include <lcd.h>

#use delay(crystal=20000000)

// AC/DC 交直流電表模組連結腳位
#bit AC_DC = 0x08.0
#bit AC_DC_SEL = 0x08.1
#bit MEASURE = 0x08.2

// 顯示器模組連結腳位
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_E_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

// 10K 歐姆電位器連結腳位
#define POT1 PIN_A0
#define POT2 PIN_A1

// 按鈕開關連結腳位
#define BUTTON1 PIN_B0
#define BUTTON2 PIN_B1
#define BUTTON3 PIN_B2
#define BUTTON4 PIN_B3

// 電容連結腳位
#define CAPACITOR PIN_C0

float voltage;
char text[16];

void main()
{
    lcd_init();
    lcd_putc("3 in 1 Multimeter");
    delay_ms(1000);
    lcd_putc("\f");

    while(1)
    {
        // 顯示交直流切換選項
        lcd_gotoxy(1, 1);
        lcd_putc("AC/DC:");
        if(AC_DC_SEL == 0)
        {
            lcd_putc("DC");
        }
        else
        {
            lcd_putc("AC");
        }

        // 顯示電壓值
        if(MEASURE == 1)
        {
            if(AC_DC == 1)
            {
                // 測量交流電壓
                voltage = (float)analog(read_adc()) * 0.0196;
            }
            else
            {
                // 測量直流電壓
                voltage = (float)analog(read_adc()) * 0.0244;
            }

            // 顯示電壓值
            lcd_gotoxy(1, 2);
            sprintf(text, "Voltage:%.2fV", voltage);
            lcd_putc(text);
        }

        // 設定交直流切換按鈕
        if(input(BUTTON1) == 0

    {
        delay_ms(20);
        if(input(BUTTON1) == 0)
        {
            AC_DC_SEL = !AC_DC_SEL;
            delay_ms(50);
        }
    }

    // 設定測量按鈕
    if(input(BUTTON2) == 0)
    {
        delay_ms(20);
        if(input(BUTTON2) == 0)
        {
            MEASURE = !MEASURE;
            delay_ms(50);
        }
    }

    // 設定亮度調整
    if(input(BUTTON3) == 0)
    {
        delay_ms(20);
        if(input(BUTTON3) == 0)
        {
            // 顯示亮度調整提示
            lcd_putc("\f");
            lcd_gotoxy(1, 1);
            lcd_putc("Brightness:");
            lcd_gotoxy(1, 2);
            lcd_putc("Pot 1:    Pot 2:");

            while(input(BUTTON4) == 1)
            {
                // 顯示電位器值
                lcd_gotoxy(10, 2);
                sprintf(text, "%04lu", analog_read(POT1));
                lcd_putc(text);
                lcd_gotoxy(17, 2);
                sprintf(text, "%04lu", analog_read(POT2));
                lcd_putc(text);

                // 設定亮度
                lcd_backlight(1);
                delay_ms(analog_read(POT1) / 4);
                lcd_backlight(0);
                delay_ms(analog_read(POT2) / 4);
            }

            // 顯示回主畫面
            lcd_putc("\f");
        }
    }
}
}



程式碼中使用 `lcd.h` 標頭檔,需在 CCS C 編譯器中設定 Include 路徑。

程式碼中包含以下功能:

1. 顯示器初始化
2. 顯示器顯示 "3 in 1 Multimeter",延遲 1 秒後清除顯示
3. 顯示器顯示交直流切換選項和電壓值
4. 設定交直流切換按鈕,切換 AC/DC 模式
5. 設定測量按鈕,開啟或關閉電壓測量
6. 設定亮度調整按鈕,調整顯示器亮度
7. 顯示器支援亮度調整功能
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-4-28 01:56

回頂部