简单使用代码_第1页
简单使用代码_第2页
简单使用代码_第3页
简单使用代码_第4页
简单使用代码_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12f683简单使用代码嵌入式设计   2009-02-25 15:32   阅读124   评论0   字号: 大大  中中  小小 /12f683#include<pic.h> _CONFIG(0x3004);#define  AD_A_ID       0#define  ZERO_ID       1#define 

2、HZ_ID         2#define  TEMP_ID       3#define  IO_O_K   GPIO4#define  IO_O_LED  GPIO5void START_IO();     /I/O口设置函数void START_RAM();     /申

3、明RAM口设置函数void START_TMR();     /申明定时器设置函数void AD(unsigned char i);   /AD转换void JM();       /解码unsigned char EEPROM_read(unsigned char Address);/读取指定地址上的数据void EEPROM_write(unsigned char Address,unsigned char Data);/写指定地址上的数据&

4、#160;/bank0bit KEY_10MS_IF;                     /10MS的键盘的扫描的溢出标记bit KEY_500MS_IF;                    /500

5、MS的键盘的扫描的溢出标记bit KEY_XS_IF;                       /XS的键盘的扫描的溢出标记bit d1ms_IF;                   

6、      /bit d10ms_IF;                        /bit d100ms_IF;                 

7、;      /bit d500ms_IF;                      /bit d1s_IF;                    

8、;      /bit d100ms_SW_IF;                    /检测电机的时间到了bit K_NO_OFF_IF;bit SS_LED_IF;      /LED的闪烁开关 bit SS_LED2_100ms_IF;    /因为是

9、闪烁标记所以是要取反的bit SS_LED1_500ms_IF;    /MOVLW B'00000100' XORWF RAM_SS_IF,F bit SS_LED2_500ms_IF;    /MOVLW B'00001000' XORWF RAM_SS_IF,F bit SS_LED1_1s_IF;     /MOVLW B'00010000'

10、 XORWF RAM_SS_IF,F  bit SS_LED2_Speed_IF;    /LED的闪烁的速度是否开启 bit T2_CCP1_IF;      /bit T2_CCP1_IE;      / unsigned char d1ms;     /1msunsigned char d10ms;  

11、  /10msunsigned char d100ms;    /100msunsigned char d500ms;    /500msunsigned char d1s;     /1sunsigned char d_LED1;    /数码管闪烁unsigned char d_LED2;    /LED闪烁unsigned char d_key;unsigned

12、 char d_Heat;    /加热时间unsigned char d_SW_S;    /电机转了的时间(超过15秒:说明电机运行异常)unsigned char d_SW;     /产生PWM波形unsigned char d_SW_Turn;   /电机堵转时间unsigned char d_Heat_PID;   /PID是比例,积分,微分的缩写. unsigned char key

13、_temp_xs;   /xS后的端口的异或保存unsigned char key_temp_10ms;  /10MS后的端口的保存,用来判断端口是否被改变unsigned char key_temp;    /键盘的临时存放unsigned char LED_I;    /LED两数码管的位unsigned char LED_D3;    /两数码管的数据unsigned char LED_temp;unsigned cha

14、r DATA_I;unsigned char DATA_D8; unsigned char AD_D;  unsigned char CCP1_I;unsigned char CCP1_t;unsigned char CCP1_tH;unsigned char CCP1_tL;unsigned char CSR;     /保存了几个低电平脉冲;从而判断有没有碰到障碍物unsigned char FM_S;     /蜂鸣器警报次数 unsigned ch

15、ar EEPROM_A;unsigned char EEPROM_D;unsigned char PIC_IP;unsigned char temp;     /临时变量unsigned char j;     /临时变量unsigned int t;const unsigned char TAB_LED=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0x40,0x79,0x24,0

16、x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e;  /定义常数0-F的数据表格const unsigned char TAB_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; /温度表           &#

17、160;                  /40摄氏度-70摄氏度/-/主程序void main() /看门狗是一个自己拥有独立的RC时钟信号的,计时周期约为18ms的,自由运行的计时器. /OPTION=0X0F;           /1:128->2304ms /OPTION=0X0E

18、;       /1:64->1152ms /OPTION=0X0D;       /1:32->576ms /OPTION=0X0C;       /1:16->228ms OPTION=0X0B;       /1:8->144ms /OPTION=0

19、X0A;       /1:4->72ms /OPTION=0X09;       /1:2->36ms /OPTION=0X08;       /1:1->18ms/3s延时    asm("CLRWDT");       

