c语言 pic16f877a 例子,PIC16F877A与PC机串行通信C语言源程序

//*******串口通信程序*********

//*******定义变量*************

#include

#define  unchar unsigned  char

#define  uint   unsigned  int

unchar   RC_label;//标志位起始位为1结束位为0

unchar   caiji_label;//采集帧格式标志位正确为1错误为0

unchar data RC[100];//存储接收到的数据

unchar data TX1[100];//存储自身参数

unchar data TX2[100];//存储出错指示ERROR

int    RC_buff;//

int    i=0,j=0,k=0;//

//*****变量定义完毕************

//*****子程序区****************

//*****串口初始化程序开始**********

void initRS232()

{

//设置TXSTA

CSRC=0;//

TX9=0;//8位数据发送

TXEN=1;//发送使能

SYNC=0;//选择异步模式

BRGH=1;//高速

TRMT=1;//发送寄存器空

TX9D=0;//

//设置RCSTA

SPEN=1;//允许串口工作

RX9=0;//接收8位数据

SREN=1;//

CREN=1;//使能连续接收

ADDEN=0;//

FERR=0;//

OERR=0;//无超速错误

RX9D=0;//

TRISC=0X80;//设置C口

SPBRG=0X19;//设置波特率为9600

}

//*******初始化232完毕********

//*******延时子程序开始*********

void delay(int i)

{for(i;--i;) continue;}

//******延时子程序完毕*******

//******中断初始化子程序开始******

void int_interrupt(void)

{

GTE=1;//

PEIE=1;//

RCIE=1;//

}

//*******中断初始化子程序完毕********

//********中断服务子程序开始*********

void  interrupt receive(void)

{

if(OERR==1)//判断有无超速错误

{

CREN=0;

CREN=1;

}

if(RCIF==1)

{

RC_buff=RCREG;

if(RC_buff==0x2a)//判断是否是起始标志*

{

RC_label=1;

}

if(RC_buff==0x23)//判断是否是结束标志#

{

RC_label=0;

}

}

if(RC_label==1)

RC[k++]=RC_buff;//将接收到的数据存储在数组中

else if(RC_label==0)

k=0;

if(RC[1]==0XFE&&RC[2]==0XC0&&RC[3]==0X34&&RC[5]==0X12)//判断数据采集帧格式是否正确

caiji_label=1;

else caiji_label=0;

//********中断服务子程序完毕**********

//********参数发送子程序开始**********

void  TX_serve(void)

{

TX1[]={0X2A,0XFD,0X26,0X30,0X31,0X32};//自身参数存储在TX1中

TX2[]={0X56,0X52,0X52,0X4F,0X52};//出错指示存储在TX2中

if(caiji_label==1)//如果数据采集帧格式正确则发送自身参数帧

{

for(j=0;j<6;j++)

{

TXREG=TX1[j];

delay(20);

}

}

if(caiji_label==0) //如果数据采集帧格式错误则发送出错指示

{

for(j=0;j<5;j++)

{

TXREG=TX2[j];

delay(20);

}

}

}

//********参数发送子程序完毕**********

//********主程序开始**************

void main()

{

int_interrupt();

initRS232();

TX_serve();

end

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值