给你一个应用实例参考,因电池供电,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; //启动定时器
- }
复制代码 |