20、60;             /wdt清0(喂狗)    START_IO();                        /调用I/O口设置函数  START_RAM();   &#

21、160;                        /调用RAM清0 START_TMR();       /调用定时器设置函数    asm("CLRWDT");      

22、               /wdt清0(喂狗) PIC_IP=1;    while(1)     /1ms  if(!d1ms_IF)continue;             /返回到while();   d1m

23、s_IF=0; /10ms  if(!d10ms_IF)continue;             /返回到while();   d10ms_IF=0;   asm("CLRWDT");                /

24、wdt清0(喂狗) /100ms  if(!d100ms_IF)continue;           /返回到while();   d100ms_IF=0;   if(SS_LED_IF)     /温度过高时闪烁    IO_O_LED=!IO_O_LED; /1s  if(!d1s_

25、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)

26、/(>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;           /-/解码v

27、oid JM() unsigned char i;  for(i=0;i<4;i+) /数据校对   temp=DATA_Di+4;  if(DATA_Di!=temp)return;  if(PIC_IP!=DATA_D0)return;/目标IP temp=DATA_D1; switch(temp)    case 'S':  PIC_IP=DATA_D2;  break

28、;   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转换void AD(unsigned char i)/系统时钟Fosc/32/*&#

29、160;switch(i)   case 0:             temp=0B10000001;/ADCS1,ADCS0,CHS2,CHS1,    CHS0,GO,-,ADON     break;     case 1:          

30、0; temp=0B10001001;/ADCS1,ADCS0,CHS2,CHS1,    CHS0,GO,-,ADON     break;     case 2:            temp=0B10010001;/ADCS1,ADCS0,CHS2,CHS1,    CHS0,GO,-,ADON    

31、; break;     case 3:            temp=0B10011001;/ADCS1,ADCS0,CHS2,CHS1,    CHS0,GO,-,ADON     break;     case 4:         

32、0;  temp=0B10100001;/ADCS1,ADCS0,CHS2,CHS1,    CHS0,GO,-,ADON     break;     default:            return;             

33、60; /返回   */ /12F683   switch(i)   case 0:             temp=0B00000001;/ADFM VCFG CHS1 CHS0 GO/DONE ADON     break;     case 1:       &

34、#160;    temp=0B00000101;/ADFM VCFG CHS1 CHS0 GO/DONE ADON     break;     case 2:            temp=0B00001001;/ADFM VCFG CHS1 CHS0 GO/DONE ADON     break;   

35、;  case 3:            temp=0B00001101;/ADFM VCFG CHS1 CHS0 GO/DONE ADON     break;     case 4:            temp=0B00010001;/ADFM VCFG CHS1 CHS0 GO

36、/DONE ADON     break;     default:            return;               /返回  t=0; for(j=0;j<8;j+)    

37、          /AD转换取8次            ADCON0=temp;  for(i=0;i<40;i+);        /为AD转换采样满足足够的时间(50摄氏度,19.72us)  /ADGO=0X1;      

38、         /开启AD转换过程(注意:开启转换不能与启用转换同时打开)  /while(ADGO);            /等待转换完成  ADCON0=ADCON0|0x2;        /开启AD转换过程(注意:开启转换不能与启用转换同时打开)  while(ADC

39、ON0&2);          /等待转换完成  t+=ADRESH;         AD_D=t>>3;   /-/中断处理void interrupt INT1(void) /    if(CCP1IF)   CCP1IF=0;  /CCP1_tH=TMR1H; 

40、; /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;  &#

41、160; 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_t

42、H>0x0B)/1.5ms-2.5ms数据1    LED_temp+;   /要保存每一个脉冲,以免数据不正常(如:数据只能正确接收第一个)   if(CCP1_I>7)       CCP1_I=0;    DATA_DDATA_I=LED_temp;    LED_temp=0;    DA

