STC單片機(jī)比較器用作AD例程
所有源程序下載:
比較器做AD用.zip
(49.18 KB, 下載次數(shù): 123)
2016-12-19 10:56 上傳
點(diǎn)擊文件名下載附件
部分源碼預(yù)覽:
- //工作頻率為20M
- #include <STC15F2K60S2.H>
- #include <intrins.h>
- #include"CMP-AD.H"
- #include"math.h"
- #define uint unsigned int
- #define ulint unsigned long int
- #define uchar unsigned char
- //對ADC控制寄存器ADC_CONTR進(jìn)行位定義 (ADC_CONTR寄存器不能進(jìn)行位操作)
- #define ENABLE_IAP 0x82 //if SYSCLK<20MH
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標(biāo)志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
- #define ADC_SPEEDL 0x20 //360個(gè)時(shí)鐘
- #define ADC_SPEEDH 0x40 //180個(gè)時(shí)鐘
- #define ADC_SPEEDHH 0x60 //90個(gè)時(shí)鐘
- #define CH6 6
- sfr ADC_LOW2=0XBE; //ADC低2位結(jié)果
- //sbit P_ADC=P3^3; //定義比價(jià)器的輸出口
- sbit P_ADC=P1^4; //定義比價(jià)器的輸出口
- sbit power=P3^3; //主電源開機(jī)使能位
- sbit in_ac=P3^2; //AC輸入電壓類型 1:AC60V 0:AC90v
- sbit smg1=P1^5;
- sbit smg2=P1^6;
- sbit smg3=P1^7;
- uchar ch=0;
- uchar i_t2;
- uint t0val; //定時(shí)器0的初值
- uint t2val; //定時(shí)器2的初值
- uint adc_scal; //AD量程
- uint adc_count; //比較結(jié)果為高計(jì)數(shù)
- uint adc_duty; //ADC計(jì)數(shù)周期
- uint adc_val; //ADC值
- bit adc_ok; //ADC轉(zhuǎn)換完成標(biāo)志
- uchar ok_count; //AD采集次數(shù)
- bit one_ok; //取樣完成標(biāo)志
- ulint val1,val2; //中間臨時(shí)值
- uint rmsval; //輸入電壓有效值
- uchar smgval[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar temp[4];
- uchar i;
- //1ms延時(shí)子程序
- void delay(uint x)
- {uint a,b;
- for (a=x; a>0;a--)
- for (b=100;b>0; b--);
- }
- //AD初始化程序
- void intad()
- { ch=0;
- P1ASF = 0x01 ; //設(shè)置P1口為AD口
- ADC_RES = 0; //清除結(jié)果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | ch;
- delay(2);
- }
- //讀取AD結(jié)果
- int getad()
- {ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ch|ADC_START;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR&ADC_FLAG)) ;
- ADC_CONTR=~ADC_CONTR;
- return ((uint)((uint)(ADC_RES<<2)+(uint)(ADC_LOW2)));
- }
- //主程序初始化
- void int_main()
- {
- intad();
- P3M1=0;
- P3M0=0XFF;
- P1M1=0;
- P1M0=0Xf0;
- /////////////
- power=0;
- in_ac=1; //剛上電時(shí)候先關(guān)閉主電源
- P5M1=0XFF;
- P5M0=0; //P54 P55設(shè)為高阻狀態(tài)
- adc_scal=500; //AD量程
- adc_duty=adc_scal;
- //P3M0=0X80; //P33為強(qiáng)推挽模式 P32為準(zhǔn)雙向口模式
- CMPCR1=0; //比價(jià)器寄存器1初始化
- CMPCR2=0; //比較器寄存器2初始化
- CMPCR1&=~PIS; //選擇P55腳為比較器的正極輸入端
- CMPCR1|= NIS; //選擇P54腳為比較器的負(fù)極輸入端
- CMPCR1&=~CMPOE; //禁止比較器的結(jié)果輸出
- CMPCR2&=~INVCMPO; //比機(jī)器結(jié)果正常輸出
- CMPCR2|=DISFLT; //不使能比較器輸出0.1us濾波
- CMPCR2&=~LCDTY; //比較器結(jié)果不去抖 直接輸出
- CMPCR1|=CMPEN; //使能比機(jī)器
- t0val=55536; //定時(shí)器0定時(shí)時(shí)間為0.5ms
- t2val=45536; //定時(shí)器0定時(shí)時(shí)間為1ms
- TH0=t0val>>8;
- TL0=t0val;
- T2H=t2val>>8;
- T2L=t2val;
- AUXR=0X94; //定時(shí)器0的速度為傳統(tǒng)8051的12倍,即不分頻 允許定時(shí)器2運(yùn)行 速度為1分頻
- //IE2|=ET2; //定時(shí)器2中斷開啟
- TMOD=0; //定時(shí)器0工作模式為16位自動重裝
- ET0=1; //允許T0中斷
- TR0=1; //定時(shí)器0使能
- PT0=1; //定時(shí)器0中斷為最高優(yōu)先級中斷
- EA=1; //開啟總中斷
- }
- main()
- {
- int_main();
- while(1)
- {
- //if(adc_ok==1)
- {
- adc_ok=0;
- temp[0]=rmsval/100;
- temp[1]=rmsval%100/10;
- temp[2]=rmsval%100%10;
- }
- P3=smgval[temp[0]];
- smg1=1;
- delay(5);
- smg1=0;
- P3=smgval[temp[1]];
- smg2=1;
- delay(5);
- smg2=0;
- P3=smgval[temp[2]];
- smg3=1;
- delay(5);
- smg3=0;
- }
- }
- //定時(shí)器中斷0入口
- void t0() interrupt 1
- {
- ulint ls1,ls2,ls3;
- i_t2++;
- ls1=getad();
- ls2=ls1*ls1;
- val1=val1+ls2;
- if(i_t2>=200)
- {
- i_t2=0;
- ls3=sqrt(val1/200);
- val1=0;
- rmsval=ls3*90/594 ;
- }
- }
復(fù)制代碼
|