资源简介
pic16f877a串口通信与pc对发数据,波特率9600,8位异步,带CRC校验
代码片段和文件信息
#include
//根据选项配置字应该如下所示:
__CONFIG(HS&WDTDIS&LVPDIS);
//数码管字形表,定义表格一定要使用const,这样会做到程序存储区中
//const unsigned char LED[]=
//{
//0xc00xf90xa40xb0//0~3
//0x990x920x820xf8//4~7
//0x800x900x880x83//8~b
//0xc60xa10x860x8e //c~f
//};
volatile unsigned char flag2 @ 0x021;
volatile bit AC_request_enable @ ((unsigned)&flag2*8)+0;//=1AC request is enabledthat‘s to say AC could run
volatile bit bit_flag2 @ ((unsigned)&flag2*8)+1;
bit flag_incs_error @ ((unsigned)&flag2*8)+2;
bit flag_ambs_error @ ((unsigned)&flag2*8)+3;
bit flag_mode_error @ ((unsigned)&flag2*8)+4;
bit flag_evas_error @ ((unsigned)&flag2*8)+5;
bit flag_fan_error @ ((unsigned)&flag2*8)+6;
bit flag_error @ ((unsigned)&flag2*8)+7;
unsigned char TxRc_buf[12]={0};
unsigned char TxRc_num=0;
unsigned int CRC_data;
bit com_delflag=0;
void delay(void)
{
unsigned int a;
for(a=0;a<50000;a++); //延时,非精确定时
}
unsigned int cal_crc16(unsigned char *ptrunsigned char len)//CRC-16-A001校验码
{
unsigned char dat;
unsigned int crc=0xffff;
while(len--)
{
crc=crc^*ptr++;
for(dat=0x80;dat!=0;dat=dat>>1)
{
if(!(crc&0x0001))
{
crc=crc>>1;
}
else if(crc&0x0001)
{
crc=crc>>1;
crc=crc^0xa001;
}
}
}
return (crc);
}
void reset(void)//MCU软复位
{
asm(“ljmp 0“);
}
//*****USART串口初始化*****
void uart_init(void)
{
TRISD=0x00; //设置RD0-RD7为输出模式
PORTD=0xFF; //初始化RD7-RD0的数值
TRISC=0xff; //设置RC0-RC7为输入模式
TXSTA=0x24; //发送状态和控制寄存器,发送使能位TXEN置1串口模式选择位SYNC置1为同步,置0为异步,TX9=0为8位发送,TX9=1为9位发送,高速波特率选择BRGH置1
RCSTA=0x90; //接收状态和控制寄存器,串口使能位SPEN置1,RX9=0为8位接收,RX9=1为9位接收,连续接收使能位CREN置1
SPBRG=25; //设置波特率为9600,误差0.16%
GIE=1; //INTCON中断控制寄存器全局中断使能位
PEIE=1; //INTCON中断控制寄存器外设中断使能位
RCIE=1; //PIE1外设中断控制寄存器接收中断使能位
TXIE=0; //PIE1外设中断控制寄存器发送中断使能位
}
void main(void) //带前导数据处理,接收、校验、返回
{
unsigned char i;
uart_init();//串口USART配置初始化
TXREG=0x31;//将要发送的数据推送给发送寄存器
while(!TRMT);//等待发送完成
//while(1);
while(1)
{
while(com_delflag)//判断是否接收完成
{
RD5=!RD5;//对应LED发光管闪烁
delay();
RD5=!RD5;//对应LED发光管闪烁
CRC_data=cal_crc16(TxRc_buf10);//将串口接收到除最后两位为校验码的数据外,剩余数据进行CRC16校验
if(CRC_data==((TxRc_buf[11]<<8)|TxRc_buf[10]))//判断串口接收到数据的校验码与接收到的校验码是否一致
{
for(i=0;i<12;i++)
{TXREG=TxRc_buf[i];while(!TRMT);}//将接收到的数据以连续的方式返回主机
RCIE=1;//开启串口接收中断
com_delflag=0;//接收完成标志位置0
}
}
}
}
//*****USART串口接收中断*****TxRc_num
void interrupt com(void)
{
if(RCIE&&RCIF) //判断接收中断标志允许位和接收中断标志位
{
//****************************************接收并发送单
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 133 2016-03-29 09:03 user5usart\funclist
文件 2008 2016-03-29 09:03 user5usart\startup.as
文件 4612 2016-03-29 09:03 user5usart\startup.lst
文件 1791 2016-03-29 09:03 user5usart\startup.obj
文件 5277 2016-03-29 09:03 user5usart\startup.rlf
文件 25342 2016-03-29 09:03 user5usart\usart.as
文件 4482 2016-03-21 16:48 user5usart\usart.c
文件 11884 2016-03-29 09:03 user5usart\usart.cof
文件 253 2016-03-29 09:03 user5usart\usart.dep
文件 1295 2016-03-29 09:03 user5usart\usart.hex
文件 1091 2016-03-29 09:03 user5usart\usart.hxl
文件 43965 2016-03-29 09:03 user5usart\usart.lst
文件 14601 2016-03-29 09:03 user5usart\usart.map
文件 1036 2016-03-29 09:07 user5usart\usart.mcp
I.A.... 6609 2016-03-29 09:07 user5usart\usart.mcs
文件 930304 2016-03-29 09:07 user5usart\usart.mcw
文件 1916 2016-03-21 16:48 user5usart\usart.mptags
文件 8180 2016-03-29 09:03 user5usart\usart.obj
文件 52799 2016-03-29 09:03 user5usart\usart.p1
文件 14566 2016-03-29 09:03 user5usart\usart.pre
文件 56086 2016-03-29 09:03 user5usart\usart.rlf
文件 14432 2016-03-29 09:03 user5usart\usart.sdb
文件 4604 2016-03-29 09:03 user5usart\usart.sym
文件 25 2016-03-21 16:48 user5usart\usart.tagsrc
目录 0 2016-03-29 09:07 user5usart
----------- --------- ---------- ----- ----
1207291 25
- 上一篇:51STC单片机开发板驱动
- 下一篇:Qt拼图游戏源码
评论
共有 条评论