#include <STC8G.h>
#include "intrins.h"
//引脚定义
sbit LED=P5^4;
sbit IR=P5^5;
sbit RX_PD=P3^2;
sbit OUT=P3^3;
//延时1ms
void Delay1ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
//定义
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u16 Get_ADC10bitResult(u8 channel); //通道 0~15
u16 Bandgap;
//主函数
void main(void)
{
P3M0 = 0x00; //P3为准双向口模式
P3M1 = 0x00;
P5M0 |= 0x30;//P5为推挽输出模式
P5M1 &= ~0x30;
P3M0 = 0x00;//P3.2口为高阻输入
P3M1 = 0x04;
P_SW2 |= 0x80;//ADC的初始化
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x82; //设置P3.2为ADC口 0010
while (1)
{
u16 j;
u8 i;
IR=1;
Delay1ms();
IR=0;
Delay1ms();
Get_ADC10bitResult(15); //读内部基准电压1.19V,读15通道
for(j=0, i=0; i<8; i++)
{
j+= Get_ADC10bitResult(15);
}
Bandgap = j >> 4; //取平均值8次
Get_ADC10bitResult(2); //ADC2采样
for(j=0, i=0; i<8; i++)
{
j+= Get_ADC10bitResult(2);
}
j = j >> 4;
j = (u16)((u32)j * 119 / Bandgap);
if(j>Bandgap) //判断ADC2.0采样电压大于基准电压就开灯
OUT=1;
LED=1;
if(j<Bandgap) //判断ADC2.0采样电压大于基准电压就关灯
OUT=0;
LED=0;
return ;
}
}
u16 Get_ADC10bitResult(u8 channel) // ADC采样
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;
nop();
nop();
nop();
while (!(ADC_CONTR & 0x20));
ADC_CONTR &= ~0x20;
return (((u16)ADC_RES << 8) | ADC_RESL);
}
发送的红外灯,接收的没有输出