仿真圖proteus7.8及以上
程序編譯器:keil 4/keil 5
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):S0041
1.主要功能:
運(yùn)用所學(xué)知識(shí),制作一個(gè)51單片機(jī)簡(jiǎn)易數(shù)字萬(wàn)用表設(shè)計(jì)
具體功能:萬(wàn)用表能夠切換測(cè)量電壓值、電流值以及電阻值,并且以四位數(shù)碼顯示,短路時(shí)會(huì)報(bào)警
1、電壓測(cè)量范圍0-20V,測(cè)量誤差0.5V左右
2、電流測(cè)量范圍0-200mA,測(cè)量誤差5mA左右
3、電阻測(cè)量范圍0-1000歐,誤差10歐左右
4、短路報(bào)警: 將待測(cè)兩點(diǎn)用導(dǎo)線相接,蜂鳴器發(fā)出聲音。
5、通過(guò)數(shù)碼管顯示測(cè)量數(shù)值,通過(guò)開(kāi)關(guān)選擇測(cè)量類型。
以下為本設(shè)計(jì)資料展示圖:
2.仿真
開(kāi)始仿真
開(kāi)始仿真后可以通過(guò)撥動(dòng)開(kāi)關(guān)選擇測(cè)量類型,數(shù)碼管第一位顯示A表示測(cè)量電壓,B表示測(cè)量電阻,C表示測(cè)量電流。后三位顯示測(cè)量的值。如果同時(shí)選擇了兩種測(cè)量?jī)?nèi)容,蜂鳴器報(bào)警。
電壓檔測(cè)試:
在仿真時(shí)當(dāng)將電壓檔開(kāi)關(guān)打開(kāi),仿真結(jié)果如圖3.1所示。改變滑動(dòng)變阻器相當(dāng)于改變紅黑表筆接的不同回路進(jìn)行電壓測(cè)量(可以在重新測(cè)量之前按下復(fù)位鍵進(jìn)行復(fù)位后在進(jìn)行測(cè)量)。通過(guò)R2,R3進(jìn)行分壓,設(shè)測(cè)得的電壓U,則實(shí)際電壓U1=(U/R3)*R2;注:所測(cè)電壓大于20V講燒壞AD轉(zhuǎn)換器。
電阻檔測(cè)試:
在進(jìn)行電阻檔位仿真時(shí)首先進(jìn)行復(fù)位鍵進(jìn)行復(fù)位,待顯示清零以后再進(jìn)行測(cè)量仿真,在仿真過(guò)程中改變滑動(dòng)變阻器的位置相當(dāng)于改變了紅黑表筆所接的不同阻值的電阻。如圖4.5所示,設(shè)測(cè)的電壓為U,則電路中電流I=(5-U)/100所測(cè)電阻R=U/I=U/((5-U)/100),注:電阻過(guò)大,則會(huì)造成測(cè)量不準(zhǔn)確。
電流檔測(cè)試:
在進(jìn)行電流測(cè)量時(shí)首先進(jìn)行電流檔復(fù)位待顯示清零后在進(jìn)行電流檔仿真,改變滑動(dòng)變阻器相當(dāng)于改變紅黑表筆接的不同回路進(jìn)行電流測(cè)量。如圖4.4所示,在測(cè)量中若設(shè)測(cè)得的電壓為U:則電路中的電流為I=(U/5)*1000(MA);注:電流過(guò)大則會(huì)燒壞電阻R4;
3. 程序代碼
使用keil4或者keil5編譯,代碼有注釋,可以結(jié)合報(bào)告理解代碼含義。
主函數(shù)代碼
void main (void)
{
u8 Mode;
uchar Read_AD; //用于讀取ADC數(shù)據(jù)
uchar VIN; //電壓值變量
u16 RIN; //電阻值變量
u16 IIN; //電流值變量
u16 i=0;;
while (1) //主循環(huán)
{
if(Key_V==0) //電壓按鍵按下
{
Key_V=1; //清除按下標(biāo)記
if((Key_R==0)||(Key_I==0))//電阻電流按鍵也有按下
{
Key_I=1;
Key_R=1;
Key_V=1;
Mode=4; //標(biāo)記為錯(cuò)誤模式
}
else //電阻電流鍵都沒(méi)有按下
Mode=1; //標(biāo)記為電壓模式
}
if(Key_R==0) //同電壓鍵
{
Key_R=1;
if((Key_V==0)||(Key_I==0))
{
Key_I=1;
Key_R=1;
Key_V=1;
Mode=4;
}
else
Mode=2;
}
if(Key_I==0) //同電壓鍵
{
Key_I=1;
if((Key_V==0)||(Key_R==0))
{
Key_I=1;
Key_R=1;
Key_V=1;
Mode=4;
}
else
Mode=3;
}
if((Key_V==1)&&(Key_R==1)&&(Key_I==1))//都沒(méi)有按下
{
Mode=0; //標(biāo)記為空閑模式
}
if(i==0)
{
Read_AD=Adc0832(0); //讀取AD值
}
i++;
if(i>300)
i=0;
switch(Mode)
{
case 0:
//空閑模式
dis_smg[0]=DisplayOther[2];//關(guān)閉數(shù)碼管顯示
dis_smg[1]=DisplayOther[2];
dis_smg[2]=DisplayOther[2];
dis_smg[3]=DisplayOther[2];
Speak = 0;
break;
case 1:
//電壓模式
VIN=Read_AD*200/255; //換算出電壓值
dis_smg[0]=DisplayNum[0xa]; //顯示電壓標(biāo)志
dis_smg[1]=DisplayNum[VIN/100%10]; //電壓十位
dis_smg[2]=DisplayNum[VIN/10%10]&0x7f; //電壓個(gè)位
dis_smg[3]=DisplayNum[VIN%10]; //電壓十分位
if(VIN > 160) //電壓檔大于16V報(bào)警
Speak = 1;
else
Speak = 0;
break;
case 2:
//電阻模式
RIN=Read_AD*100/(255-Read_AD); //換算出電阻值
dis_smg[0]=DisplayNum[0xb]; //顯示電阻標(biāo)志
dis_smg[1]=DisplayNum[RIN/100%10]; //電阻百位
dis_smg[2]=DisplayNum[RIN/10%10]; //電阻十位
dis_smg[3]=DisplayNum[RIN%10]; //電阻個(gè)位
if(RIN>=1000) //超過(guò)或等于1000;
{
dis_smg[1]=DisplayOther[2]; //顯示"-"
dis_smg[2]=DisplayOther[2]; //顯示"-"
dis_smg[3]=DisplayOther[2]; //顯示"-"
}
if(RIN > 800) //電阻檔大于800報(bào)警
Speak = 1;
else
Speak = 0;
break;
case 3:
//電流模式
IIN=4*Read_AD;//單位mA //換算出電流值
dis_smg[0]=DisplayNum[0xc]; //顯示電流標(biāo)志
if(IIN<=200) //沒(méi)有超過(guò)范圍
{
dis_smg[1]=DisplayNum[IIN/100%10]; //電流百位
dis_smg[2]=DisplayNum[IIN/10%10]; //電流十位
dis_smg[3]=DisplayNum[IIN%10]; //電流個(gè)位
}
else
{
dis_smg[1]=DisplayOther[2]; //顯示"-"
dis_smg[2]=DisplayOther[2]; //顯示"-"
dis_smg[3]=DisplayOther[2]; //顯示"-"
}
if(IIN > 80) //電流檔大于80報(bào)警
Speak = 1;
else
Speak = 0;
break;
case 4:
Speak = 1;
//錯(cuò)誤模式
dis_smg[0]=DisplayNum[0xe]; //顯示"E"
dis_smg[1]=DisplayNum[0xe]; //顯示"E"
dis_smg[2]=DisplayNum[0xe]; //顯示"E"
dis_smg[3]=DisplayNum[0xe]; //顯示"E"
break;
default :
break;
}
DisplayScan(); //數(shù)碼管動(dòng)態(tài)掃描
}
}
概要:
定義了一些變量:
Mode 是一個(gè)8位無(wú)符號(hào)整數(shù),用于存儲(chǔ)當(dāng)前的模式(0-4)。
Read_AD 是一個(gè)8位無(wú)符號(hào)整數(shù),用于存儲(chǔ)ADC(模擬到數(shù)字轉(zhuǎn)換器)的讀取值。
VIN 是一個(gè)16位無(wú)符號(hào)整數(shù),用于存儲(chǔ)電壓值。
RIN 是一個(gè)16位無(wú)符號(hào)整數(shù),用于存儲(chǔ)電阻值。
IIN 是一個(gè)16位無(wú)符號(hào)整數(shù),用于存儲(chǔ)電流值。
i 是一個(gè)16位無(wú)符號(hào)整數(shù),用于計(jì)數(shù)。
主循環(huán)(while(1))會(huì)一直運(yùn)行,除非有中斷或異常使其停止。
在循環(huán)內(nèi)部,根據(jù)按鍵的狀態(tài)設(shè)置 Mode。這里用到了三個(gè)條件判斷語(yǔ)句:
如果 Key_V 等于0(表示電壓按鍵被按下),檢查其他兩個(gè)按鍵是否也被按下。如果是,設(shè)置 Mode 為4(錯(cuò)誤模式),否則設(shè)置 Mode 為1(電壓模式)。
如果 Key_R 等于0(表示電阻按鍵被按下),同樣的檢查流程,如果其他兩個(gè)按鍵沒(méi)有被按下,設(shè)置 Mode 為4,否則設(shè)置 Mode 為2(電阻模式)。
如果 Key_I 等于0(表示電流按鍵被按下),同樣的檢查流程,如果其他兩個(gè)按鍵沒(méi)有被按下,設(shè)置 Mode 為4,否則設(shè)置 Mode 為3(電流模式)。
如果所有按鍵都沒(méi)有被按下,設(shè)置 Mode 為0(空閑模式)。
在讀取ADC值時(shí)使用了函數(shù) Adc0832(0),這可能是一個(gè)硬件相關(guān)的函數(shù),用于從ADC設(shè)備讀取數(shù)據(jù)。
每300次讀取操作后重置計(jì)數(shù)器,以便重新開(kāi)始計(jì)數(shù)。
根據(jù)不同的 Mode 執(zhí)行不同的操作:
在空閑模式下,關(guān)閉數(shù)碼管的顯示,并停止聲音輸出。
在電壓模式下,根據(jù)從ADC讀取的值計(jì)算電壓,并將其顯示在數(shù)碼管上。如果電壓大于160V,發(fā)出報(bào)警聲音。
在電阻模式下,根據(jù)從ADC讀取的值計(jì)算電阻,并將其顯示在數(shù)碼管上。如果電阻大于1000,在百位、十位和個(gè)位上都顯示"-"。
4. 設(shè)計(jì)資料內(nèi)容清單&下載地址
資料設(shè)計(jì)資料包括仿真,程序代碼、講解視頻、功能要求、設(shè)計(jì)報(bào)告、軟硬件設(shè)計(jì)框圖。
0、常見(jiàn)使用問(wèn)題及解決方法–必讀?。。?!
1、仿真
2、代碼
3、講解視頻
4、功能要求
5、設(shè)計(jì)報(bào)告
6、軟硬件框圖
Altium Designer 軟件資料
KEIL 軟件資料
Proteus 軟件資料
雙擊打開(kāi)更多 51 STM32單片機(jī)設(shè)計(jì).url
資料下載鏈接(可點(diǎn)擊):