新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于PIC16F73的下位机串口通讯设计备忘

基于PIC16F73的下位机串口通讯设计备忘

作者:时间:2016-08-25来源:网络收藏

  基本功能要求:

本文引用地址:http://www.eepw.com.cn/article/201608/296034.htm

  接收上位机所给的设定命令,并根据命令进行相应的操作,同时下位机将采集到的信息上传给上位机处理显示等。

  具体细节设计:

  由于本设计主要针对本公司的高压电源的,关于采集到的输出高压反馈值的模拟量可以利用单片机内部集成的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_result; //0-255

  unsigned char TX[8]={0x42,0x72,0x55,0x32,0x35,0x35,0x46,0x50};//BrU255FP

  //int AD_result;

  //------------------初始化 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; //9600-25(10进制)

  }

  //---------------初始化 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]=recdata;

  i=i+1;

  }

  //------AD转换中断----

  if(ADIF&&ADIE)

  {

  ADIF=0;//清干扰

  RB2=1;

  k=55;

  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;

  k=56;

  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;

  k=56;

  ADIE=1;

  ADCON0=0x85;//开启转换

  }

  if(i>=8)//全部接受完毕

  {

  RB1=1;

  i=0;

  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_result;

  //------------------初始化 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; //9600-25(10进制)

  }

  //---------------初始化 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]=recdata;

  i=i+1;

  if(i>=8)//全部接受完毕

  {

  RB4=1;

  i=0;

  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)

  {

  t=0;

  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;

  }

  }



关键词: PIC16F73 串口通讯

评论


相关推荐

技术专区

关闭