|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#include<STC12C5410AD.H>
#include <intrins.h>
sbit Y1=P3^4;
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80 // ADC电源开启,0关,1开
#define ADC_FLAG 0x10 // ADC转换完成标识位,1,表示转换完成,需软件自动清零
#define ADC_START 0x08 // ADC启动控制,1开始转换
#define ADC_SPEEDLL 0x00 // 1080 个时钟周期转换一次 1080 clocks
#define ADC_SPEEDL 0x20 // 810 个时钟周期转换一次 810 clocks
#define ADC_SPEEDH 0x40 // 540 个时钟周期转换一次 540 clocks
#define ADC_SPEEDHH 0x60 // 270 个时钟周期转换一次 270 clocks
void delay(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void InitADC() //配置AD参数
{
P1=P1M0 = P1M1 = 0xff; //选择IO口模式,P1所有口为开漏模式
ADC_DATA = 0; //对ADC结果寄存器ADC_DATA清
ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //启动A/D电源,配置 420 个时钟周期为转换一次
delay(50); //使输入电压达到稳定(1ms即可)
}
uint ADC(uchar ch) //输入通道转换AD,返回数据值
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //必须 等待 4个时钟周期
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待FLAG为1
ADC_CONTR &= ~ADC_FLAG; //清FLAG为0
return ADC_DATA; //返回 ADC结果
}
void main(){
InitADC();
while(1){
//电源电压4.93V,a=(LED/4.93)*256
while(ADC(0)<155&ADC(0)>140)Y1=0;//2.7V-3V单相发光二极管
delay(1);
while(ADC(0)<120&ADC(0)>100){//双色发光二极管绿2.01V,黄1.95V //绿色过
delay(2000);
while(ADC(0)<120&ADC(0)>100)Y1=0;
};
delay(1);
while(ADC(0)<98&ADC(0)>50)Y1=0;//1.88V发光二极管
Y1=1;
}
} |
|