pic12f683简单使用代码Word文件下载.docx
《pic12f683简单使用代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《pic12f683简单使用代码Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
![pic12f683简单使用代码Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/14/6249dd8f-9b07-41a1-8e38-9c4ee5403022/6249dd8f-9b07-41a1-8e38-9c4ee54030221.gif)
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;
00001000'
bitSS_LED1_1s_IF;
00010000'
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;
64--->
1152ms
//OPTION=0X0D;
32--->
576ms
//OPTION=0X0C;
16--->
228ms
OPTION=0X0B;
8--->
144ms
//OPTION=0X0A;
4--->
72ms
//OPTION=0X09;
2--->
36ms
//OPTION=0X08;
1--->
18ms
//3s延时
asm("
CLRWDT"
);
//wdt清0(喂狗)
START_IO();
//调用I/O口设置函数
START_RAM();
//调用RAM清0
START_TMR();
//调用定时器设置函数
PIC_IP=1;
while
(1)
{
if(!
d1ms_IF)continue;
//返回到while();
d1ms_IF=0;
d10ms_IF)continue;
d10ms_IF=0;
asm("
//wdt清0(喂狗)
d100ms_IF)continue;
d100ms_IF=0;
if(SS_LED_IF)
//温度过高时闪烁
IO_O_LED=!
IO_O_LED;
d1s_IF)continue;
d1s_IF=0;
AD(0);
//散热片前后温度差8度
//if(AD_D>
215||AD_D<
10)//(>
85度,<
-25度)+8
160||AD_D<
53度,<
if(AD_D>
193||AD_D<
70度,<
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;
O'
IO_O_LED=0;
K_NO_OFF_IF=1;
C'
IO_O_LED=1;
default:
//---------------------------------------------
voidAD(unsignedchari)
//系统时钟Fosc/32
/*
switch(i)
case0:
temp=0B10000001;
//ADCS1,ADCS0,CHS2,CHS1,
CHS0,GO,-,ADON
break;
case1:
temp=0B10001001;
case2:
temp=0B10010001;
case3:
temp=0B10011001;
case4:
temp=0B10100001;
return;
//返回
*/
//12F683
switch(i)
temp=0B00000001;
//ADFMVCFG--CHS1CHS0GO/DONEADON
temp=0B00000101;
temp=0B00001001;
temp=0B00001101;
temp=0B00010001;
t=0;
for(j=0;
j<
8;
j++)
//AD转换取8次
ADCON0=temp;
40;
i++);
//为AD转换采样满足足够的时间(50摄氏度,19.72us)
//ADGO=0X1;
//开启AD转换过程(注意:
开启转换不能与启用转换同时打开)
//while(ADGO);
//等待转换完成
ADCON0=ADCON0|0x2;
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错误数据
CCP1_I++;
LED_temp=LED_temp<
<
1;
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>
JM();
else
if(T2_CCP1_IE)
0x1B&
&
CCP1_tH<
0x32)//3.5ms-6.5ms开始标记
T2_CCP1_IF=1;
DATA_I=0;
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<
//返回
//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;
///////////////////初始化///////////////////
voidSTART_IO()
TRISIO=0X05;
GPIO=0x00;
ANSEL=0B01110001;
//OSFIE=1;
//开启振荡器故障中断
IRCF0=1;
//从默认的4MHZ到8MHZ
voidSTART_RAM()
{
#asm
CLRF
_STATUS
//体0
MOVLW
0X20
MOVWF
_FSR
START_RAM_NEXT
INCF
_FSR,F
0X7F
_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
T2CON=0B011110000;