- UID
- 373967
- 帖子
- 8828
- 主題
- 2609
- 精華
- 0
- 積分
- 994
- 楓幣
- 0
- 威望
- 971
- 存款
- 34543
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 453 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-13
|
EM78P157SYP8-G是一款8位元微控制器
需要以下零件才能製作多通道示波器:
EM78P157SYP8-G微控制器
電容:100nF、10uF
電阻:10KΩ、220Ω
訊號放大器:AD623AN
雙極性電容:1uF、0.1uF
低通濾波器:LM358
微動開關:12x12mm
示波器探針
以下是EM78P157SYP8-G微控制器的腳位連結:
P1.0 - 顯示器RS (寄存器選擇)
P1.1 - 顯示器EN (使能信號)
P1.2 - 顯示器D4
P1.3 - 顯示器D5
P1.4 - 顯示器D6
P1.5 - 顯示器D7
P1.6 - 訊號放大器輸入端
P1.7 - 示波器探針輸入端
以下是示波器的程式碼示例:
#include <REG_EM78P157S.h>
#define RS P10
#define EN P11
#define D4 P12
#define D5 P13
#define D6 P14
#define D7 P15
#define AMP_INPUT P16
#define PROBE_INPUT P17
void delay_us(unsigned int n)
{
unsigned int i;
while(n--)
{
i = 2;
while(--i);
}
}
void delay_ms(unsigned int n)
{
unsigned int i;
while(n--)
{
i = 5971;
while(--i);
}
}
void lcd_write_cmd(unsigned char cmd)
{
RS = 0;
EN = 1;
D7 = cmd & 0x80;
D6 = cmd & 0x40;
D5 = cmd & 0x20;
D4 = cmd & 0x10;
EN = 0;
delay_us(50);
EN = 1;
D7 = cmd & 0x08;
D6 = cmd & 0x04;
D5 = cmd & 0x02;
D4 = cmd & 0x01;
EN = 0;
delay_us(50);
}
void lcd_write_data(unsigned char data)
{
RS = 1;
EN = 1;
D7 = data & 0x80;
D6 = data & 0x40;
D5 = data & 0x20;
D4 = data & 0x10;
EN = 0;
delay_us(50);
EN = 1;
D7 = data & 0x08;
D6 = data & 0x04;
D5 = data & 0x02;
D4 = data & 0x01;
EN = 0;
delay_us(50);
}
void lcd_init(void)
{
delay_ms(20);
lcd_write_cmd(0x33);
lcd_write_cmd(0x32);
lcd_write_cmd(0x28);
lcd_write_cmd(0x0C);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);
delay_ms(2);
}
void adc_init(void)
{
// 初始化ADC
ADCON1 = 0x80; // 將ADC設定為單通道、左對齊、Fosc/8
ADCON0 = 0x81; // 啟用ADC、選擇AN1通道
}
unsigned int adc_read(unsigned char channel)
{
unsigned int adc_value;
ADCON0 &= 0xC5; // 清除通道選擇位元
ADCON0 |= (channel << 3); // 選擇通道
ADCON0 |= 0x04; // 啟動ADC轉換
while(ADCON0 & 0x04); // 等待ADC轉換完成
adc_value = ADRESH; // 讀取高位元
adc_value <<= 8;
adc_value |= ADRESL; // 讀取低位元
return adc_value;
}
void main()
{
unsigned int adc_value;
unsigned char str[16];
lcd_init(); // 初始化顯示器
adc_init(); // 初始化ADC
while(1)
{
adc_value = adc_read(1); // 讀取ADC值
sprintf(str, "ADC = %04d", adc_value); // 轉換為字串
lcd_write_cmd(0x80); // 設定顯示器為第一行
lcd_write_data('C'); // 輸出字元'C'
lcd_write_data('h'); // 輸出字元'h'
lcd_write_data('1'); // 輸出字元'1'
lcd_write_data(':'); // 輸出字元':'
lcd_write_cmd(0x85); // 設定顯示器為第一行第六個位置
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(' '); // 輸出空格
lcd_write_data(str[0]); // 輸出字串
lcd_write_data(str[1]);
lcd_write_data(str[2]);
lcd_write_data(str[3]);
lcd_write_data(str[4]);
lcd_write_data(str[5]);
lcd_write_data(str[6]);
lcd_write_data(str[7]);
lcd_write_data(str[8]);
lcd_write_data(str[9]);
lcd_write_data(str[10]);
lcd_write_data(str[11]);
lcd_write_data(str[12]);
lcd_write_data(str[13]);
lcd_write_data(str[14]);
lcd_write_data(str[15]);
delay_ms(200); // 稍微延遲一下
}
}
在這個程式碼中,我們首先將LCD初始化,然後設置ADC,然後進入無限迴圈。
在無限迴圈中,我們讀取ADC值,將其轉換為字串,然後輸出到LCD顯示器上。
程式會每200毫秒重複執行這個操作,因此LCD顯示器會以一定的頻率更新。 |
|