冰楓論壇

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

[討論] PIC12F83 微型示波器

[複製鏈接]

2609

主題

0

好友

948

積分

高級會員

Rank: 4

UID
373967
帖子
7535
主題
2609
精華
0
積分
948
楓幣
1650
威望
927
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
411 小時
註冊時間
2023-1-12
最後登入
2024-5-16

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

跳轉到指定樓層
1
發表於 2023-4-9 09:46:06 |只看該作者 |倒序瀏覽
以下是使用PIC12F83微控制器實現微型示波器的簡單電路和代碼示例。

需要的零件如下:

PIC12F83微控制器
16x2字符LCD顯示器
10K歐姆電位器
適當的電容和電阻
杜邦線等連接線
連接腳位如下:

PIC12F83        LCD顯示器
GP0        RS
GP1        RW
GP2        E
GP3        D4
GP4        D5
GP5        D6
GP6        D7
GP7        10K歐姆電位器
GP0        輸入信號
其中,10K歐姆電位器用於調節LCD的對比度。

代碼示例如下:


#include <pic12f83.h>
#include <stdio.h>

#define _XTAL_FREQ 20000000 //晶振頻率

#define LCD_RS GP0
#define LCD_RW GP1
#define LCD_E GP2
#define LCD_D4 GP3
#define LCD_D5 GP4
#define LCD_D6 GP5
#define LCD_D7 GP6

#define INPUT GP7

void Delay_us(unsigned int t)
{
    while (t--)
    {
        __delay_us(1);
    }
}

void Delay_ms(unsigned int t)
{
    while (t--)
    {
        __delay_ms(1);
    }
}

void LCD_Enable(void)
{
    LCD_E = 1;
    Delay_us(1);
    LCD_E = 0;
    Delay_us(1);
}

void LCD_Write4bit(unsigned char dat)
{
    LCD_D4 = (dat >> 0) & 0x01;
    LCD_D5 = (dat >> 1) & 0x01;
    LCD_D6 = (dat >> 2) & 0x01;
    LCD_D7 = (dat >> 3) & 0x01;
    LCD_Enable();
}

void LCD_WriteCmd(unsigned char cmd)
{
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_Write4bit(cmd >> 4);
    LCD_Write4bit(cmd);
    Delay_us(50);
}

void LCD_WriteData(unsigned char dat)
{
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_Write4bit(dat >> 4);
    LCD_Write4bit(dat);
    Delay_us(50);
}

void LCD_Init(void)
{
    Delay_ms(100);
    LCD_WriteCmd(0x02);
    LCD_WriteCmd(0x28);
    LCD_WriteCmd(0x0c);
    LCD_WriteCmd(0x06);
}

void ADC_Init(void)
{
    ANSEL = 0b10000000; // GP7 as analog input
    TRISIO = 0b10000000; // GP7 as input
    ADCON0 = 0b10001101; // ADC on, GP7 as input, right justified, Fosc/8
    ADCON1 = 0b00000000; // Vref+ = VDD, Vref- = VSS
}

unsigned int ADC_Read(void)
{
    ADCON0bits.GO_DONE = 1; // start conversion
    while (ADCON0bits.GO_DONE); // wait for completion
    return (ADRESH << 8| ADRESL) + ADRESL; // combine ADRESH and ADRESL
}

void LCD_Clear(void)
{
LCD_WriteCmd(0x01);
}

void LCD_SetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;

scss
Copy code
if (y == 0)
{
    addr = 0x00 + x;
}
else
{
    addr = 0x40 + x;
}

LCD_WriteCmd(addr | 0x80);
}

void main(void)
{
unsigned int adc_val;
char buf[17];

OSCCON = 0b01111010; // internal oscillator, 8MHz
LCD_Init();
ADC_Init();
LCD_Clear();
LCD_SetCursor(0, 0);
LCD_WriteData('V');
LCD_WriteData('i');
LCD_WriteData('n');
LCD_SetCursor(0, 1);
LCD_WriteData('0');
LCD_WriteData('0');
LCD_WriteData('.');
LCD_WriteData('0');
LCD_WriteData('0');
LCD_WriteData('V');

while (1)
{
    adc_val = ADC_Read();
    sprintf(buf, "%04u.%02uV", adc_val * 5 / 1023, adc_val * 500 / 1023 % 100);
    LCD_SetCursor(3, 1);
    LCD_WriteData(buf[0]);
    LCD_WriteData(buf[1]);
    LCD_WriteData(buf[2]);
    LCD_SetCursor(4, 1);
    LCD_WriteData(buf[3]);
    LCD_WriteData(buf[4]);
    LCD_SetCursor(6, 1);
    LCD_WriteData(buf[5]);
    LCD_WriteData(buf[6]);
    LCD_WriteData(buf[7]);
    Delay_ms(100);
}
}



此代碼使用單個模擬輸入(GP7)讀取輸入信號,並使用LCD顯示輸入電壓。
在LCD上,第一行顯示“Vin”,第二行顯示輸入電壓的值。
代碼中使用的ADC轉換電壓範圍為0V至5V,並將其轉換為1023個步驟。
使用sprintf函數將ADC值轉換為字符串,然後將其寫入LCD顯示器。
此外,該程序還使用了延遲函數來控制LCD刷新速度。
收藏收藏0 推0 噓0


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

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

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

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

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

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

GMT+8, 2024-5-16 23:23

回頂部