【1】題目要求
新建工程,以I/O模式編寫代碼,在CT107D單片機(jī)綜合訓(xùn)練平臺(tái)上,實(shí)現(xiàn)以下功能:
1、將IIC總線的底層驅(qū)動(dòng)代碼文件正確移植到工程中。
2、光敏電阻rd1接到PCF8591的AIN1通道;可調(diào)電阻rb2接到PCF8591的AIN3通道。
3、系統(tǒng)上電后,循環(huán)采樣AIN1通道和AIN3通道的電壓,并將A/D轉(zhuǎn)換結(jié)果讀出,換算成對(duì)應(yīng)的實(shí)際電壓值,保留2位小數(shù),單位為V。
4、在數(shù)碼管上顯示采樣的實(shí)時(shí)電壓數(shù)值,顯示格式如圖所示,數(shù)碼管靠左端的三位,顯示AIN1通道,即采樣光敏電阻rd1的電壓數(shù)值,數(shù)碼管靠右端的三位,顯示AIN3通道,即采樣可調(diào)電阻rd3的電壓數(shù)值,沒有使用的數(shù)碼管熄滅。
【小提示】:
IIC接口的基本原理,可見本博客:《【藍(lán)橋杯單片機(jī)進(jìn)階強(qiáng)化-01】IIC總線接口技術(shù)基礎(chǔ)》。
PCF8591的基本原理,可見本博客:《【藍(lán)橋杯單片機(jī)進(jìn)階強(qiáng)化-02】PCF8591的基本原理與A/D轉(zhuǎn)換應(yīng)用》文章來源:http://www.zghlxwxcb.cn/news/detail-412697.html
【2】核心源碼分析
/*==================藍(lán)橋杯單片機(jī)特訓(xùn)==================
【進(jìn)階05】:采樣光敏電阻與可調(diào)電阻的電壓
**平 臺(tái):CT107D單片機(jī)綜合實(shí)訓(xùn)平臺(tái)
**模 式:IO模式
**底層驅(qū)動(dòng)文件:2022年競(jìng)賽資源數(shù)據(jù)包提供的文件
**設(shè) 計(jì):歐浩源(小蜜蜂老師,ohy3686@qq.com)
**時(shí) 間:2022-04-01
**更多詳見:www.xmf393.com
====================================================*/
#include "reg52.h"
#include "iic.h"
//定義動(dòng)態(tài)顯示中單個(gè)數(shù)碼管點(diǎn)亮?xí)r長(zhǎng)
#define TSMG 500
//-------共陽(yáng)數(shù)碼管的段碼編碼表(無小數(shù)點(diǎn))--------
//0 1 2 3 4 5 6 7 8 9 A B C D E F - .
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
//-------共陽(yáng)數(shù)碼管的段碼編碼表(帶小數(shù)點(diǎn))--------
//0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
unsigned char code SMG_Dot[10]={0x40,0x79,
0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//-----------------------------------------------
unsigned char adc1_value = 0; //AIN1的采樣數(shù)據(jù)
float adc1_volt = 0; //AIN1的換算電壓
unsigned int smg1_volt = 0; //AIN1的顯示電壓
unsigned char adc3_value = 0; //AIN3的采樣數(shù)據(jù)
float adc3_volt = 0; //AIN3的換算電壓
unsigned int smg3_volt = 0; //AIN3的顯示電壓
/*====鎖存器設(shè)置和數(shù)碼管顯示的代碼參考前面的案例====*
//===================電壓值顯示函數(shù)===================
void DisplaySMG_ADC()
{
//數(shù)碼管右起第0位
DisplaySMG_Bit(7,SMG_NoDot[smg1_volt % 10]);
//數(shù)碼管右起第1位
DisplaySMG_Bit(6,SMG_NoDot[(smg1_volt / 10) % 10]);
//數(shù)碼管右起第2位
DisplaySMG_Bit(5,SMG_Dot[smg1_volt / 100]);
//數(shù)碼管右起第5位
DisplaySMG_Bit(2,SMG_NoDot[smg3_volt % 10]);
//數(shù)碼管右起第6位
DisplaySMG_Bit(1,SMG_NoDot[(smg3_volt / 10) % 10]);
//數(shù)碼管右起第7位
DisplaySMG_Bit(0,SMG_Dot[smg3_volt / 100]);
}
//===============PCF8591電壓采樣處理函數(shù)===============
unsigned char Read_PCF8591_ADC(unsigned char ain)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0x90); //PCF8591的寫設(shè)備地址
IIC_WaitAck();
if(ain == 1)
{
IIC_SendByte(0x01); //通道1,光敏電阻電壓
}
else if(ain == 3)
{
IIC_SendByte(0x03); //通道3,可調(diào)電阻電壓
}
IIC_WaitAck();
IIC_Stop();
DisplaySMG_ADC(); //等待電壓轉(zhuǎn)換完成
IIC_Start();
IIC_SendByte(0x91); //PCF8591的讀設(shè)備地址
IIC_WaitAck();
tmp = IIC_RecByte(); //讀出AD采樣數(shù)據(jù)
IIC_SendAck(1); //產(chǎn)生非應(yīng)答信號(hào)
IIC_Stop();
return tmp;
}
//=============采樣光敏電阻和可調(diào)電阻的電壓=============
void Read_AIN1_AIN3()
{
adc1_value = Read_PCF8591_ADC(1);
adc1_volt = adc1_value * (5.0 / 255);
smg1_volt = adc1_volt * 100;
adc3_value = Read_PCF8591_ADC(3);
adc3_volt = adc3_value * (5.0 / 255);
smg3_volt = adc3_volt * 100;
}
【注】:更多關(guān)于藍(lán)橋杯單片機(jī)備賽內(nèi)容,詳見《藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)》小蜜蜂特訓(xùn)手冊(cè),本站可下載,相關(guān)更多藍(lán)橋杯的案例完整源碼及學(xué)習(xí)備賽筆記,歡迎進(jìn)入?“小蜜蜂筆記”?公眾號(hào)。文章來源地址http://www.zghlxwxcb.cn/news/detail-412697.html
到了這里,關(guān)于藍(lán)橋杯單片機(jī) | 特訓(xùn)案例【進(jìn)階05】采樣光敏電阻與可調(diào)電阻的電壓的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!