__CONFIG(WDtdis费用 & LVPDIS & HS & PWRtdis费用 & BORDIS);

485通讯PIC源程序
485通讯PIC源程序
发布: | 作者:-- | 来源: -- | 查看:280次 | 用户关注:
#include&"HardwareProfile.h" //Configure&bits &&&&__CONFIG(&HS&&&WDTDIS&&&PWRTDIS&&&BORDIS&&&LVPDIS&);
#include&"HardwareProfile.h" //Configure&bits &&&&__CONFIG(&HS&&&WDTDIS&&&PWRTDIS&&&BORDIS&&&LVPDIS&);
void&Board_Init(void); #if&defined(PIC_USE_HC595) bit&b_R #endif #if&defined(PIC_USE_KB) #define&Free&&&&&&&&1 #define&Press&&&&&&&&0 bit&b_KeyA bit&b_KeyP bit&b_KeyS BYTE&u_KeyV BYTE&u_SCANACC; BYTE&i_KeyValueBuffer[2]; #endif BYTE&u_10ms_Acc&=&0; BYTE&u_50ms_Acc&=&0; BYTE&u_100ms_Acc&=&0; BYTE&u_200ms_Acc&=&0; WORD&i_500ms_Acc&=&0; WORD&i_1s_Acc&=&0; BYTE&u_frame&=&0; WORD&i_ADC; void&interrupt&ISR(void) { &&&&if(T0IF) &&&&{ &&&&&&&&T0IF&=&0; &&&&&&&&TMR0&=&0x0a;&&&&&&&&&&&&//定时1ms &&&&&&&&u_10ms_Acc&++; &&&&&&&&u_50ms_Acc&++; &&&&&&&&u_100ms_Acc&++; &&&&&&&&u_200ms_Acc&++; &&&&&&&&i_500ms_Acc&++; &&&&&&&&i_1s_Acc&++; #if&defined(PIC_USE_HC595) &&&&&&&&b_Reflash&=&1; #endif &&&&&&&&if(u_10ms_Acc&&=&10) &&&&&&&&{ &&&&&&&&&&&&u_10ms_Acc&=&0; &&&&&&&&&&&&//在下面增加自己的任务,每10ms执行一次 &&&&&&&&} &&&&&&&&if(u_50ms_Acc&&=&50) &&&&&&&&{ &&&&&&&&&&&&u_50ms_Acc&=&0; &&&&&&&&&&&&//在下面增加自己的任务,每50ms执行一次 #if&defined(PIC_USE_KB) &&&&&&&&&&&&ADIF&=&0; &&&&&&&&&&&&ADGO&=&1; #endif &&&&&&&&} &&&&&&&&if(u_100ms_Acc&&=&100) &&&&&&&&{ &&&&&&&&&&&&u_100ms_Acc&=&0; &&&&&&&&&&&&//在下面增加自己的任务,每100ms执行一次 &&&&&&&&} &&&&&&&&if(u_200ms_Acc&&=&200) &&&&&&&&{ &&&&&&&&&&&&u_200ms_Acc&=&0; &&&&&&&&&&&&//在下面增加自己的任务,每200ms执行一次 &&&&&&&&} &&&&&&&&if(i_500ms_Acc&&=&500) &&&&&&&&{ &&&&&&&&&&&&i_500ms_Acc&=&0; &&&&&&&&&&&&//在下面增加自己的任务,每500ms执行一次 &&&&&&&&} &&&&} &&&&if(ADIF) &&&&{ &&&&&&&&ADIF&=&0; #if&defined(PIC_USE_KB) &&&&&&&&if(&ADRESH&!=&0&)&&&&&&&& &&&&&&&&{ &&&&&&&&&&&&b_KeyPress&=&1;&&&&//有按键被按下 &&&&&&&&&&&&i_ADC&=&ADRESH; &&&&&&&&&&&&i_ADC&=&i_ADC&&&&8; &&&&&&&&&&&&i_ADC&=&i_ADC&|&ADRESL; &&&&&&&&&&&&i_ADC&=&i_ADC&&&0xfff8l; &&&&&&&&&&&&i_ADC&=&i_ADC&&&&2; &&&&&&&&} &&&&&&&&else &&&&&&&&{ &&&&&&&&&&&&b_KeyState&=&F&&&&//没按键被按下 &&&&&&&&&&&&b_KeyPress&=&0; &&&&&&&&&&&&LED_IO&=&0x00; &&&&&&&&} #endif &&&&if(TXIF&&&&TXEN) &&&&{ &&&&&&&&TXIF&=&0; &&&&} &&&&} } void&main() { &&&&Board_Init(); while(1) { #if&defined(PIC_USE_HC595) &&&&if(b_Reflash) &&&&{ &&&&&&&&LED_Reflash(); &&&&&&&&b_Reflash&=&0; &&&&} #endif &&&&if(BUTTON1_IO&==&0) &&&&{ &&&&&&&&DisplayNumber_Process(8888); &&&&} &&&&if(BUTTON2_IO&==&0) &&&&{ &&&&&&&&DisplayNumber_Process(0); &&&&} #if&defined(PIC_USE_RS485) &&&&if(RCIF) &&&&{ &&&&&&&&LED0_IO&=&LED0_IO&^&1; &&&&&&&&DisplayNumber_Process(&RS485_RW()&); &&&&} #endif } } ///////////////////////////////////////////////////////////////// //Function&void&Board_Init(void) //Input: //&&&&&&&&NULL //Output: //&&&&&&&&NULL //Overview:&根据实际应用初始化板子上各设备 //&&&&&&&& void&Board_Init(void) { &&&&BUTTON1_TRIS&=&1; &&&&BUTTON2_TRIS&=&1; &&&&LED_TRIS&=&0; &&&&LED_IO&=&0x01; &&&&TMR0_Init(); &&&&#if&defined(PIC_USE_HC595) &&&&&&&&HC595_Init(); &&&&#endif &&&&#if&defined(PIC_USE_LCD12864) &&&&&&&&LCD_Init(); &&&&#endif &&&&#if&defined(PIC_USE_ISD1700) &&&&&&&&ISD1700_Init(); &&&&#endif &&&&#if&defined(PIC_USE_KB) &&&&&&&&KeyBoard_Init(); &&&&#endif &&&&#if&defined(PIC_USE_RS485) &&&&&&&&RS485_Init(); &&&&#endif }
#include &stdio.h&#include "HardwareProfile.h"#if defined(PIC_USE_RS485)
void RS485_Init(void){&RS485_DIR_IO = R&RS485_DIR_TRIS = 0;&RS485_RX_TRIS = 1;&RS485_TX_TRIS = 0;/*&SPBRG = DIVIDER;&RCSTA = (NINE_BITS|0x90);&TXSTA = (SPEED|NINE_BITS|0x20);*/&//SPBRG=25;&&&&&&& //波特率为 9600&&&&&& Baud Rate = Fosc/(16*(SPBRG+1))&SPBRG=64;&BRGH=1;&&&&&&&&& //高速波特率使能位&TXEN=1;&&&&&&&&& //发送允许&CREN=1;&&&&&&&&& //连续接收选择位&SPEN=1;&&&&&&&&& //串行口使能位&TXIE=0;& &RCIE=0;&&&&&&&&& //接收中断使能开启&TXIF=0;&RCIF=0;&PEIE=1;&GIE=1;}
void RS485_Putch(BYTE byte){
&/* output one byte */&while(!TXIF)&/* set when register is empty */&&&RS485_DIR_IO = S&TXREG =&while(!TRMT)&/* set when register is empty */&&;&RS485_DIR_IO = R}
BYTE RS485_Getch(void){&/* retrieve one byte */&while(!RCIF)&/* set when register is not empty */&&&RCIF = 0;&return RCREG;}
BYTE RS485_RW(void){&BYTE&RS485_Putch(temp = RS485_Getch());&}
本页面信息由华强电子网用户提供,如果涉嫌侵权,请与我们***联系,我们核实后将及时处理。
&&& 目前,处理器性能的主要衡量指标是时钟频率。绝大多数的集成电路 (IC) 设计都基于同基于PIC16F73的下位机串口通讯设计备忘
> 基于PIC16F73的下位机串口通讯设计备忘
基于PIC16F73的下位机串口通讯设计备忘
  基本功能要求:本文引用地址:
  接收上位机所给的设定命令,并根据命令进行相应的操作,同时下位机将采集到的信息上传给上位机处理显示等。
  具体细节设计:
  由于本设计主要针对本公司的高压电源的,关于采集到的输出高压反馈值的模拟量可以利用单片机内部集成的8位AD转换模块,
  而电源的设定电压采用单片机内部的PWM模块来实现8位的DA转换,
  具体程序如下:(初稿)
  //***********************************************************
  //-------------- 源文件名为:RS232.c-----
  //监控高压源71520的工作,开启高压,上位机可以设定高压值
  //同时可以监控反馈高压值,采用最简通讯模式
  //******************************************
  #include
  #include
  __CONFIG(XT & WDTDIS& PWRTDIS & BORDIS & PROTECT );//配置字
  void DELAY(int time);
  void initPORTB();
  void initPORTA();
  void initPORTC();
  void inittmr2();
  void initCCP1();
  //变量定义
  unsigned char recdata,RX[8],i,j,k,AD_ //0-255
  unsigned char TX[8]={0x42,0x72,0x55,0x32,0x35,0x35,0x46,0x50};//BrU255FP
  //int AD_
  //------------------初始化 PORTB--------
  void initPORTB()
  { TRISB=0xe0; //设置portb口高3位为输入,低5位为输出
  RBIE=1; //关闭B口的中断
  PORTB=0x00; //RB口先送高电平清除干扰
  //-----------------初始化 PORTA----------
  void initPORTA() //包含AD转换初始化
  { TRISA=0x3f; //设置portA口 输入
  ADCON1=0x00; //A口全为AD口,RA0,1,2,3,5为模拟口,考电压VDD
  ADCON0=0x85; //fosc/32,通道0-85,8D-chanl1,开启转换
  ADIE=1; //允许中断
  //------------------初始化 PORTC--------
  void initPORTC() //包含波特率设置
  { TRISC=0xC0; //设置portC口状态,RC7/RX为输入
  TXSTA=0XA6;
  RCSTA=0XB0; //使能串口,8位连续接收,B0连续接受
  PIR1=0X00; //清标志位
  RCIE=1; //接受中断
  TXIE=1; //发送中断
  PORTC=0x00; //RC口赋初值
  SPBRG=25; //进制)
  //---------------初始化 tmr2------------------
  void inittmr2()
  { TMR2 =0; //赋初值,
  T2CON=0x72; //0x72后分频为1:8,预分频为1:16,先关闭.,31-4后分频,4预分频
  // TMR2IE=1; //开/关定时器2中断,清标志位
  TMR2IF=0;
  TMR2ON=1; //启动定时器2
  //---------------初始化 CCP1 ------------------
  void initCCP1()
  CCP1IF=0; //清标志位
  CCP1CON=0X0c; //设置工作模式
  //Pwm模式
  CCP1IE=1; //关闭中断
  PR2=0XFF; //定时器2的最大周期 245hZ
  CCPR1L=0X0f; //预制一个数
  CCPR1H=0; //,通过改变CCPR1L的值即可实现占空比的改变
  void interrupt all_int()
  //首先判断中断的类型,执行不同的中断子程序
  //中断优先级依次为接收中断、AD转换中断、发送中断
  if(RCIF&&RCIE) //判断是否是串口接收中断
  // RB1=1;
  RCIF=0;//清干扰
  recdata=RCREG; // 接收数据并存储
  RX[i]=
  i=i+1;
  //------AD转换中断----
  if(ADIF&&ADIE)
  ADIF=0;//清干扰
  RB2=1;
  AD_result=ADRES;
  ADCON0=0x85;
  //-------发送中断-----
  if(TXIF&&TXIE)
  RB3=1;
  TXIF=0;//清干扰
  TXREG=TX[j];
  j=j+1;
  if(j&=8)
  {j=0;}
  //软件延时子程序
  void DELAY(int time)
  int x,y;
  for(x=0;x&50;x++)
  for(y=0;y }
  //--------------------主程序------------------------
  main()
  initPORTB(); //PORTB初始化
  initPORTA(); //PORTA初始化
  initPORTC(); //PORTC初始化
  inittmr2();
  initCCP1();
  GIE=1; //开启全局中断
  PEIE=1; //开启外围中断
  RB2=0;
  RB1=0;
  RB3=0;
  while(1)
  //---------取出AD转换的百位、十位、个位-----
  if(k==55)
  RB4=1;
  ADIE=0;//数据传输期间禁止更改
  TX[3]=(AD_result/100)+48;
  TX[4]=((AD_result%100-AD_result%10)/10)+48;
  TX[5]=(AD_result%10)+48;
  ADIE=1;
  ADCON0=0x85;//开启转换
  if(i&=8)//全部接受完毕
  RB1=1;
  if((RX[0]==66)&&(RX[6]==88)) //校验传输字符正确性
  CCPR1L=(RX[3]-48)*100+(RX[4]-48)*10+(RX[5]-48);
  ADCON0=0x85;//开启转换
  ADCON0=0x85;//开启转换
  终极版本出炉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  //***********************************************************
  //-------------- 源文件名为:rs232sample1.c-----
  //最简单的程序框架
  //RB口输出程序执行标签
  //将通道0的模拟量对其进行AD转换其值送至串口输出
  //将串口上位机设定的值送给PWM输出,
  //******************************************
  #include
  #include
  __CONFIG(XT & WDTDIS& PWRTDIS & BORDIS & PROTECT );//配置字
  void DELAY(int time);
  void initPORTB();
  void initPORTA();
  void initPORTC();
  void inittmr2();
  void initCCP1();
  //变量定义
  unsigned char recdata,RX[8],i,j,k,t; //0-255
  unsigned char TX[8]={0x42,0x72,0x55,0x30,0x30,0x30,0x46,0x50};//BrU000FP
  int AD_
  //------------------初始化 PORTB--------
  void initPORTB()
  { TRISB=0xe0; //设置portb口高3位为输入,低5位为输出
  RBIE=0; //关闭B口的中断
  PORTB=0x00; //RB口先送低电平清除干扰
  //-----------------初始化 PORTA----------
  void initPORTA() //包含AD转换初始化
  { TRISA=0x3f; //设置portA口 输入
  ADCON1=0x00; //A口全为AD口,RA0,1,2,3,5为模拟口,考电压VDD
  ADCON0=0x85; //fosc/32,通道0-85,89-chanl1,开启转换
  ADIE=1; //允许中断
  //------------------初始化 PORTC--------
  void initPORTC() //包含波特率设置
  { TRISC=0xC0; //设置portC口状态,RC7/RX为输入
  TXSTA=0XA6;
  RCSTA=0XB0; //使能串口,8位连续接收,B0连续接受
  PIR1=0X00; //
  RCIE=1; //接受中断
  TXIE=1; //发送中断
  PORTC=0x00; //RC口赋初值
  SPBRG=25; //进制)
  //---------------初始化 tmr2------------------
  void inittmr2()
  { TMR2 =0; //赋初值,
  T2CON=0x72; //0x72后分频为1:8,预分频为1:16,先关闭.,31-4后分频,4预分频
  // TMR2IE=1; //开/关定时器2中断,清标志位
  TMR2IF=0;
  TMR2ON=1; //启动定时器2
  //---------------初始化 CCP1 ------------------
  void initCCP1()
  CCP1IF=0; //清标志位
  CCP1CON=0X0c; //设置工作模式
  //Pwm模式
  CCP1IE=0; //关闭中断
  PR2=0XFF; //定时器2的最大周期 245hZ
  CCPR1L=0X0f; //预制一个数
  CCPR1H=0; //,通过改变CCPR1L的值即可实现占空比的改变
  void interrupt all_int()
  //首先判断中断的类型,执行不同的中断子程序
  //中断优先级依次为接收中断、AD转换中断、发送中断
  if(RCIF&&RCIE) //判断是否是串口接收中断
  // RB1=1;
  RCIF=0;//清干扰
  recdata=RCREG; // 接收数据并存储
  RX[i]=
  i=i+1;
  if(i&=8)//全部接受完毕
  RB4=1;
  if((RX[0]==66)&&(RX[6]==88)) //校验传输字符正确性
  CCPR1L=(RX[3]-48)*100+(RX[4]-48)*10+(RX[5]-48);
  if(CCPR1L==0)
  RB4=0;
  //------AD转换中断----
  if(ADIF&&ADIE)
  ADIF=0;//清干扰
  RB2=1;
  t=t+1;
  AD_result=AD_result+ADRES;
  if (t==16)
  AD_result=AD_result&&4;
  TX[3]=(AD_result/100)+48;
  TX[4]=((AD_result%100-AD_result%10)/10)+48;
  TX[5]=(AD_result%10)+48;
  AD_result=0;
  ADCON0=0x85;
  //-------发送中断-----
  if(TXIF&&TXIE)
  TXREG=TX[j];
  RB3=1;
  j=j+1;
  if(j&=8)
  {j=0;}
  //软件延时子程序
  void DELAY(int time)
  int x,y;
  for(x=0;x&50;x++)
  for(y=0;y }
  //--------------------主程序------------------------
  main()
  initPORTB(); //PORTB初始化
  initPORTA(); //PORTA初始化
  initPORTC(); //PORTC初始化
  inittmr2();
  initCCP1();
  GIE=1;
  PEIE=1;
  AD_result=0;
  while(1)
  RB1=1;
  DELAY(10);
  ADCON0=0x85;
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一114网址导航1602时钟,最全面的1602时钟文章 - 电子工程世界网
在电子工程世界为您找到如下关于“1602时钟”的新闻
1602时钟资料下载
......................................\...........\.602时钟\1602时钟.c
......................................\...........\........\1602时钟.dep
......................................\...........\........\1602时钟.ewd...
;....................\....3 按键控制1602显示\按键控制1602显示.prj&&....................\......................\按键控制1602显示.SRC&&....................\......................\按键控制1602显示.mak...
基于单片机的1602电子时钟设计 基于单片机的1602电子时钟设计...
1602液晶时钟,带仿真...
1602与DS1302时钟...
液晶1602时钟,简单易懂,适合初学者!...
利用1602与89C52联机显示时钟,且具有定时功能与实时时钟...
;&...............\.............\.....\...................\STOPWATCH - LCD1602.hex&&...............\.............\.....\.8.1602液晶显示时钟\1602液晶显示一个时钟.rar& ...
用液晶1602显示时钟的时、分、秒的变化,用按键来调节时间。...
1602液晶显示DS1302实时时钟.rar...
1602时钟相关帖子
=2087499&ptid=504971][color=#999999]数码小叶 发表于
13:48[/color][/url][/size]
去看看协议吧,感觉你没看[/quote]
好纠结,scl 的时钟接到3.1 原来的1602 en rs rw 口子怎么处理的
还是有问题
难道是scl 全部解决了。。。。。
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2085001&ptid=504764][color=#45645 发表于
15:24[/color][/url][/size]
那需不需要给时钟[/quote]
80并口是不需要MCU提供时钟的,仔细按照1602的数据手册的时序建议做...
我想制作一个温度电阻经ad转换后求出温度值在1602上显示的单片机程序。硬件已经设计好了。可是突然发现ad转换后是串口输出的12位数据。。这个数据是二进制数据么?怎么用c语言转成10进制的好乘上分辨率啊,还有怎么用c表示这个温度数组
还有这个程序输出的是什么啊是 AD_Value还是cmd...
~P3.7相连。
但是在通用型1602液晶操作方法一节,又有“sbit en=P3^4;sbit rs=P3^5;”这样的代码。
而在时钟芯片这一节更是一口气声明了很多寄存器的接口。。。
在网上尝试搜了一下,,,但是说的太高深了,有点看不太懂。求大神用通俗点的语言解释下这些声明的含义。
下面的代码是书上时钟芯片一节,实例分析的定义代码,也就是我不懂得代码,希望大神帮帮忙。
#include...
& & & & //设置系统时钟为50MHz (400/2/4=50)
& & & & SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
& &  ...
/********************************************************************
//DM430-L型开发板1602液晶显示ADC转换结果程序,显示输入到ADC的电压转换后的数字量和模拟电压大小
//MSP430单片机内部12位ADC,采用内部2.5V基准,单通道单次转换,中断模式,有精度误差
//通过杜邦线将需要转换的电压加入到ADC0,也就是P60,可以更改输入电压,最大显示量V...
slave设备。CS4344的模拟输出就按照手册上的简单接法输出了,没有加滤波电路,实际上高频噪声影响还是有的。PCB版图:我惯用的Eagle软件出图。
原来想用一块1602 LCD做显示,几个按钮做控制。后来觉得1602模块本身体积更大,弄出来又不小巧了,一时也没选定盒子。于是我就决定用串口控制吧,设置好了以后可以拔下来,整个更小巧。所以软件上就是更新波形数据,和接收串口命令的干活…… 一个在...
; //LCD1602数据端口
sbit& & SCL=P1^0;& && && && && && && && &//IIC时钟引脚定义
sbit& & SDA=P1^1;& & ...
Linux一年工作经验:
2、了解一些Linux内核编程相关
DIY作品展示:
个人独立完成作品很少,多是公司开发产品。
很早前曾用51单片机和数码管制作时钟,使用MSP430和1602做成UART的Log解析器
UFUN开发板学习分享计划:
大体上跟随论坛学习阶段,整体日程提前。为可能出现的问题打好提前量...
用MSP430F5529做一个超声波测距模块,用1602显示,可是显示测出来的数据是0cm,我检查了好几天,不知道是哪里出了问题,求大神告诉该咋办,或者那位有MSP430F5529的程序,发给我让我研究一下,感激不尽,
MSP430F5529 这个跟单片机型号关系不大吧,都是一个套路,你可以贴程序出来看看,还有你可以说说你的编程思想
[quote][size=2][url...
1602时钟视频
1602时钟创意
你可能感兴趣的标签
热门资源推荐pic单片机入门与实战 pic-c编程教程(6)_牛宝宝文章网
pic-c编程教程(6)
pic单片机入门与实战
用C语言编写中断服务程序必须遵循高效的原则:z 代码尽量简短,中断服务强调的是一个“快”字。z 避免在中断内使用函数调用。虽然PICC允许在中断里调用其它函数,但为了解决递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其它函数内的代码直接写在中断服务程序中。z 避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。张明峰 于上海
13 of 26pic单片机入门与实战 pic-c编程教程中档系列PIC单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。[www.NIubb.neT]11.6.5 标准库函数PICC提供了较完整的C标准库函数支持,其中包括数学运算函数和字符串操作函数。在程序中使用这些现成的库函数时需要注意的是入口参数必须在bank0中。如果需要用到数学函数,则应在程序前 “#include &math.h&” 包含头文件;如果要使用字符串操作函数,就需要包含“#include &string.h&”头文件。在这些头文件中提供了函数类型的声明。通过直接查看这些头文件就可以知道PICC提供了哪些标准库函数。C语言中常用的格式化打印函数“printf/sprintf”用在单片机的程序中时要特别谨慎。printf/sprintf是一个非常大的函数,一旦使用,你的程序代码长度就会增加很多。除非是在编写试验性质的代码,可以考虑使用格式化打印函数以简化测试程序;一般的最终产品设计都是自己编写最精简的代码实现特定格式的数据显示和输出。本来,在单片机应用中输出的数据格式都相对简单而且固定,实现起来应该很容易。对于标准C语言的控制台输入(scanf)/输出(printf)函数,PICC需要用户自己编写其底层函数getch()和putch()。在单片机系统中实现scanf/printf本来就没什么太多意义,如果一定要实现,只要编写好特定的getch()和putch()函数,你就可以通过任何接口输入或输出格式化的数据。11.7 PICC定义特殊区域值PICC提供了相关的预处理指令以实现在原程序中定义单片机的配置字和标记单元。11.7.1 定义工作配置字在原程序中定义PIC单片机工作配置字的重要性在前面章节中已经阐述。在用PICC写程序时同样可以在C原程序中定义,具体方式如下:__CONFIG (HS & UNPROTECT & PWRTEN & BORDIS & WDTEN);上面的关键词“__CONFIG”(注意前面有两个下划线符)专门用于是芯片配置字的设定,后面括号中的各项配置位符号在特定型号单片机的头文件中已经定义(注意不是pic.h头文件),相互之间用逻辑“与”操作符组合在一起。这样定义的配置字信息最后将和程序代码一起放入同一个HEX文件。在这里列出了适用于16F7x系列单片机配置位符号预定义,其它型号或系列的单片机配置字定义方式类似,使用前查阅一下对应的头文件即可。/*振荡器配置*/#define RC#define HS
0x3FFF 0x3FFE // RC振荡 // HS模式张明峰 于上海
14 of 26pic单片机入门与实战 pic-c编程教程#define XT#define LP/*看门狗配置*/
0x3FFD 0x3FFC // XT模式 // LP模式#define WDTEN#define WDTDIS0x3FFF
// 看门狗打开 // 看门狗关闭 0x3FFB/*上电延时定时器配置*/#define PWRTEN#define PWRTDIS/*低电压复位配置*/#define BOREN#define BORDIS/*代码保护配置*/#define UNPROTECT 0x3FFF#define PROTECT 0x3FEF // 没有代码保护 // 程序代码保护例11-6
头文件预定义的配置信息符号 0x3FFF
// 低电压复位允许 // 低电压复位禁止
0x3FF7 // 上电延时定时器打开 0x3FFF // 上电延时定时器关闭 0x3FBF11.7.2PIC单片机中的标记单元定义可以用下面的__IDLOC(注意前面有两个下划线符)预处理指令实现,方法如下:__IDLOC (1234); 定义芯片标记单元其特殊之处是括号内的值全部为16进制数,不需要用“0x”引导。(wWW.nIuBB.neT]这样上面的定义就设定了标记单元内容为。11.8 MPLAB-IDE中实现PICC的编译选项设置在11.3节中已经介绍了如何实现PICC和MPLAB-IDE开发平台的挂接。一旦项目建立成功、程序编写完成后即可以通过MPLAB环境下的项目管理工具实现程序的编译、连接和调试。对应于整个项目编译最常用的MPLAB快捷图标为“是:z ”和“”。它们的含义分别-项目维护(Make):MPLAB检查项目中的原程序文件,只编译那些在上次编译后又被修改过的原程序,最后进行连接;z -项目重建(Build All):项目中的所有原程序文件,不管是否有修改,都将被重新编译一次,最后进行连接。也可以通过Project菜单选择“Make”或“Build All”实现项目编译。不管采用何种方式,在启动编译过程前一般都要设定一些编译选项。11.8.1 选择单片机型号张明峰 于上海
15 of 26pic单片机入门与实战 pic-c编程教程在选择PICC作为语言工具并建立了项目后,同样通过菜单项Configure?Select Device在MPLAB环境中选择具体单片机型号。[www.niuBB.neT]请回顾一下例11-1的代码,我们在原程序一开始使用了“#include &pic.h&”实现了相关单片机的一些预定义符号的直接引用,但没有具体指明是哪一个型号。实际上,“pic.h”头文件只是一个简单的管理工具(条件判别),它会按照MPLAB所选择的特定型号的单片机,把真正对应的头文件包含进来。有兴趣者可以直接用文本编辑工具打开pic.***件查看其是如何根据不同的单片机型号包含对应的头文件。这样对编程员而言,程序中只需加上一句“#include &pic.h&”即可。欢迎您转载分享:

参考资料

 

随机推荐