給你一個應用實例參考,因電池供電,P3.2既作ADC輸入,也作中斷喚醒。ADC檢測壓力傳感器信號,當無壓力達到一定時間,進入休眠。一旦有壓力MCU喚醒正常工作。你的問題可能是ADC轉換結果寄存器設置不當。
- //STC8G1K08A工作電壓范圍1.9~5.5V
- //#include "reg51.h"
- #include <STC8.H>
- #include "intrins.h"
- typedef unsigned char uchar;
- typedef unsigned int uint;
- typedef unsigned long ulong;
- #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
- //#define ceiling 636 //上限
- //#define floor 923 //下限
- sbit LED_R=P5^4;
- sbit LED_G=P5^5;
- //sbit AVDD =P3^3;
- uint code table[36]={
- 923 ,// 0
- 915 ,// 1
- 907 ,// 2
- 898 ,// 3
- 890 ,// 4
- 882 ,// 5
- 874 ,// 6
- 866 ,// 7
- 858 ,// 8
- 850 ,// 9
- 841 ,// 10
- 833 ,// 11
- 825 ,// 12
- 817 ,// 13
- 809 ,// 14
- 800 ,// 15
- 792 ,// 16
- 784 ,// 17
- 776 ,// 18
- 768 ,// 19
- 760 ,// 20
- 751 ,// 21
- 743 ,// 22
- 735 ,// 23
- 727 ,// 24
- 719 ,// 25
- 710 ,// 26
- 702 ,// 27
- 694 ,// 28
- 686 ,// 29
- 677 ,// 30
- 669 ,// 31
- 661 ,// 32
- 653 ,// 33
- 645 ,// 34
- 636 };//35
- bit flag=0;//完成標志
- //uchar i;
- uint CY_ADC;//采樣值
- uint time;
- void Timer0Init() //2毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器自動重裝模式
- TL0 = 0x9A; //設置定時初值
- TH0 = 0xA9; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- /*----------------------------
- 讀取ADC結果
- ----------------------------*/
- void GetADCResult()
- { //ADC 控制器 電源 啟動 完成 -- 15通道模擬選擇位
- //ADC_CONTR B7 B6 B5 B4 B3 B2 B1 B0
- static uint count=0;
- static uint PJZ_ADC=0; //累加10次采樣的變量1
- count++;
- if(count==1)ADC_CONTR = 0x80; //使能ADC模塊
- if(count>=2&&count<=11)
- {
- ADC_CONTR|= 0x42; //啟動AD轉換,P3.2 ADC輸入
- _nop_();_nop_();
- while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
- ADC_CONTR &= ~0x20; //清完成標志
- PJZ_ADC+=(ADC_RES<<8|ADC_RESL); //累計10次讀取10位ADC結果
- }
- if(count==11)
- {
- CY_ADC=PJZ_ADC/10;
- PJZ_ADC=0;
- ADC_CONTR = 0x00; //關閉ADC
- flag=1;
- }
- if(count>=10)//200ms
- count=0;
- }
- void main()
- {
- P3M0 = 0x00; //設置P3.2為ADC口
- P3M1 = 0x04; //設置P3.2為ADC口
- P5M0 = 0x00;
- P5M1 = 0x00;
- P_SW2 |= 0x80; //打開
- ADCTIM = 0x3f; //設置 ADC 內部時序
- P_SW2 &= 0x7f; //關閉
- ADCCFG = 0x27; //設置ADC結果右對齊,速度為512系統時鐘 ADCCFG = 0x0f; // 設置 ADC 時鐘為系統時鐘 /2/16/16
- // ADC_CONTR = 0x80; // 使能 ADC 模塊
- Timer0Init();
- //ADC配置寄存器 -- -- 格式控制 -- 速度控制位
- // ADCCFG B7 B6 B5 B4 B3 B2 B1 B0
- while (1)
- {
- if(TF0)
- {
- TF0=0;
- GetADCResult();
- if(flag==1)
- {
- flag=0;
- if(CY_ADC>table[0])
- {
- time++;
- LED_R=1;
- LED_G=1;
- }
- else if(CY_ADC>table[0] && CY_ADC<table[36])
- {
- time=0;
- LED_R=1;
- LED_G=0;
- }
- else if(CY_ADC<table[36])
- {
- time=0;
- LED_R=0;
- LED_G=0;
- }
- if(time>=15000)
- {
- time=0;
- P3M1 = 0x00;//設置P3.2為準雙向
- // AVDD = 0;
- TR0 = 0;//關閉定時器
- EX0 = 1; // 使能 INT0 中斷 , 用于喚醒 MCU
- EA = 1;
- _nop_();_nop_();_nop_();_nop_();
- PCON = IDL; //MCU 進入空閑(省電)模式
- _nop_();_nop_();_nop_();_nop_();
- }
- }
- }
- }
- }
- void INT0_Isr() interrupt 0
- {
- EX0 = 0; // 關閉 INT0 中斷
- EA = 0; // 關閉總中斷
- // AVDD = 1;
- P3M1=0x04; //設置P3.2為ADC口
- TR0 = 1; //啟動定時器
- }
復制代碼 |