冰楓論壇

標題: DELTA W78C52520C [打印本頁]

作者: 洪嵐峰    時間: 2023-4-10 19:02
標題: DELTA W78C52520C
DELTA W78C52520C 是一款微控制器,採用DIP-40封裝。它是由台達電子公司生產的,基於8051架構。

它的一些特點包括32KB的片上閃存存儲器,1KB的片上RAM,兩個16位定時器/計數器,可編程看門狗定時器,UART和32個I/O引腳。

它還具有低功耗和可以在廣泛的溫度範圍內運行的特性。

DELTA W78C52520C 微控制器可以用於製作電子秤,實現小數點後兩位的精度。

下面是相關的零件規格、連結腳位以及程序代碼:

零件規格:

DELTA W78C52520C 微控制器
一個 AD 模數轉換器 (ADC),例如 MAX1112
一個液晶顯示器 (LCD),例如 JHD162A
一個按鍵開關,例如 KSS-213C

連結腳位:
以下是 DELTA W78C52520C 微控制器的 DIP-40 封裝的引腳定義。
這裡列出了一些主要引腳的功能,以供參考。

引腳號        引腳名稱        功能
1        P0.0        I/O
2        P0.1        I/O
3        P0.2        I/O
4        P0.3        I/O
5        P0.4        I/O
6        P0.5        I/O
7        P0.6        I/O
8        P0.7        I/O
9        XTAL1        晶體振盪器輸入
10        XTAL2        晶體振盪器輸出
11        RESET        復位輸入
12        VDD        電源
13        P2.0        I/O
14        P2.1        I/O
15        P2.2        I/O
16        P2.3        I/O
17        P2.4        I/O
18        P2.5        I/O
19        P2.6        I/O
20        P2.7        I/O
21        ALE        地址鎖存器使能信號
22        PSEN        程序存儲器使能信號
23        P3.0        I/O
24        P3.1        I/O
25        P3.2        I/O
26        P3.3        I/O
27        P3.4        I/O
28        P3.5        I/O
29        P3.6        I/O
30        P3.7        I/O
31        EA        擴展存儲器訪問控制信號
32        ALE/PROG        地址鎖存器使能/編程
33        VSS        地
34        INT0        中
35        INT1        中斷輸入1
36        T0        定時器0計數器輸入
37        T1        定時器1計數器輸入
38        WR        寫控制信號
39        RD        讀控制信號
40        VDD        電源

程序代碼:

以下是用於實現電子秤功能的示例程序代碼。
請注意,該代碼可能需要根據您的具體應用進行修改和優化。


#include <reg52.h>

// 定義 AD 轉換器的引腳
sbit AD_CS = P3^0;   // 轉換器片選信號
sbit AD_CLK = P3^1;  // 轉換器時鐘信號
sbit AD_DIN = P3^2;  // 轉換器數據輸入
sbit AD_DOUT = P3^3; // 轉換器數據輸出

// 定義液晶顯示器的引腳
sbit LCD_RS = P2^0;  // 命令/數據選擇信號
sbit LCD_RW = P2^1;  // 讀/寫選擇信號
sbit LCD_EN = P2^2;  // 使能信號
sbit LCD_D4 = P2^4;  // 數據線 D4
sbit LCD_D5 = P2^5;  // 數據線 D5
sbit LCD_D6 = P2^6;  // 數據線 D6
sbit LCD_D7 = P2^7;  // 數據線 D7

// 定義按鍵開關的引腳
sbit KEY = P1^0;

// 定義全局變量
unsigned int weight;  // 秤重值,單位為 g
unsigned char lcd_buf[16]; // LCD 顯示緩存

// 函數聲明
void init_adc();
unsigned int read_adc();
void init_lcd();
void lcd_cmd(unsigned char cmd);
void lcd_data(unsigned char dat);
void lcd_display(unsigned char x, unsigned char y, unsigned char *str);
void delay(unsigned int t);

// 主函數
void main()
{
    // 初始化 ADC、LCD 和按鍵開關
    init_adc();
    init_lcd();

    while (1) {
        // 等待按鍵按下
        while (KEY);

        // 讀取秤重值
        weight = read_adc();

        // 顯示秤重值
        sprintf(lcd_buf, "Weight: %d.%02d g", weight / 100, weight % 100);
        lcd_display(0, 0, lcd_buf);

        // 等待按鍵釋放
        while (!KEY);
    }
}

