h5做商城網(wǎng)站國(guó)內(nèi)最近的新聞大事
硬件
OLED
PCF8591
/** OLED* VCC GND* SCL接P2^0* SDA接P2^1*//** PCF8591* VCC GND* SCL接P1^4* SDA接P1^5*//* 板子上按鍵 P1.3 *//* 單片機(jī)ADC輸入引腳 P1.1 *//* 說(shuō)明:將PCF8591的DAC輸出接到單片機(jī)ADC輸入引腳 P1.1,單片機(jī)采集電壓并顯示 */
功能
這個(gè)程序是一個(gè)用于嵌入式系統(tǒng)的C語(yǔ)言程序,主要功能是控制一個(gè)數(shù)字模擬轉(zhuǎn)換器(DAC)輸出電壓,并通過(guò)模數(shù)轉(zhuǎn)換器(ADC)采集電壓值,同時(shí)在OLED顯示屏上實(shí)時(shí)顯示這兩組電壓數(shù)據(jù)。具體步驟和功能如下:
-
初始化: 程序開始時(shí),會(huì)停止看門狗定時(shí)器(WDT),并根據(jù)系統(tǒng)時(shí)鐘校準(zhǔn)常數(shù)進(jìn)行時(shí)鐘配置,確保系統(tǒng)穩(wěn)定運(yùn)行。接著初始化OLED顯示屏,并在其上顯示字符串"DAC:"和"ADC:"作為標(biāo)題。
-
DAC控制:
- 程序設(shè)定一個(gè)變量
dac_temp
來(lái)控制輸出電壓,默認(rèn)值為0.0。 - 通過(guò)公式
dac_value = dac_temp / 3.3 * 255
將期望的電壓值轉(zhuǎn)換成DAC能識(shí)別的數(shù)字量,并通過(guò)I2C協(xié)議寫入到地址0x90的設(shè)備的0x40寄存器中,實(shí)現(xiàn)電壓輸出控制。 - 同時(shí),將
dac_temp
對(duì)應(yīng)的電壓值格式化為字符串,并在OLED的第二行顯示該電壓值。
- 程序設(shè)定一個(gè)變量
-
ADC讀取與處理:
- 配置ADC10(10位模數(shù)轉(zhuǎn)換器),開啟中斷并設(shè)置采樣時(shí)間。
- 設(shè)置P1.3作為按鈕輸入,啟用內(nèi)部上拉電阻。
- 主循環(huán)中檢測(cè)按鈕狀態(tài),如果按鈕被按下,則增加
dac_temp
的值(每次增加0.1V,范圍限制在0到3V之間),并更新顯示的DAC電壓值及實(shí)際輸出電壓。 - 在主循環(huán)中啟動(dòng)ADC采樣與轉(zhuǎn)換,進(jìn)入低功耗模式等待轉(zhuǎn)換完成中斷。轉(zhuǎn)換完成后,計(jì)算得到的實(shí)際電壓值(0到3.3V范圍內(nèi)),將其擴(kuò)大100倍后轉(zhuǎn)換為整數(shù),格式化為字符串,并在OLED的第四行顯示ADC采集到的電壓值。
綜上所述,此程序?qū)崿F(xiàn)了一個(gè)簡(jiǎn)單的電壓控制系統(tǒng),用戶可以通過(guò)按鈕調(diào)節(jié)DAC輸出電壓,并實(shí)時(shí)查看設(shè)置的電壓值以及通過(guò)ADC采集到的電壓反饋值,所有數(shù)據(jù)顯示在連接的OLED顯示屏上。
部分程序
int main( void )
{unsigned char display[10], counta;float volt;int last_volt;int dac_temp = 0.0;uchar dac_value = 0;WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */if ( CALBC1_8MHZ == 0xFF ) /* If calibration constant erased */{while ( 1 ); /* do not load, trap CPU!! */}DCOCTL = 0; /* Select lowest DCOx and MODx settings */BCSCTL1 = CALBC1_8MHZ; /* Set range */DCOCTL = CALDCO_8MHZ; /* Set DCO step + modulation * / */OLED_Init(); /* OLED初始化 */OLED_ShowString( 0, 0, "DAC:" );OLED_ShowString( 0, 4, "ADC:" );/* 控制DAC輸出電壓 */dac_value = dac_temp / 3.3 * 255;Single_WriteI2C( 0x90, 0x40, dac_value ); /* 地址 寄存器 電壓 *//* DAC輸出電壓的顯示 */counta = 0;display[counta++] = dac_temp % 100 / 10 + '0'; /* SHI位數(shù)字 */display[counta++] = '.';display[counta++] = dac_temp % 10 + '0'; /* GE位數(shù)字 */display[counta++] = 'V';display[counta++] = 0;OLED_ShowString( 0, 2, display ); /* 在第2行顯示DAC電壓 *//* P1.1 ADC輸入引腳 */ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; /* ADC10ON, interrupt enabled */P1DIR &= ~BIT3; /*按鍵輸入引腳寄存器設(shè)置 */P1REN |= BIT3;P1OUT |= BIT3;while ( 1 ){if ( (P1IN & BIT3) == 0 ) /*按鍵按下去了 */{while ( (P1IN & BIT3) == 0 ); /*按鍵按下去了條件一直成立 */dac_temp = dac_temp + 1; /* 加0.1V */if ( dac_temp > 30 ) /* 電壓大于3V */{dac_temp = 0;}counta = 0;display[counta++] = dac_temp % 100 / 10 + '0'; /* SHI位數(shù)字 */display[counta++] = '.';display[counta++] = dac_temp % 10 + '0'; /* GE位數(shù)字 */display[counta++] = 'V';display[counta++] = 0;OLED_ShowString( 0, 2, display ); /* 在第2行顯示DAC電壓 */dac_value = (float) dac_temp / 10 / 3.3 * 255; /* 0到3.3轉(zhuǎn)換到 0到255 傳給模塊 */Single_WriteI2C( 0x90, 0x40, dac_value ); /* 地址 寄存器 電壓 */}ADC10CTL0 |= ENC + ADC10SC; /* Sampling and conversion start */__bis_SR_register( CPUOFF + GIE ); /* LPM0, ADC10_ISR will force exit */volt = (float) ADC10MEM * 3.3 / 1025; /* 得到電壓 0到3.3V */last_volt = (int) (volt * 100); /* 擴(kuò)大100倍 */counta = 0;display[counta++] = last_volt / 100 + '0'; /* 百位數(shù)字 */display[counta++] = '.';display[counta++] = last_volt % 100 / 10 + '0'; /* 十位數(shù)字 */display[counta++] = last_volt % 10 + '0'; /* 個(gè)位數(shù)字 */display[counta++] = 'V';display[counta++] = 0;OLED_ShowString( 0, 6, display ); /* 在第4行顯示ADC采集到的電壓 */}
}
全部程序
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2