43、TA_I+;    if(DATA_I>7)         T2_CCP1_IF=0;     T2_CCP1_IE=0;     JM();           else     if(T2_CCP1

44、_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; &#

45、160;      else     T2_CCP1_IE=0;         else    T2_CCP1_IE=1;    if(TMR2IE&&TMR2IF)         PIR1=0;  

46、        /清标记     TMR2IF=0;      /1ms处理区        d1ms+;        d_Heat+;             

47、60;         /加热时间  d1ms_IF=1;        if(d1ms<10)return;              /返回      /10ms处理区      

48、  d1ms=0;        d10ms+;        d10ms_IF=1;        if(d10ms<10)return;             /返回       /100ms处理区

49、        d10ms=0;        d100ms+;        d100ms_IF=1;                    /  SS_LED2_100ms_I

50、F=!SS_LED2_100ms_IF;        if(d100ms<5)return;            /返回  /500ms   d100ms=0;  d500ms+;        d500ms_IF=1;     

51、               /  SS_LED1_500ms_IF=!SS_LED1_500ms_IF;  SS_LED2_500ms_IF=!SS_LED2_500ms_IF;  if(d500ms<2)return;            /返回  

52、0;   /1s处理区                                 d500ms=0;         d1s+;     

53、60;  d_key+;        d1s_IF=1;        if(d1s<60)return;             /返回       /1min处理区         d1s=0;&#

54、160;/-/初始化/-/I/O口设置函数void START_IO() TRISIO=0X05; GPIO=0x00;  ANSEL=0B01110001; /OSFIE=1;/开启振荡器故障中断 IRCF0=1;/从默认的4MHZ到8MHZ /-/申明RAM口设置函数void START_RAM()   #asm  CLRF    _STATUS     /体0  MOVLW 0X20

55、0; MOVWF _FSRSTART_RAM_NEXT  CLRF 0  INCF _FSR,F  MOVLW 0X7F  XORWF _FSR,W  BTFSS _STATUS,2  GOTO START_RAM_NEXT   #endasm  /-/申明定时器设置函数void START_TMR()/    SPBRG=0XC;

56、60;                   /4MHZ设置波特率为19200BPS/    SPBRG=71;                     /11.0592MHZ设置波特率为96

57、00BPS  /    SPBRG=35;                     /11.0592MHZ设置波特率为19200BPS /    SPBRG=11;              

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

59、.0592MHZ设置波特率为115200BPS/    TXSTA=0X24;                   /使能串口发送,选择高速波特率/    RCSTA=0X90;               &

60、#160;   /使能串口工作,连续接收/    RCIE=0X1;                     /使能接收中断 CCP1IE=1;      /开启CCP1中断 CCP1CON=0B00000100;    /-,-

61、,CCP1X,CCP1Y,CCP1M3,CCP1M2,CCP1M1,CCP1M0    TMR1ON=1;      /启用TMR1(关闭TMR1,使TMR2退出活动状态)/* TMR2=0;       /T=(fosc/4)xN1x(PR2+1)xN2 PR2=124;      /设置TMR2的定时时间(专用的定时器) T2CON=0B010

62、01001;    /-,TOUTPS3,TOUTPS2,TOUTPS1,TOUTPS0,TMR2ON,T2CKPS1,T2CKPS0*/8MHZ-1000us TMR2=0;       /T=(fosc/4)xN1x(PR2+1)xN2 PR2=124;      /设置TMR2的定时时间(专用的定时器) T2CON=0B011110000;    /-

63、,TOUTPS3,TOUTPS2,TOUTPS1,TOUTPS0,TMR2ON,T2CKPS1,T2CKPS0         /bit 7 未实现:读为0         /bit 6-3 TOUTPS<3:0>:Timer2 输出后分频比选择位          /0000 = 1:1 后分频比

64、0;         /0001 = 1:2 后分频比          /0010 = 1:3 后分频比          /0011 = 1:4 后分频比          /0100 = 1:5 后分频比

65、          /0101 = 1:6 后分频比          /0110 = 1:7 后分频比          /0111 = 1:8 后分频比          /1000 = 1:9

66、后分频比          /1001 = 1:10 后分频比          /1010 = 1:11 后分频比          /1011 = 1:12 后分频比          /1100

67、 = 1:13 后分频比          /1101 = 1:14 后分频比          /1110 = 1:15 后分频比          /1111 = 1:16 后分频比         /bi

68、t 2 TMR2ON:Timer2 使能位          /1 = 使能Timer2          /0 = 禁止Timer2         /bit 1-0 T2CKPS<1:0>:Timer2 时钟预分频比选择位      

69、    /00 = 预分频值为1          /01 = 预分频值为4          /1x = 预分频值为16 TMR2ON=1;      /启用TMR2(关闭TMR2,降低功耗) TMR2IE=1;     

70、60;/开启TMR2中断    GIE=0X1;                        /开放全局中断    PEIE=0X1;                       /使能外部中断/*/-                               /读取EEPROM指定地址上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论