// 初始化 ADC
void init_adc()
{
    // 設置引腳方向和初始狀態
    AD_CS = 1;
    AD_CLK = 0;
    AD_DIN = 0;
}

// 讀取 ADC 的值
unsigned int read_adc()
{
    unsigned int value = 0;
    unsigned char i;

    // 啟動轉換器
   
AD_CS = 0;
AD_CLK = 0;
AD_DIN = 1;
delay(1);
AD_CLK = 1;
AD_DIN = 0;
delay(1);
AD_CLK = 0;

// 讀取轉換結果
for (i = 0; i < 16; i++) {
    AD_CLK = 1;
    value <<= 1;
    value |= AD_DOUT;
    AD_CLK = 0;
}

// 停止轉換器
AD_CS = 1;

return value;
}

// 初始化 LCD
void init_lcd()
{
// 設置引腳方向和初始狀態
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
LCD_D4 = 0;
LCD_D5 = 0;
LCD_D6 = 0;
LCD_D7 = 0;

// 初始化命令
lcd_cmd(0x28); // 4 位數據總線,2 行顯示,5x8 點陣
lcd_cmd(0x0c); // 顯示開,光標不顯示,不閃爍
lcd_cmd(0x06); // 光標右移,字符不移動
lcd_cmd(0x01); // 清屏,光標回到起始位置
}

// 發送命令到 LCD
void lcd_cmd(unsigned char cmd)
{
LCD_RS = 0; // 選擇命令模式
LCD_RW = 0; // 選擇寫入模式
LCD_EN = 1; // 使能信號
LCD_D4 = cmd & 0x01; // 數據線 D4-D7 分別對應命令的低 4 位和高 4 位
LCD_D5 = (cmd >> 1) & 0x01;
LCD_D6 = (cmd >> 2) & 0x01;
LCD_D7 = (cmd >> 3) & 0x01;
delay(1); // 延時等待穩定
LCD_EN = 0; // 禁止信號
delay(1); // 延時等待穩定
}

// 發送數據到 LCD
void lcd_data(unsigned char dat)
{
LCD_RS = 1; // 選擇數據模式
LCD_RW = 0; // 選擇寫入模式
LCD_EN = 1; // 使能信號
LCD_D4 = dat & 0x01; // 數據線 D4-D7 分別對應數據的低 4 位和高 4 位
LCD_D5 = (dat >> 1) & 0x01;
LCD_D6 = (dat >> 2) & 0x01;
LCD_D7 = (dat >> 3) & 0x01;
delay(1); // 延時等待穩定
LCD_EN = 0; // 禁止信號
delay(1); // 延時等待穩定
}

// 在指定位置顯示字符串
void lcd_display(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char addr;

if (y == 0) {
    addr = 0
} else {
    addr = 0x40;
}
addr += x;

lcd_cmd(0x80 | addr);   // 設置顯示位置

while (*str != '\0') {
    lcd_data(*str++);
}
}

// 主函數
void main()
{
unsigned int value;
unsigned char str[17];

init_adc();     // 初始化 ADC
init_lcd();     // 初始化 LCD

while (1) {
    value = read_adc(0);    // 讀取 ADC 值
    sprintf(str, "%04d.%02d g", value / 100, value % 100);  // 格式化顯示字符串
    lcd_display(0, 0, str); // 在第一行顯示重量值
    delay(1000);    // 延時 1 秒
}
}

以上就是這段程序的主要內容,簡單來說,這個程序通過讀取 AD 轉換器的輸出值,然後將該值轉化為重量值,並通過 LCD 顯示模塊在屏幕上顯示出來。

具體實現過程中,程序首先調用了 init_adc() 函數初始化 ADC,然後調用 init_lcd() 函數初始化 LCD,接著進入主循環,不斷調用 read_adc() 函數讀取 ADC 值,將其轉換為重量值並格式化為字符串,最後通過 lcd_display() 函數在 LCD 屏幕上顯示出來,然後延時 1 秒,進入下一次循環。

需要注意的是,這個程序中使用了一些定義和函數,比如 AD_CS、AD_CLK、AD_DIN、AD_DOUT、LCD_RS、LCD_RW、LCD_EN、LCD_D4、LCD_D5、LCD_D6、LCD_D7、delay()、init_adc()、read_adc()、init_lcd()、lcd_cmd()、lcd_data() 和 lcd_display()。






歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