pic12f683简单使用代码.docx

上传人:b****4 文档编号:5239470 上传时间:2022-12-14 格式:DOCX 页数:12 大小:30.86KB
下载 相关 举报
pic12f683简单使用代码.docx_第1页
第1页 / 共12页
pic12f683简单使用代码.docx_第2页
第2页 / 共12页
pic12f683简单使用代码.docx_第3页
第3页 / 共12页
pic12f683简单使用代码.docx_第4页
第4页 / 共12页
pic12f683简单使用代码.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

pic12f683简单使用代码.docx

《pic12f683简单使用代码.docx》由会员分享,可在线阅读,更多相关《pic12f683简单使用代码.docx(12页珍藏版)》请在冰豆网上搜索。

pic12f683简单使用代码.docx

pic12f683简单使用代码

12f683简单使用代码

嵌入式设计  2009-02-2515:

32  阅读124   评论0 

字号:

大大 中中 小小

//12f683

#include

 __CONFIG(0x3004);

#define AD_A_ID      0

#define ZERO_ID      1

#define HZ_ID        2

#define TEMP_ID      3

#define IO_O_K   GPIO4

#define IO_O_LED  GPIO5

voidSTART_IO();     //I/O口设置函数

voidSTART_RAM();     //申明RAM口设置函数

voidSTART_TMR();     //申明定时器设置函数

voidAD(unsignedchari);   //AD转换

voidJM();       //解码

unsignedcharEEPROM_read(unsignedcharAddress);//读取指定地址上的数据

voidEEPROM_write(unsignedcharAddress,unsignedcharData);//写指定地址上的数据

 

//bank0

bitKEY_10MS_IF;                    //10MS的键盘的扫描的溢出标记

bitKEY_500MS_IF;                   //500MS的键盘的扫描的溢出标记

bitKEY_XS_IF;                      //XS的键盘的扫描的溢出标记

bitd1ms_IF;                        //

bitd10ms_IF;                       //

bitd100ms_IF;                      //

bitd500ms_IF;                    //

bitd1s_IF;                         //

bitd100ms_SW_IF;                   //检测电机的时间到了

bitK_NO_OFF_IF;

bitSS_LED_IF;      //LED的闪烁开关

bitSS_LED2_100ms_IF;    //因为是闪烁标记所以是要取反的

bitSS_LED1_500ms_IF;    //MOVLW B'00000100' XORWF RAM_SS_IF,F

bitSS_LED2_500ms_IF;    //MOVLW B'00001000' XORWF RAM_SS_IF,F

bitSS_LED1_1s_IF;     //MOVLW B'00010000' XORWF RAM_SS_IF,F  

bitSS_LED2_Speed_IF;    //LED的闪烁的速度是否开启 

bitT2_CCP1_IF;      //

bitT2_CCP1_IE;      //

 

unsignedchard1ms;     //1ms

unsignedchard10ms;    //10ms

unsignedchard100ms;    //100ms

unsignedchard500ms;    //500ms

unsignedchard1s;     //1s

unsignedchard_LED1;    //数码管闪烁

unsignedchard_LED2;    //LED闪烁

unsignedchard_key;

unsignedchard_Heat;    //加热时间

unsignedchard_SW_S;    //电机转了的时间(超过15秒:

说明电机运行异常)

unsignedchard_SW;     //产生PWM波形

unsignedchard_SW_Turn;   //电机堵转时间

unsignedchard_Heat_PID;   //PID是比例,积分,微分的缩写.

 

unsignedcharkey_temp_xs;   //xS后的端口的异或保存

unsignedcharkey_temp_10ms;  //10MS后的端口的保存,用来判断端口是否被改变

unsignedcharkey_temp;    //键盘的临时存放

unsignedcharLED_I;    //LED两数码管的位

unsignedcharLED_D[3];    //两数码管的数据

unsignedcharLED_temp;

unsignedcharDATA_I;

unsignedcharDATA_D[8]; 

unsignedcharAD_D;  

unsignedcharCCP1_I;

unsignedcharCCP1_t;

unsignedcharCCP1_tH;

unsignedcharCCP1_tL;

unsignedcharCSR;     //保存了几个低电平脉冲;从而判断有没有碰到障碍物

unsignedcharFM_S;     //蜂鸣器警报次数

 

unsignedcharEEPROM_A;

unsignedcharEEPROM_D;

unsignedcharPIC_IP;

unsignedchartemp;     //临时变量

unsignedcharj;     //临时变量

unsignedintt;

constunsignedcharTAB_LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e}; //定义常数0-F的数据表格

constunsignedcharTAB_TEMP[]={69,71,73,75,78,80,82,84,86,89,91,93,95,98,100,102,104,107,109,111,114,116,118,121,123,125,127,130,132,134,136,138};//温度表

                             //40摄氏度----------------------------------------------------------------------------------------------70摄氏度

//-------------------------------------------

//主程序

voidmain()

