#include <pic.h>/*16F系列单片机头文件*/
__CONFIG(0x0024);
unsigned char tunnel; //通道号标志
unsigned char adcbuf[64]; //AD输入端口状态存储表
unsigned char h;
//unsigned char z;
unsigned int result[1]; //转换电压结果
void ADconvert(void);
void Init_AD(void); //AD模块初始化子程序声明
void delayms(unsigned int x); //延时子程序声明
void KZ_SW(void); //报警设置子程序声明
unsigned char flag=0;
float H;
//---------------------------------------
//名称:主程序
//---------------------------------------
void main(void)
{
OSCCON=0b01110110;//设置时钟为8M
Init_AD();
// Init_UART(); //485
ANSEL=0b00010000; //AN4为AD模拟口,其余全部为数字口
ANSELH=0b00000000; //AN8-11为数字口
TRISA=0b00000000;
TRISB=0b10000000;
TRISC=0b00000001; //设置RB7、RA4为输入引脚,其余都为输出引脚
RC3=0;
RC4=0;
RC5=0;
RC6=0;
RC7=0;
RB7=0;
RC0=0;
RA0=0;
RA1=0;
tunnel=1; //初始化通道号为1
while(1)
{
// unsigned int h;
ADconvert();
KZ_SW();
}
}
//-----------------------------------------
//名称:AD模块初始化子程序
//-----------------------------------------
void Init_AD(void)
{
ADCON1=0b00110000; //AD采样时钟为内部RC
ADCON0=0b00010001; //启动AD转换AN4通道为第一通道,转换结果左对齐取高八位
ADIE=0; //关闭中断使能禁止
tunnel=1; //初始化通道号为1
delayms(1);
}
//-----------------------------------------
//名称:A/D转换选择子程序
//-----------------------------------------
void ADconvert(void)
{
switch(tunnel) //AD通道选择
{
case 1:
for(h=0;h<64;h++) //连续采样64次,然后取平均值
{
ADCON0=0b00010001; //设置1通道AN4,左对齐
asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");
GO=1; //启动转换
while(GO==1); //等待AD转换结果
ADIF=0; //清除转换完成标志
adcbuf[h]=ADRESH; //把结果保存
}
result[0]=0;
for(h=0;h<64;h++)
{
result[0]+=adcbuf[h];
}
result[0]=result[0]/64; //取64次平均值
H=1.4648*result[0]; //375/256=1.4648.、采样信号数据放大1.5倍
if( H<0)H=0;
if(H>=250) H=250;
result[0]=(unsigned char)H;
}
}
//-----------------------------------------
//名称:采样控制输出
//-----------------------------------------
void KZ_SW(void)
{
if(RB7==0&&H<235) //当报警信号触发(J1和J3短接时),同时没有急停信号时
{
delayms(10);
if(RB7==0&&H<235)
{
RC4=0; //关闭急停语音信号
RA0=0; //急停继电器释放
RC7=1; //打开接受继电器
RC3=1; //接收功放使能
RC5=1; //打开报警语音信号
RA1=1; //语音报警继电器吸合
RC6=1;
}
}
if(H>60&&H<175&&RB7==1) //电压高于2.7V低于6.7V为打点通话
{
delayms(13);
if(H>60&&H<175&&RB7==1)
{
RC7=1; //打开接受继电器
RC3=1; //接收功放使能
delayms(200);
}
}
if(H>175&&H<235&&RB7==1) //电压高于6.7V低于8.8V为报警信号接收
{
delayms(10);
if(H>175&&H<235&&RB7==1)
{
RC7=1; //打开接受继电器
RC3=1; //接收功放使能
RC5=1; //打开报警语音信号
RA1=1; //语音报警继电器吸合
delayms(200);
}
}
if(H>235) //电压高于8.8V为报警信号急停信号接收
{
delayms(10);
if(H>235)
{
RA1=0; //语音报警继电器吸合释放
RC6=0;
RC5=0; //禁止语音报警
RC7=1; //打开接受继电器
RC3=1; //接收功放使能
RC4=1; //打开急停语音信号
RA0=1; //急停继电器吸合
delayms(200);
}
}
if(H<230)
{ delayms(200);
// RC7=0; //关闭接受继电器
// RC3=0; //接收功放使能禁止
RC4=0; //关闭急停语音信号
RA0=0; //急停继电器释放
// RC6=0;
// RC5=0; //禁止语音报警
}
if(H<170&&RB7==1)
{
delayms(200);
// RC7=0; //关闭打开接受继电器
// RC3=0; //接收功放使能禁止
RC5=0; //关闭报警语音信号
RA1=0; //语音报警继电器释放
RC6=0;
}
if(H<55&&RB7==1)
{
delayms(200);
RC7=0; //关闭接受继电器
RC3=0; //接收功放使能禁止
RC5=0; //关闭报警语音信号
RA1=0; //语音报警继电器释放
RC4=0; //关闭急停语音信号
RA0=0; //急停继电器释放
RC6=0;
}
}
//------------------------------------------------
// 毫秒级延时子程序
//------------------------------------------------
void delayms(unsigned int x)//延时子程序
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
////////////////////////
|