• 方案介紹
  • 附件下載
  • 推薦器件
  • 相關推薦
申請入駐 產業(yè)圖譜

基于51單片機簡易數字萬用表(電阻電流電壓測量)仿真設計

2024/09/10
3789
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

設計資料獲取聯(lián)系方式.doc

共1個文件

仿真圖proteus7.8及以上

程序編譯器:keil 4/keil 5

編程語言:C語言

設計編號:S0041

1.主要功能:

運用所學知識,制作一個51單片機簡易數字萬用表設計

具體功能:萬用表能夠切換測量電壓值、電流值以及電阻值,并且以四位數碼顯示,短路時會報警

1、電壓測量范圍0-20V,測量誤差0.5V左右

2、電流測量范圍0-200mA,測量誤差5mA左右

3、電阻測量范圍0-1000歐,誤差10歐左右

4、短路報警: 將待測兩點用導線相接,蜂鳴器發(fā)出聲音。

5、通過數碼管顯示測量數值,通過開關選擇測量類型。

以下為本設計資料展示圖:

2.仿真

開始仿真

開始仿真后可以通過撥動開關選擇測量類型,數碼管第一位顯示A表示測量電壓,B表示測量電阻,C表示測量電流。后三位顯示測量的值。如果同時選擇了兩種測量內容,蜂鳴器報警。

電壓檔測試:
在仿真時當將電壓檔開關打開,仿真結果如圖3.1所示。改變滑動變阻器相當于改變紅黑表筆接的不同回路進行電壓測量(可以在重新測量之前按下復位鍵進行復位后在進行測量)。通過R2,R3進行分壓,設測得的電壓U,則實際電壓U1=(U/R3)*R2;注:所測電壓大于20V講燒壞AD轉換器
img

電阻檔測試:
在進行電阻檔位仿真時首先進行復位鍵進行復位,待顯示清零以后再進行測量仿真,在仿真過程中改變滑動變阻器的位置相當于改變了紅黑表筆所接的不同阻值的電阻。如圖4.5所示,設測的電壓為U,則電路中電流I=(5-U)/100所測電阻R=U/I=U/((5-U)/100),注:電阻過大,則會造成測量不準確。
img

電流檔測試:
在進行電流測量時首先進行電流檔復位待顯示清零后在進行電流檔仿真,改變滑動變阻器相當于改變紅黑表筆接的不同回路進行電流測量。如圖4.4所示,在測量中若設測得的電壓為U:則電路中的電流為I=(U/5)*1000(MA);注:電流過大則會燒壞電阻R4;
img

3. 程序代碼

使用keil4或者keil5編譯,代碼有注釋,可以結合報告理解代碼含義。

img
主函數代碼

void main (void)
{
	u8 Mode;
	uchar Read_AD;	//用于讀取ADC數據
	uchar VIN;			//電壓值變量
	u16 RIN;				//電阻值變量
	u16 IIN;				//電流值變量
	u16 i=0;;
	while (1)      				//主循環(huán)
	{		
		if(Key_V==0)				//電壓按鍵按下
		{
			Key_V=1;					//清除按下標記
			if((Key_R==0)||(Key_I==0))//電阻電流按鍵也有按下
			{
				Key_I=1;
				Key_R=1;
				Key_V=1;
				Mode=4;					//標記為錯誤模式
			}
			else							//電阻電流鍵都沒有按下
			Mode=1;						//標記為電壓模式
		}
		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))//都沒有按下
		{
			Mode=0;			//標記為空閑模式
		}
		if(i==0)
		{
		Read_AD=Adc0832(0);				//讀取AD值
		}
		i++;
		if(i>300)
			i=0;
			switch(Mode)
		{
			case 0:
						//空閑模式
								dis_smg[0]=DisplayOther[2];//關閉數碼管顯示
								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];							//顯示電壓標志
								dis_smg[1]=DisplayNum[VIN/100%10];			//電壓十位
								dis_smg[2]=DisplayNum[VIN/10%10]&0x7f;	//電壓個位
								dis_smg[3]=DisplayNum[VIN%10];					//電壓十分位
								
								if(VIN > 160)	  //電壓檔大于16V報警
									Speak = 1;
								else
									Speak = 0;
			break;
			case 2:
						//電阻模式		
								RIN=Read_AD*100/(255-Read_AD);				//換算出電阻值
								dis_smg[0]=DisplayNum[0xb];       		//顯示電阻標志
								dis_smg[1]=DisplayNum[RIN/100%10];    //電阻百位
								dis_smg[2]=DisplayNum[RIN/10%10];     //電阻十位
								dis_smg[3]=DisplayNum[RIN%10];        //電阻個位
								if(RIN>=1000)													//超過或等于1000;
								{
									dis_smg[1]=DisplayOther[2];					//顯示"-"
									dis_smg[2]=DisplayOther[2];					//顯示"-"
									dis_smg[3]=DisplayOther[2];					//顯示"-"
								}
								
								if(RIN > 800)		 //電阻檔大于800報警
									Speak = 1;
								else
									Speak = 0;
			break;
			case 3:
						//電流模式		
								IIN=4*Read_AD;//單位mA								//換算出電流值
								dis_smg[0]=DisplayNum[0xc];           //顯示電流標志
								if(IIN<=200)													//沒有超過范圍
								{
									dis_smg[1]=DisplayNum[IIN/100%10];	//電流百位
									dis_smg[2]=DisplayNum[IIN/10%10]; 	//電流十位
									dis_smg[3]=DisplayNum[IIN%10];    	//電流個位
								}
								else
								{
									dis_smg[1]=DisplayOther[2];					//顯示"-"
									dis_smg[2]=DisplayOther[2];					//顯示"-"
									dis_smg[3]=DisplayOther[2];					//顯示"-"
								}
								
								if(IIN > 80)	 //電流檔大于80報警
									Speak = 1;
								else
									Speak = 0;
			break;
			case 4:
							Speak = 1;
						//錯誤模式		
							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();		//數碼管動態(tài)掃描
	}
}

