|
QQ圖片20160921205223.png (24.76 KB, 下載次數(shù): 222)
下載附件
2016-9-21 20:56 上傳
//3位數(shù)碼電壓表
//電壓范圍:0-50V
//原理:比較器做為ADC
//共陰數(shù)碼管
//5V穩(wěn)定性越高,測(cè)量的電壓越準(zhǔn)確
0.png (66.46 KB, 下載次數(shù): 192)
下載附件
2016-9-24 11:43 上傳
PCB用PADS打開(kāi).7z
(53.35 KB, 下載次數(shù): 461)
2023-12-23 15:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
程序如下:
- //3位數(shù)碼電壓表
- //電壓范圍:0-50V
- //原理:比較器做為ADC
- //共陰數(shù)碼管
- //5V穩(wěn)定性越高,測(cè)量的電壓越準(zhǔn)確
- #include "stc15w204s.h"
- #include "Led_can.h"
- typedef unsigned long u32; //32位無(wú)符號(hào)整型數(shù)
- typedef unsigned int u16; //16位無(wú)符號(hào)整型數(shù)
- typedef unsigned char u8; //8位無(wú)符號(hào)整型數(shù)
- #define MAIN_Fosc 22118400 //定義主時(shí)鐘
- #define ADC_SCALE 50000 //ADC滿量程, 根據(jù)需要設(shè)置
- /************* 本地常量聲明 **************/
- //CMPCR1
- #define CMPEN 0x80 //1: 允許比較器, 0: 禁止,關(guān)閉比較器電源
- #define CMPIF 0x40 //比較器中斷標(biāo)志, 包括上升沿或下降沿中斷, 軟件清0
- #define PIE 0x20 //1: 比較結(jié)果由0變1, 產(chǎn)生上升沿中斷
- #define NIE 0x10 //1: 比較結(jié)果由1變0, 產(chǎn)生下降沿中斷
- #define PIS 0x08 //輸入正極性選擇, 0: 選擇內(nèi)部P5.5做正輸入, 1: 由ADCIS[2:0]所選擇的ADC輸入端做正輸入.
- #define NIS 0x04 //輸入負(fù)極性選擇, 0: 選擇內(nèi)部BandGap電壓BGv做負(fù)輸入, 1: 選擇外部P5.4做輸入.
- #define CMPOE 0x02 //1: 允許比較結(jié)果輸出到P1.2, 0: 禁止.
- #define CMPRES 0x01 //比較結(jié)果, 1: CMP+電平高于CMP-, 0: CMP+電平低于CMP-, 只讀
- //CMPCR2
- #define INVCMPO 0x80 //1: 比較器輸出取反, 0: 不取反
- #define DISFLT 0x40 //1: 關(guān)閉0.1uF濾波, 0: 允許
- #define LCDTY 0x00 //0~63, 比較結(jié)果變化延時(shí)周期數(shù)
- #define Pin0 0x01 //IO引腳 Px.0
- #define Pin1 0x02 //IO引腳 Px.1
- #define Pin2 0x04 //IO引腳 Px.2
- #define Pin3 0x08 //IO引腳 Px.3
- #define Pin4 0x10 //IO引腳 Px.4
- #define Pin5 0x20 //IO引腳 Px.5
- #define Pin6 0x40 //IO引腳 Px.6
- #define Pin7 0x80 //IO引腳 Px.7
- #define PinAll 0xFF //IO所有引腳
- /************* 本地變量聲明 **************/
- sbit P_ADC = P1^5; //P1.5 比較器轉(zhuǎn)IO輸出端
- u16 adc; //ADC中間值, 用戶層不可見(jiàn)
- u16 adc_duty; //ADC計(jì)數(shù)周期, 用戶層不可見(jiàn)
- u16 adc_value; //ADC值, 用戶層使用
- bit adc_ok; //ADC結(jié)束標(biāo)志, 為1則adc_value的值可用. 此標(biāo)志給用戶層查詢,并且清0
- /************* 本地函數(shù)聲明 **************/
- void ConfigTimer0();
- void ConfigTimer2(u8 ms);
- void main(void)
- {
-
- //IO口初始化
-
- P1M0 |= (Pin0+Pin1+Pin5); //P1.0 P1.1 P1.5腳定義為推挽模式
- P3M0 |= (Pin0+Pin1+Pin2+Pin3+Pin6+Pin7); //P3.0-P3.7腳定義為推挽模式
- P5M1 |= Pin4+Pin5; //P5.4 P5.5設(shè)置為高阻輸入
-
- //比較器初始化
- CMPCR1 = 0;
- CMPCR2 = 20; //比較結(jié)果變化延時(shí)周期數(shù), 0~63
- CMPCR1 |= CMPEN; //允許比較器 ENABLE,DISABLE
- // CMPCR1 |= PIE; //允許上升沿中斷 ENABLE,DISABLE
- // CMPCR1 |= NIE; //允許下降沿中斷 ENABLE,DISABLE
- // CMPCR1 |= PIS; //輸入正極性選擇, 0: 選擇內(nèi)部P5.5做正輸入, 1: 由ADCIS[2:0]所選擇的ADC輸入端做正輸入.
- CMPCR1 |= NIS; //輸入負(fù)極性選擇, 0: 選擇內(nèi)部BandGap電壓BGv做負(fù)輸入, 1: 選擇外部P5.4做輸入
- // CMPCR1 |= CMPOE; //允許比較結(jié)果輸出到P1.2, ENABLE,DISABLE
- // CMPCR2 |= INVCMPO; //比較器輸出取反, ENABLE,DISABLE
- CMPCR2 |= DISFLT; //內(nèi)部0.1uF濾波, ENABLE,DISABLE
- ConfigTimer0();
- ConfigTimer2(5);
- EA = 1; //允許全局中斷
- while (1)
- {
-
- if(adc_ok) //等待ADC結(jié)束
- {
- adc_ok = 0; //清除ADC已結(jié)束標(biāo)志
- Led_buff[0] = Led_Char[adc_value / 10000 % 10];
- Led_buff[1] = Led_Char[adc_value / 1000 % 10];
- Led_buff[1] &= 0x7f; //加小數(shù)點(diǎn)
- Led_buff[2] = Led_Char[adc_value / 100 % 10];
- }
- }
- }
- /* 配置并啟動(dòng)T0,10us定時(shí)時(shí)間 */
- void ConfigTimer0()
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x23; //設(shè)置定時(shí)初值 10微秒@22.1184MHz
- TH0 = 0xFF; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- ET0 = 1; //允許中斷
- PT0 = 1; //高優(yōu)先級(jí)中斷
- TR0 = 1; //開(kāi)始運(yùn)行
- }
- /* 配置并啟動(dòng)T2,ms-T2定時(shí)時(shí)間 */
- void ConfigTimer2(u8 ms)
- {
- u32 tmp; //臨時(shí)變量
-
- tmp = MAIN_Fosc / 12; //定時(shí)器計(jì)數(shù)頻率
- tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值
- tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
- tmp = tmp + 18; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
- T2H = (u8)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
- T2L = (u8)tmp;
-
- AUXR &= 0xEF; // 啟動(dòng)T2定時(shí)器 方式 :16位重裝模式計(jì)數(shù)器
- AUXR |= 0x10; // 啟動(dòng)T2定時(shí)器
- IE2 &= 0xFB; // 使能T2中斷
- IE2 |= 0x04; // 使能T2中斷
-
- //ET2 = 1; //使能T2中斷
- //T2R = 1; //啟動(dòng)T2定時(shí)器
- }
- /********************* Timer0中斷函數(shù)************************/
- void timer0_int () interrupt 1
- {
- if((CMPCR1 & CMPRES) == 0) P_ADC = 0; //比較器輸出高電平
- else //P_ADC輸出低電平, 給負(fù)輸入端做反饋.
- {
- P_ADC = 1; //P_ADC輸出高電平, 給負(fù)輸入端做反饋.
- adc ++; //ADC計(jì)數(shù)+1
- }
- if(--adc_duty == 0) //ADC周期-1, 到0則ADC結(jié)束
- {
- adc_duty = ADC_SCALE; //周期計(jì)數(shù)賦初值
- adc_value = adc; //保存ADC值
- adc = 0; //清除ADC值
- adc_ok = 1; //標(biāo)志ADC已結(jié)束
- }
- }
- /* T0中斷服務(wù)函數(shù),執(zhí)行數(shù)碼管掃描顯示 */
- void InterruptTimer2() interrupt 12
- {
- Led_can();
- WDT_CONTR=0x36; //喂狗 2S
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|