打印

我采用PIC16F690,在MAPLAB下载程序,显示成功,可是程序不执行,

[复制链接]
392|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daixi0554|  楼主 | 2019-8-22 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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--);
}
////////////////////////

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