概要:
定義了一些變量:

Mode 是一個8位無符號整數,用于存儲當前的模式(0-4)。
Read_AD 是一個8位無符號整數,用于存儲ADC(模擬到數字轉換器)的讀取值。
VIN 是一個16位無符號整數,用于存儲電壓值。
RIN 是一個16位無符號整數,用于存儲電阻值。
IIN 是一個16位無符號整數,用于存儲電流值。
i 是一個16位無符號整數,用于計數。
主循環(huán)(while(1))會一直運行,除非有中斷或異常使其停止。

在循環(huán)內部,根據按鍵的狀態(tài)設置 Mode。這里用到了三個條件判斷語句:

如果 Key_V 等于0(表示電壓按鍵被按下),檢查其他兩個按鍵是否也被按下。如果是,設置 Mode 為4(錯誤模式),否則設置 Mode 為1(電壓模式)。
如果 Key_R 等于0(表示電阻按鍵被按下),同樣的檢查流程,如果其他兩個按鍵沒有被按下,設置 Mode 為4,否則設置 Mode 為2(電阻模式)。
如果 Key_I 等于0(表示電流按鍵被按下),同樣的檢查流程,如果其他兩個按鍵沒有被按下,設置 Mode 為4,否則設置 Mode 為3(電流模式)。
如果所有按鍵都沒有被按下,設置 Mode 為0(空閑模式)。
在讀取ADC值時使用了函數 Adc0832(0),這可能是一個硬件相關的函數,用于從ADC設備讀取數據。

每300次讀取操作后重置計數器,以便重新開始計數。

根據不同的 Mode 執(zhí)行不同的操作:

在空閑模式下,關閉數碼管的顯示,并停止聲音輸出。
在電壓模式下,根據從ADC讀取的值計算電壓,并將其顯示在數碼管上。如果電壓大于160V,發(fā)出報警聲音。
在電阻模式下,根據從ADC讀取的值計算電阻,并將其顯示在數碼管上。如果電阻大于1000,在百位、十位和個位上都顯示"-"。

4. 設計資料內容清單&下載地址

資料設計資料包括仿真,程序代碼、講解視頻、功能要求、設計報告、軟硬件設計框圖。

0、常見使用問題及解決方法–必讀?。。。?br /> 1、仿真
2、代碼
3、講解視頻
4、功能要求
5、設計報告
6、軟硬件框圖
Altium Designer 軟件資料
KEIL 軟件資料
Proteus 軟件資料
雙擊打開更多 51 STM32單片機設計.url

img

資料下載鏈接(可點擊):

  • 設計資料獲取聯(lián)系方式.doc
    下載

推薦器件

更多器件
器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
NC7WZ04P6X 1 Rochester Electronics LLC LVC/LCX/Z SERIES, DUAL 1-INPUT INVERT GATE, PDSO6, 1.25 MM, ROHS COMPLIANT, EIAJ, SC-88, SC-70, 6 PIN
$0.33 查看
ABS07W-32.768KHZ-D-2-T 1 Abracon Corporation CRYSTAL 32.7680KHZ 3PF SMD

ECAD模型

下載ECAD模型
$5.11 查看
TLP185(GB,E(O 1 Toshiba America Electronic Components Optocoupler DC-IN 1-CH Transistor DC-OUT 4-Pin DIP SMD

ECAD模型

下載ECAD模型
$0.1 查看

相關推薦