|
可以隨便使用
請(qǐng)大家多多指教 ADC0832芯片
1、本設(shè)計(jì)基于STC89C51/52(與AT89S51/52、AT89C51/52通用)。
2、支持電壓,電流,電阻測(cè)量,通過數(shù)碼管顯示它們的數(shù)值
3、開關(guān)切換測(cè)量電壓、電流、電阻。通過調(diào)節(jié)滑動(dòng)變阻器來改變它們的大小。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (106.91 KB, 下載次數(shù): 41)
下載附件
2023-4-11 15:37 上傳
51hei.png (20.27 KB, 下載次數(shù): 35)
下載附件
2023-4-11 15:37 上傳
51hei.png (19.05 KB, 下載次數(shù): 34)
下載附件
2023-4-11 15:38 上傳
單片機(jī)源程序如下:
- #include <reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
- #include "intrins.h"
- #define u8 unsigned char
- #define u16 unsigned int
- #define uchar unsigned char
- #define uint unsigned int
-
- //按鍵
- sbit Key_V=P3^0; //電壓模式鍵
- sbit Key_R=P1^4; //電阻模式鍵
- sbit Key_I=P3^5; //電流模式鍵
- sbit Speak=P3^1; //電流模式鍵
- #define KEY_V 1 //電壓模式
- #define KEY_R 2 //電阻模式
- #define KEY_I 3 //電流模式
- /***********************************************************************************************************
- 數(shù)碼管顯示相關(guān)函數(shù)
- ***********************************************************************************************************/
- #define SMG_NUM 4
- u8 code DisplayNum[16]={
- 0xc0, //0
- 0x8e //F
- };
- //
- u8 code DisplayOther[]={
- 0xff, //0 空
- 0x7f, //1 "."
- 0xbf, //2 "-"
- 0xa7 //3 c
- };
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無
- ***********************************************************************/
- void delay_ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- //數(shù)碼管位選定義
- sbit smg_we1 = P2^0; //數(shù)碼管1
- sbit smg_we2 = P2^1; //數(shù)碼管2
- sbit smg_we3 = P2^2; //數(shù)碼管3
- sbit smg_we4 = P2^3; //數(shù)碼管4
- /***********************數(shù)碼位選函數(shù)*****************************/
- //i: 0,數(shù)碼管1
- // 1,數(shù)碼管2
- // 2,數(shù)碼管3
- // 3,數(shù)碼管4
- void smg_we_switch(uchar i)
- {
- switch(i)
- {
- case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
- case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
- case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
- case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
- }
- }
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- /********************************************************************
- * 名稱 : u8 ChangeFor(u8 dat)
- * 功能 : 交換一個(gè)字節(jié)位的位置,用于數(shù)碼管顯示
- * 輸入 : 需要改變的數(shù)
- * 輸出 : 改變后的數(shù)
- ***********************************************************************/
- #define LED_a 0 //數(shù)碼管段選的a段接在段選IO口的第0位
- #define LED_b 2
- #define LED_c 6
- #define LED_d 4
- #define LED_e 3
- #define LED_f 1
- #define LED_g 7
- #define LED_dp 5
- u8 ChangeFor(u8 dat)
- {
- u8 temp=0;
- if(dat&0x01) //判斷數(shù)據(jù)的第一位是否為1
- temp|=0x01<<LED_a;//如果為1,放到控制數(shù)碼管a段的位置
- if(dat&0x02)
- temp|=0x01<<LED_b;
- if(dat&0x04)
- temp|=0x01<<LED_c;
- if(dat&0x08)
- temp|=0x01<<LED_d;
- if(dat&0x10)
- temp|=0x01<<LED_e;
- if(dat&0x20)
- temp|=0x01<<LED_f;
- if(dat&0x40)
- temp|=0x01<<LED_g;
- if(dat&0x80)
- temp|=0x01<<LED_dp;
- return temp;
- }
- uchar dis_smg[SMG_NUM]; //顯示緩存數(shù)組
- /********************************************************************
- * 名稱 : display()
- * 功能 : 數(shù)碼管顯示
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void DisplayScan()
- {
- static uchar i;
- P0 = 0xff; //消隱
- smg_we_switch(i); //位選
- P0 = ChangeFor(dis_smg[i]); //段選
- i++;
- if(i>=SMG_NUM)
- i=0;
- }
- /***********************************************************************************************************
- ADC0832相關(guān)函數(shù)
- ***********************************************************************************************************/
- sbit ADCS =P1^2; //ADC0832 片選
- sbit ADCLK =P1^0; //ADC0832 時(shí)鐘
- sbit ADDI =P1^1; //ADC0832 數(shù)據(jù)輸入 /*因?yàn)閱纹瑱C(jī)的管腳是雙向的,且ADC0832的數(shù)據(jù)輸入輸出不同時(shí)進(jìn)行,
- sbit ADDO =P1^1; //ADC0832 數(shù)據(jù)輸出 /*為節(jié)省單片機(jī)引腳,簡(jiǎn)化電路所以輸入輸出連接在同一個(gè)引腳上
- //========================================================================
- // 函數(shù): unsigned int Adc0832(unsigned char channel)
- // 應(yīng)用: temp=Adc0832(0);
- // 描述: 讀取0通道的AD值
- // 參數(shù): channel:通道0和通道1選擇
- // 返回: 選取通道的AD值
- // 版本: VER1.0
- // 日期: 2015-05-29
- // 備注:
- //========================================================================
- unsigned int Adc0832(unsigned char channel)
- {
- uchar i=0;
- uchar j;
- uint dat=0;
- uchar ndat=0;
- uchar Vot=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令結(jié)束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收數(shù)據(jù)
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時(shí)鐘脈沖
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收數(shù)據(jù)
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次時(shí)鐘脈沖
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad data
- }
- /***********************************************************************************************************
- 主函數(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 //電阻電流鍵都沒有按下
- 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))//都沒有按下
- {
- 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];
- 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 > 100)
- Speak = 0;
- else
- Speak = 1;
- 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) //超過或等于1000;
- {
- dis_smg[1]=DisplayOther[2]; //顯示"-"
- dis_smg[2]=DisplayOther[2]; //顯示"-"
- dis_smg[3]=DisplayOther[2]; //顯示"-"
- }
-
- if(RIN > 500)
- Speak = 0;
- else
- Speak = 1;
- break;
- case 3:
- //電流模式
- IIN=4*Read_AD;//單位mA //換算出電流值
- dis_smg[0]=DisplayNum[0xc]; //顯示電流標(biāo)志
- if(IIN<=200) //沒有超過范圍
- {
- 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]; //顯示"-"
- .....代碼詳見附件.....
復(fù)制代碼
Keil代碼與Proteus7.8與8.13仿真和文檔下載:
基于51單片機(jī)數(shù)字萬用表測(cè)電壓電流電阻仿真設(shè)計(jì).7z
(1.02 MB, 下載次數(shù): 81)
2023-4-11 15:39 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|