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