#include "STC8G.h"
//#define ADC_POWER 0x80 //ADC power control bit
//#define ADC_FLAG 0x10 //ADC complete flag
//#define ADC_START 0x08 //ADC start control bit
//#define ADC_SPEEDLL 0x00 //450 clocks
//#define ADC_SPEEDL 0x20 //360 clocks
//#define ADC_SPEEDH 0x40 //180 clocks
//#define ADC_SPEEDHH 0x60 //90 clocks
sbit Speaker=P5^5;
unsigned char ch_x=4; //ADC为P5.4,其上拉1M电阻,对地测量水的电阻
//蜂鸣器采用无源蜂鸣器,必须用脉冲信号才能发生,三极管S9012,1脚接3v,2脚接1k电阻到P55,3脚经蜂鸣器正极到GND。
void Delay(void);
void ADCInit(void);
void UartInit(void);
void SendByte(unsigned char sbyte);
void Show_u16(unsigned int kk);
unsigned char Uart_Dat;
#define Download_command 0xf1 //功能码
void SerialPortInte(void) interrupt 4
{
unsigned int ISP_i,ISP_j;
if(TI==1)
{
TI=0;
// ES_Flag_Set(0);
}
else
{
RI=0;
Uart_Dat=SBUF;
SBUF=Uart_Dat;
if(Uart_Dat==Download_command)
{
for(ISP_j=1000;ISP_j>0;ISP_j--)
for(ISP_i=123;ISP_i>0;ISP_i--);
IAP_CONTR =0x60;//软件复位
}
}
}
unsigned char ADC_Val;
unsigned long ADC_Sum;
unsigned int ADC_i;
void ADC_Isr() interrupt 5
{
ADC_Sum = ADC_Sum+ADC_RES; //读取ADC结果
ADC_i++;
if(ADC_i>=2000){
ADC_Val=ADC_Sum/ADC_i;
Show_u16(ADC_Val);
while(ADC_Val<150){ //报警
Speaker=1;
Delay();
Speaker=0;
Delay();
}
ADC_Sum=0;
ADC_i=0;
}
ADC_CONTR &= ~0x20; //清中断标志
ADC_CONTR |= 0x40; //继续AD转换
// ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch_x;
}
void ADCInit(void)
{
P5M0 = 0x00; //设置P5.4为ADC口
P5M1 = 0x10;
P_SW2 |= 0x80; //不清楚P_SW2干什么用
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80; //使能ADC模块
ADC_CONTR |= ch_x;
EADC = 1; //使能ADC中断
EA = 1;
ADC_CONTR |= 0x40; //启动AD转换
// ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch_x;
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xE8; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
EA=1;
ES=1;
}
void Delay(void)
{
unsigned char i,j;
for(i=0;i<180;i++)
for(j=0;j<10;j++)
;
}
void main()
{
unsigned int k;
UartInit();
ADCInit();
for(k=0;k<200;k++){ //开机报警
Speaker=1;
Delay();
Speaker=0;
Delay();
}
while (1);
}
void Show_u16(unsigned int kk) //
{
unsigned char a,b,c,d,e;
e=kk%10+0x30;
d=(unsigned char)(( kk/10 )%10)+0x30;
c=(unsigned char)(( kk/100 )%10)+0x30;
b=(unsigned char)(( kk/1000 )%10)+0x30;
a=(unsigned char)(( kk/10000 )%10)+0x30;
SendByte(a);
SendByte(b);
SendByte(c);
SendByte(d);
SendByte(e);
SendByte(' ');
SendByte('\r');
SendByte('\n');
}
void SendByte(unsigned char sbyte)
{
ES=0;
SBUF=sbyte; //发送数据
while(!TI); //等待发送完成
TI=0; //清零发送标志位
ES=1;
}
完整资料打包: