- UID
- 373967
- 帖子
- 8822
- 主題
- 2609
- 精華
- 0
- 積分
- 994
- 楓幣
- 0
- 威望
- 971
- 存款
- 34510
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 452 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-12
|
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()。
|
|