发布时间:2025-03-10 17:34:06    次浏览
一、程序功能pc向c51发送字符串不大于5个字符,c51将收到的字符前端加’S’,末端加’N’,回传给pc.二、关键点1、c51串口初始化步骤:定时器设置,确定波特率发生器,定时器分配。根据波特率,c51频率计算时间常数。串口设置。中断设置2、定时器时间常数计算方法:从晶振频率到波特率流程如下晶振-12分频-定时器输入,8位计数,TH,TL控制定时器溢出时间,或输入分频值,例TH=0xfd,对输入3分频-2分频(默认SMOD=0,2分频。如SMOD=1不分频)-16分频-波特率。3、中断程序格式void 函数名() interruptn {函数体}n=0,外部中断0n=1,定时器/计数器0n=2,外部中断1n=3,定时器/计数器1n=4,串口RI,TIn=5,定时器/计数器24、以T0为例,设T0为定时器,当T0溢出,内部硬件置位TF0。当开中断,进入中断程序后,TF0由硬件自动清0 ;若未开T0中断,TF0用于条件判断,TF0用软件清0。三、代码#include reg52.h#define uchar unsigned char//定义变量uchar recbuf[10]; //接收数据缓存uchar recnum;//初始化工作,//T0、T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号//串口设置,void init();//声明处理函数void answer();//主函数void main(){init();while(1){answer();}}//初始化工作,//T0、T1 设置为工作方式2,一个作波特率发生器,一个作定时器定时发送控制信号//串口设置,void init(){//定时器设置//T1,方式2,自动重载作波特率发生器//T0,方式0,13位计数器,作定时器,超时溢出TMOD=0x20;//T1常数计算,baud=9600,f=11.0592MHZ//晶振-12分频-定时器输入,8位计数,定时器输出-2分频(默认SMOD=0,如SMOD=1不分频)-16分频-波特率//常数TC=2^8-f/12/2/16/baud TL1=0xfd;TH1=0xfd;//串口设置//串口方式1,允许接收SCON=0x50;//中断设置,串口开中断ES=1; //串口开中断EA=1; //打开 总允许//启动定时器TR1=1;}//定义串口中断程序,不需要声明void serial() interrupt 4{//关中断TI=0;ES=0; //关键语句,关闭中断,程序可顺序向下执行//启动定时器,超时推出TH0=0x00;TL0=0x00;TR0=1;//recnum=0;//----- 收到第一个字节//没有收到数据,未超时,等待while((RI==0) (TF0==0));//手动复位RI=0;//如果超时,返回if(TF0==1)goto mm;//收到第一个字节数据recbuf[recnum++]=SBUF;//----- 收到第二个字节//启动定时器,超时推出TH0=0x00;TL0=0x00;//没有收到数据,未超时,等待while((RI==0) (TF0==0));//手动复位RI=0;//如果超时,返回if(TF0==1)goto mm;//收到第二个字节数据recbuf[recnum++]=SBUF;//----- 收到第三个字节//启动定时器,超时推出TH0=0x00;TL0=0x00;//没有收到数据,未超时,等待while((RI==0) (TF0==0));//手动复位RI=0;//如果超时,返回if(TF0==1)goto mm;//收到第二个字节数据recbuf[recnum++]=SBUF;//----- 收到第四个字节//启动定时器,超时推出TH0=0x00;TL0=0x00;//没有收到数据,未超时,等待while((RI==0) (TF0==0));//手动复位RI=0;//如果超时,返回if(TF0==1)goto mm;//收到第二个字节数据recbuf[recnum++]=SBUF;//----- 收到第五个字节//启动定时器,超时推出TH0=0x00;TL0=0x00;//没有收到数据,未超时,等待while((RI==0) (TF0==0));//手动复位RI=0;//如果超时,返回if(TF0==1)goto mm;//收到第五个字节数据recbuf[recnum++]=SBUF;//关闭T0mm:TR0=0;TF0=0;ES=1;}//定义处理函数void answer(){//uchar i;//关中断发送数据RI=0;TI=0;ES=0;if(recnum0){//发送数据SBUF='S';while(TI==0);TI=0;for(i=0;irecnum;i++){//发送数据SBUF=recbuf[i];while(TI==0);TI=0;}SBUF='N';while(TI==0);TI=0;recnum=0;}ES=1;}原文链接:http://www.eeworld.com.cn/mcu/article_2016101330442.html