pic12f683简单使用代码.docx
- 文档编号:5239470
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:12
- 大小:30.86KB
pic12f683简单使用代码.docx
《pic12f683简单使用代码.docx》由会员分享,可在线阅读,更多相关《pic12f683简单使用代码.docx(12页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pic12f683 简单 使用 代码