|
使用兩個(gè)運(yùn)放組成積分電路,比較器電路,結(jié)合單片機(jī)定時(shí)器計(jì)數(shù),測量ADC,并使用protues仿真實(shí)現(xiàn)
視頻連接:https://www.bilibili.com/video/av81800813/
單片機(jī)源程序如下:
- #include<reg52.h>
- //#include<absacc.h>
- //#include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define GPIO_DIG P0 //傳送數(shù)據(jù)的端口設(shè)為P0,以上端口根據(jù)實(shí)際硬件電路圖可做修改
- sbit S4=P2^3;
- sbit S3=P2^2; //使能信號
- sbit S2=P2^1; //讀寫控制信號
- sbit S1=P2^0; //數(shù)據(jù)命令選擇端口
- sbit P30=P3^0;
- sbit P31=P3^1;
- sbit P33=P3^3;
- uint ss,vin;
- uchar lo,kl = 0;
- //--定義全局變量--//
- unsigned char code DIG_CODE[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //0、1、2、3、4、5、6、7、8、9的顯示碼
- unsigned char DisplayData[4];
- //用來存放要顯示的4位數(shù)的值
- /****************10MS延時(shí)函數(shù)******************************/
- void Delay10ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 20;
- j = 113;
- do
- {
- while (--j);
- } while (--i);
- }
- /****************1MS延時(shí)函數(shù)******************************/
- void delay(unsigned int n)
- {
- unsigned int i,j;
- for(j=n;j>0;j--)
- for(i=112;i>0;i--);
- }
- void led_byte(unsigned int byte_data) //以十進(jìn)制的方式顯示一個(gè)字符變量
- {
- DisplayData[0] = ~DIG_CODE[(byte_data % 10000 /1000)]; //求千位數(shù)
- DisplayData[0] |= 0x80; //小數(shù)點(diǎn)
- DisplayData[1] = ~DIG_CODE[(byte_data%1000/100)]; //求百位數(shù)
- DisplayData[2] = ~DIG_CODE[(byte_data%100/10)]; //求十位數(shù)
- DisplayData[3] = ~DIG_CODE[(byte_data%10)]; //求個(gè)位數(shù)
- }
- /*******************************************************************************
- * 函 數(shù) 名 : DigDisplay
- * 函數(shù)功能 : 使用數(shù)碼管顯示
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void DigDisplay()
- {
- unsigned char i;
- led_byte(vin);
- for(i=0;i<4;i++)
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- S1=0;S2=1;S3=1;S4=1; break;//顯示第0位
- case(1):
- S1=1;S2=0;S3=1;S4=1; break;//顯示第1位
- case(2):
- S1=1;S2=1;S3=0;S4=1; break;//顯示第2位
- case(3):
- S1=1;S2=1;S3=1;S4=0; break;//顯示第3位
- }
- GPIO_DIG=DisplayData[i];//發(fā)送段碼
- delay(10); //掃描間隔時(shí)間設(shè)定
- GPIO_DIG=0x00;//消隱
- }
- }
- /**************數(shù)碼管顯示*************************/
- void my_t0(void) interrupt 1 //定時(shí)器0中斷用于固定時(shí)間對輸入待測電壓進(jìn)行積分
- {
- TR0 = 0; //T0中斷關(guān) ///
- TH0 = 0;
- TL0 = 0;
- lo++; ///
- TF0 = 0; //清除T0中斷標(biāo)志 ///
- TR0 = 1; //T0中斷開
- }
- void my_int0(void) interrupt 0 //外部中斷 用于反積分過程結(jié)束檢測
- {
- EX0 = 0; //INT0中斷關(guān)
- TR0 = 0; //T0中斷關(guān)
- TF0 = 0; //清除T0中斷標(biāo)志
- ss = TH0 * 256 + TL0;
- if(ss == 5) ss = vin; //解決數(shù)據(jù)緩存溢出BUG
- else {
- // ss = ss/10 + lo*6553 ; //計(jì)算電壓
- // ss = ss/10 + lo*6553 + 37; //補(bǔ)償系統(tǒng)誤差
-
- if((ss % 10000 /1000) < 4)
- vin = ss/10 + lo*6553 + ss/1000; //補(bǔ)償系統(tǒng)誤差
- else
- vin = ss/10 + lo*6553 + ss/2000;
- }
- TH0 = 0;
- TL0 = 0;
- kl = 1;
- lo = 0;
- ss = 0;
- EA = 0;
- }
- void main()
- {
- char i = 0;
- P33 = 0;
- P31 = 0; ///
- P30 = 1;
- kl = 0;
- EA = 1; //中斷開
- ET0 = 1; //定時(shí)計(jì)數(shù)0中斷開
- //IP = 1; //定時(shí)0中斷最高優(yōu)先級 =2
- TMOD = 0x01; //定時(shí)0,1模式1 2個(gè)16位定時(shí)/計(jì)數(shù)器
- EX0 = 1; //INT0中斷開
- TCON=0x01; //INT0負(fù)邊緣觸發(fā)或低電平觸發(fā)在此好象作用相同
- IT0 = 1;
- while(1)
- {
- if(kl == 1 && i == 20)
- {
- ss = 0;
- lo = 0;
- // vin = 0;
- TR0 = 0;
- P31 = 0;
- P33 = 0;
- P30 = 1; //選擇放電 ///
- delay(100);
-
- kl = 0;
- P30 = 0;
- P33 = 0;
- P31 = 1; //選擇輸入電壓
- Delay10ms();
-
- TH0 = 0;
- TL0 = 0;
- P31 = 0;
- P33 = 1; //選擇比較電壓
- TF0 = 0; //清除T0中斷標(biāo)志
- TR0 = 1; //定時(shí)計(jì)數(shù)0起動
- EX0 = 1;
- EA = 1;
- }
- i++;
- if(i==21) i=0; //徹底完成第一次轉(zhuǎn)換后進(jìn)行下一次轉(zhuǎn)換,防止互相干擾
- // delay(1);
-
-
- delay(1);
- DigDisplay();
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī)雙積分AD-數(shù)碼管.rar
(89.47 KB, 下載次數(shù): 49)
2020-1-4 12:11 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|