{

 //看门狗是一个自己拥有独立的RC时钟信号的,计时周期约为18ms的,自由运行的计时器.

 //OPTION=0X0F;          //1:

128--->2304ms

 //OPTION=0X0E;       //1:

64--->1152ms

 //OPTION=0X0D;       //1:

32--->576ms

 //OPTION=0X0C;       //1:

16--->228ms

 OPTION=0X0B;       //1:

8--->144ms

 //OPTION=0X0A;       //1:

4--->72ms

 //OPTION=0X09;       //1:

2--->36ms

 //OPTION=0X08;       //1:

1--->18ms

//3s延时

   asm("CLRWDT");                   //wdt清0(喂狗)

   START_IO();                      //调用I/O口设置函数

  START_RAM();                           //调用RAM清0

 START_TMR();       //调用定时器设置函数

   asm("CLRWDT");                   //wdt清0(喂狗)

 PIC_IP=1;

   while

(1)

   {

 //1ms

  if(!

d1ms_IF)continue;            //返回到while();

   d1ms_IF=0;

 //10ms

  if(!

d10ms_IF)continue;            //返回到while();

   d10ms_IF=0;

   asm("CLRWDT");               //wdt清0(喂狗)

 //100ms

  if(!

d100ms_IF)continue;          //返回到while();

   d100ms_IF=0;

   if(SS_LED_IF)     //温度过高时闪烁

    IO_O_LED=!

IO_O_LED;

 //1s

  if(!

d1s_IF)continue;              //返回到while();

   d1s_IF=0;

   AD(0);

   //散热片前后温度差8度

   //if(AD_D>215||AD_D<10)//(>85度,<-25度)+8

   //if(AD_D>160||AD_D<10)//(>53度,<-25度)+8

   if(AD_D>193||AD_D<10)//(>70度,<-25度)+8

   {

    K_NO_OFF_IF=0;

    SS_LED_IF=1;

   }

   IO_O_K=K_NO_OFF_IF;

   }

}       

//-------------------------------------------

//解码

voidJM()

{

 unsignedchari; 

 for(i=0;i<4;i++) //数据校对

 {

  temp=~DATA_D[i+4];

  if(DATA_D[i]!

=temp)return;

 }

 if(PIC_IP!

=DATA_D[0])return;//目标IP

 temp=DATA_D[1];

 switch(temp)

 {

  case'S':

  PIC_IP=DATA_D[2];

  break;

  case'O':

  IO_O_LED=0;

  K_NO_OFF_IF=1;

  break;

  case'C':

  IO_O_LED=1;

  K_NO_OFF_IF=0;

  break;

  default:

  break;

 }

}  

//---------------------------------------------

//AD转换

voidAD(unsignedchari)

{

//系统时钟Fosc/32

/* switch(i)

 {

 case0:

           temp=0B10000001;//ADCS1,ADCS0,CHS2,CHS1,   CHS0,GO,-,ADON

    break;

    case1:

           temp=0B10001001;//ADCS1,ADCS0,CHS2,CHS1,   CHS0,GO,-,ADON

    break;

    case2:

           temp=0B10010001;//ADCS1,ADCS0,CHS2,CHS1,   CHS0,GO,-,ADON

    break;

    case3:

           temp=0B10011001;//ADCS1,ADCS0,CHS2,CHS1,   CHS0,GO,-,ADON

    break;

    case4:

           temp=0B10100001;//ADCS1,ADCS0,CHS2,CHS1,   CHS0,GO,-,ADON

    break;

    default:

           return;              //返回

  }

*/

 //12F683

  switch(i)

 {

 case0:

           temp=0B00000001;//ADFMVCFG--CHS1CHS0GO/DONEADON

    break;

    case1:

           temp=0B00000101;//ADFMVCFG--CHS1CHS0GO/DONEADON

    break;

    case2:

           temp=0B00001001;//ADFMVCFG--CHS1CHS0GO/DONEADON

    break;

    case3:

           temp=0B00001101;//ADFMVCFG--CHS1CHS0GO/DONEADON

    break;

    case4:

           temp=0B00010001;//ADFMVCFG--CHS1CHS0GO/DONEADON

    break;

    default:

           return;              //返回

 }

 t=0;

 for(j=0;j<8;j++)             //AD转换取8次

   {

       ADCON0=temp;

  for(i=0;i<40;i++);       //为AD转换采样满足足够的时间(50摄氏度,19.72us)

  //ADGO=0X1;              //开启AD转换过程(注意:

开启转换不能与启用转换同时打开)

  //while(ADGO);           //等待转换完成

  ADCON0=ADCON0|0x2;       //开启AD转换过程(注意:

开启转换不能与启用转换同时打开)

  while(ADCON0&2);         //等待转换完成

  t+=ADRESH;

   }

    AD_D=t>>3;

}

   

//-------------------------------------------

//中断处理

voidinterruptINT1(void) //

