求用keilc编写一串口通信程序

求用keilc编写一串口通信程序,第1张

4月22日修改

我用过AT89C51的,AT89C52应该差不多吧

希望下面一段程序对你有所帮助

//-----------------------函数声明,变量定义--------------------------------------------------------

#include <reg51.h>

#define COUNT 10// 定义接收缓冲区大小

unsigned char buffer[COUNT]//定义接收缓冲区

unsigned char point //定义接收数据个数指示变量

void UART_init() //串口初始化函数

void COM_send(void) //串口接收函数

unsigned char CLU_checkdata(void)//计算校验位函数

//--------------------------------------------------------------------------------------------------

// 函数名称: UART_init()串口初始化函数

// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s 字串9

//串口接收中断允许,发送中断禁止

//--------------------------------------------------------------------------------------------------

void UART_init()

{

//初始化串行口和波特率发生器

SCON =0x58 //选择串口工作方式,打开接收允许

TMOD =0x21 //定时器1工作在方式2,定时器0工作在方式1

TH1 =0xfd //实现波特率9600(系统时钟11.0592MHZ)

TR1 =1 //启动定时器T1

ET1 =0

ES=1 //允许串行口中断

PS=1 //设计串行口中断优先级

字串7

EA =1 //单片机中断允许

}

//--------------------------------------------------------------------------------------------------

// 函数名称: com_interrup()串口接收中断处理函数

// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区

//--------------------------------------------------------------------------------------------------

com_interrupt(void) interrupt 4 using 3

{

unsigned char RECEIVR_buffer

if(RI)//处理接收中断

{

RI=0 //清除中断标志位 字串5

RECEIVR_buffer=SBUF //接收串口数据

if(point==0) //如果还没有接收到起始位

{

if(RECEIVR_buffer=='S') //判断是否起始标志位

point++//是准备接收下一位

else

point=0//不是,继续等待起始位

}

else if(point>0&&point<10) //判断是否接收够十位数据

buffer[point++]=RECEIVR_buffer //不够,把接收到的数据放入接收缓存区

else point=0 //缓冲区已满,清除缓存区内数据重新接收

字串5

}

If(TI) //处理发送中断

{

TI=0

}

}

//--------------------------------------------------------------------------------------------------

// 函数名称: COM_send()串口发送函数

// 函数功能: 把数据缓冲区的十位数据发送出去

//--------------------------------------------------------------------------------------------------

void COM_send(void)

{

for(point=0point<=10,TI=1point++) //连续发送十位数据

//把缓存区的数据都发送到串口

{

SBUF=buffer[point]

字串1

TI=0

}

}

//--------------------------------------------------------------------------------------------------

// 函数名称: CLU_checkdata()计算校验位函数

// 输入变量: 无

// 输出变量: checkdata,包括起始位在内的前九位数据的校验和

// 函数功能: 计算校验和

//--------------------------------------------------------------------------------------------------

unsigned char CLU_checkdata(void)

{ //计算校验位

unsigned char checkdata=0

for(point=0point<9,TI=1point++)

{

checkdata=checkdata|buffer[point]

}

return(checkdata)

}

//--------------------------------------------------------------------------------------------------

// 函数名称: 主函数

// 函数功能: 调度个子函数,完成通信过程 字串1

//--------------------------------------------------------------------------------------------------

void main(void)

{

unsigned char checkdata

do

{

UART_init() //初始化串口

if(point==10) //判断数据是否接收完成

checkdata=CLU_checkdata //调用求校验和函数

if(checkdata==buffer[9])//判断校验和是否正确

COM_send()

//正确则调用发送程序

point=0

}

while(1)

}

如果使用51系列单片机如STC89C52,它用的是串行通信方式的在线烧写功能,和单片机里面编程的串行通信无关,是硬件本身的功能,你连接串口的两根线和共地线,用STC-ISP 4.8,选择单片机型号与程序位置,关闭单片机开发板,点击程序下载后再上电就可以完成烧写。通常可采用MAX232,台式机后面的串口线或USB+PL2303这两种形式,这个功能AT89C52或是AVR系列都是不具备的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12192796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存