{

   if(CCP1IF)

 {

  CCP1IF=0;

  //CCP1_tH=TMR1H;

  //CCP1_tL=TMR1L;

  CCP1_tH=CCPR1H;

  CCP1_tL=CCPR1L;

  TMR1H=0;

  TMR1L=0;

  //GPIO5=!

GPIO5;

  if(T2_CCP1_IF)

  {

   if(CCP1_tH>0x13)//>2.5ms错误数据

   {

    T2_CCP1_IF=0;

    T2_CCP1_IE=0;

   }

   if(CCP1_tH<0x03)//<0.5ms错误数据

   {

    T2_CCP1_IF=0;

    T2_CCP1_IE=0;

   }

   CCP1_I++;

   LED_temp=LED_temp<<1;

   if(CCP1_tH>0x0B)//1.5ms-2.5ms数据‘1’

    LED_temp++;

   //要保存每一个脉冲,以免数据不正常(如:

数据只能正确接收第一个)

   if(CCP1_I>7)

   {

    CCP1_I=0;

    DATA_D[DATA_I]=LED_temp;

    LED_temp=0;

    DATA_I++;

    if(DATA_I>7)

    {

     T2_CCP1_IF=0;

     T2_CCP1_IE=0;

     JM();

    }

   }

  }

  else

  {

   if(T2_CCP1_IE)

   {

    if(CCP1_tH>0x1B&&CCP1_tH<0x32)//3.5ms-6.5ms开始标记

    {

     T2_CCP1_IF=1;

     CCP1_I=0;

     LED_temp=0;

     DATA_I=0;

    }

    else

     T2_CCP1_IE=0;   

   }

   else

    T2_CCP1_IE=1;

  }

 }

 if(TMR2IE&&TMR2IF)

 {

       PIR1=0;         //清标记  

  TMR2IF=0;

     //1ms处理区

       d1ms++;

       d_Heat++;                      //加热时间

  d1ms_IF=1;

       if(d1ms<10)return;             //返回

     //10ms处理区

       d1ms=0;

       d10ms++;

       d10ms_IF=1;

       if(d10ms<10)return;            //返回

     //100ms处理区

       d10ms=0;

       d100ms++;

       d100ms_IF=1;                   //

  SS_LED2_100ms_IF=!

SS_LED2_100ms_IF;

       if(d100ms<5)return;           //返回

  //500ms

  d100ms=0;

  d500ms++;

       d500ms_IF=1;                   //

  SS_LED1_500ms_IF=!

SS_LED1_500ms_IF;

  SS_LED2_500ms_IF=!

SS_LED2_500ms_IF;

  if(d500ms<2)return;           //返回

     //1s处理区                        

       d500ms=0;

       d1s++;

       d_key++;

       d1s_IF=1;

       if(d1s<60)return;            //返回

     //1min处理区

       d1s=0;

 }

}

//-------------------------------------------

///////////////////初始化///////////////////

//-------------------------------------------

//I/O口设置函数

voidSTART_IO()

{

 TRISIO=0X05;

 GPIO=0x00;

 ANSEL=0B01110001;

 //OSFIE=1;//开启振荡器故障中断

 IRCF0=1;//从默认的4MHZ到8MHZ 

}

//-------------------------------------------

//申明RAM口设置函数

voidSTART_RAM()

{

 #asm

  CLRF   _STATUS     //体0

  MOVLW 0X20

  MOVWF _FSR

START_RAM_NEXT

  CLRF 0

  INCF _FSR,F

  MOVLW 0X7F

  XORWF _FSR,W

  BTFSS _STATUS,2

  GOTO START_RAM_NEXT 

 #endasm 

}

//-------------------------------------------

//申明定时器设置函数

voidSTART_TMR()

{

//   SPBRG=0XC;                   //4MHZ设置波特率为19200BPS

//   SPBRG=71;                    //11.0592MHZ设置波特率为9600BPS 

//   SPBRG=35;                    //11.0592MHZ设置波特率为19200BPS

//   SPBRG=11;                    //11.0592MHZ设置波特率为57600BPS             

//   SPBRG=5;                     //11.0592MHZ设置波特率为115200BPS

//   TXSTA=0X24;                  //使能串口发送,选择高速波特率

//   RCSTA=0X90;                  //使能串口工作,连续接收

//   RCIE=0X1;                    //使能接收中断

 CCP1IE=1;      //开启CCP1中断

 CCP1CON=0B00000100;    //-,-,CCP1X,CCP1Y,CCP1M3,CCP1M2,CCP1M1,CCP1M0

   TMR1ON=1;      //启用TMR1(关闭TMR1,使TMR2退出活动状态)

/*

 TMR2=0;       //T=(fosc/4)xN1x(PR2+1)xN2

 PR2=124;      //设置TMR2的定时时间(专用的定时器)

 T2CON=0B01001001;    //-,TOUTPS3,TOUTPS2,TOUTPS1,TOUTPS0,TMR2ON,T2CKPS1,T2CKPS0

*/

//8MHZ-1000us

 TMR2=0;       //T=(fosc/4)xN1x(PR2+1)xN2

 PR2=124;      //设置TMR2的定时时间(专用的定时器)

 T2CON=0B011110000;    //-,TOUTPS3,TOUTPS2,TOUTPS1,TOUTPS0,TMR2ON,T2CKPS1,T2CKPS0

        

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1