您的位置 首页 5G

51单片机串口程序

串口中断服务函数集//本函数集来自51单片机世界,作者斑竹丁丁(聂小猛)。//主页地址http://www.mcu51.com//串口中断服务程序,仅需做简单…

串口中止服务函数集

//本函数集来自“51单片机国际”,作者斑竹丁丁(聂小猛)。
//主页地址http://www.mcu51.com
//串口中止服务程序,仅需做简略调用即可完结串口输入输出的处理
//收支均设有缓冲区,巨细可任意设置。
//可供使用的函数名:
//chargetbyte(void);从接纳缓冲区取一个byte,如不想等候则在调用前检测inbufsign是否为1。
//getline(charidata*line,unsignedcharn);获取一行数据回车完毕,有必要界说最大输入字符数
//putbyte(charc);放入一个字节到发送缓冲区
//putbytes(unsignedchar*outplace,j);放一串数据到发送缓冲区,自界说长度
//putstring(unsignedcharcode*puts);发送一个界说在程序存储区的字符串到串口
//puthex(unsignedcharc);发送一个字节的hex码,分红两个字节发。
//putchar(ucharc,ucharj);输出一个无符号字符数的十进制一共,有必要怂恿小数点的方位,主动删去前面无用的零
//putint(uintui,ucharj);输出一个无符号整型数的十进制一共,有必要怂恿小数点的方位,主动删去前面无用的零
//delay(unsignedchard);延时nx100ns
//putinbuf(ucharc);人工输入一个字符到输入缓冲区
//CR;发送一个回车换行
//*
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineOLEN32/*sizeofserialtransmissionbuffer*/
idataunsignedcharoutbuf[OLEN];/*storagefortransmissionbuffer*/
unsignedcharidata*outlast=outbuf;//最终由中止传输出去的字节方位
unsignedcharidata*putlast=outbuf;//最终放入发送缓冲区的字节方位
#defineILEN12/*sizeofserialreceivingbuffer*/
idataunsignedcharinbuf[ILEN];
unsignedcharidata*inlast=inbuf;//最终由中止进入接纳缓冲区的字节方位
unsignedcharidata*getlast=inbuf;//最终取走的字节方位
bitoutbufsign0;//最终一个数据覵BUF发完标志发完=0
bitoutbufsign;//输出缓冲区非空标志有=1
bitinbufsign;//接纳缓冲区非空标志有=1
bitinbufful;//输入缓冲区满标志满=1
#defineCRputstring(“/r/n”)//CR=回车换行

//*
//延时nx100ns
voiddelay(unsignedchard)//在源程序最初界说是否用w77e58或22。1184M晶振
{unsignedcharj;
do{d–;

//110592&89c52
#ifndefcpuw77e58
#ifndefxtal221184
j=21;//k=38cpu80320100usk=21cpu8052
#else
j=42;
#endif
#else
#ifndefxtal221184
j=38;
#else
j=76;
#endif
#endif

do{j–;}while(j!=0);
}while(d!=0);
}
//*
//放入一个字节到发送缓冲区

putbyte(charc)
{uchari,j;
ES=0;/*暂停串行中止,避免数据比较时犯错?*/
//if(outlast=putlast)
while((((outlast-putlast)==2)&&(outlast>putlast))||((outlast{ES=1;c++;c–;ES=0;
//i=(0-TH1);
//do{i–;j=39;do{j–;}while(j!=0);}while(i!=0);//i=39
}
*putlast=c;//放字节进入缓冲区
putlast++;//发送缓冲区指针加一
if(putlast==outbuf+OLEN)putlast=outbuf;//指针到了顶部换到底部
outbufsign=1;
if(!outbufsign0){outbufsign0=1;TI=1;}//缓冲区开端为空置为有,发动发送
ES=1;
}
//
//放一串数据到发送缓冲区
putbytes(unsignedchar*outplace,unsignedcharj)
{inti;
for(i=0;i{putbyte(*outplace);
outplace++;
}
}
//
//输出一个无符号字符数的十进制一共,有必要怂恿小数点的方位,主动删去前面无用的零
//例如putchar(0x32,2),输出”4.8″.
//putchar(0x32,3),输出”0.48″.
//putchar(0x32,1),输出”48″.
putchar(ucharc,ucharj)
{ucharidatafree[4];uchardatai;
i=0;
free[i++]=(c/100+0x30);
if(j==3)free[i++]=.;
free[i++]=(c%100)/10+0x30;
if(j==2)free[i++]=.;
if(j==2&&free[i-3]==0x30)free[i-3]=0x20;
free[i++]=(c%10)+0x30;
if(j==1&&free[i-3]==0x30)free[i-3]=0x20;
if(j==1&&free[i-3]==0x20&&free[i-2]==0x30)free[i-2]=0x20;
putbytes(free,i);
}

//
//输出一个无符号整型数的十进制一共,有必要怂恿小数点的方位,主动删去前面无用的零
putint(uintui,ucharj)
{ucharidatafree[6];
uchardatai;
i=0;
free[i++]=(ui/10000+0x30);
if(j==5)free[i++]=.;
free[i++]=((ui%10000)/1000+0x30);
if(j==4)free[i++]=.;
if(j==4&&free[i-3]==0x30)free[i-3]=0x20;
free[i++]=((ui%1000)/100+0x30);
if(j==3)free[i++]=.;
if(j==3&&free[i-4]==0x30)free[i-4]=0x20;
if(j==3&&free[i-4]==0x20&&free[i-3]==0x30)free[i-3]=0x20;
free[i++]=((ui%100)/10+0x30);
if(j==2)free[i++]=.;
if(j==2&&free[i-5]==0x30)free[i-5]=0x20;
if(j==2&&free[i-5]==0x20&&free[i-4]==0x30)free[i-4]=0x20;
if(j==2&&free[i-5]==0x20&&free[i-4]==0x20&&free[i-3]==0x30)free[i-3]=0x20;
free[i++]=(ui%10+0x30);
if(j==1&&free[i-5]==0x30)free[i-5]=0x20;
if(j==1&&free[i-5]==0x20&&free[i-4]==0x30)free[i-4]=0x20;
if(j==1&&free[i-5]==0x20&&free[i-4]==0x20&&free[i-3]==0x30)free[i-3]=0x20;
if(j==1&&free[i-5]==0x20&&free[i-4]==0x20&&free[i-3]==0x20&&free[i-2]==0x30)free[i-2]=0x20;
putbytes(free,i);
}
//*
//发送一个界说在程序存储区的字符串到串口
putstring(unsignedchar*puts)
{for(;*puts!=0;puts++)//遇到中止符0完毕
putbyte(*puts);
}
//*
//发送一个字节的hex码,分红两个字节发。
unsignedcharcodehex_[]={“0123456789ABCDEF”};
puthex(unsignedcharc)
{intch;
ch=(c>>4)&0x0f;
putbyte(hex_[ch]);
ch=c&0x0f;
putbyte(hex_[ch]);
}
//*
//从接纳缓冲区取一个byte,如不想等候则在调用前检测inbufsign是否为1。
uchargetbyte(void)
{charidatac;
while(!inbufsign);//缓冲区空等候
ES=0;
c=*getlast;//取数据
getlast++;//最终取走的数据方位加一
inbufful=0;//输入缓冲区的满标志清零
if(getlast==inbuf+ILEN)getlast=inbuf;//地址到顶部回到底部
if(getlast==inlast)inbufsign=0;//地址持平置接纳缓冲区空空标志,再取数前要检该标志
ES=1;
return(c);//取回数据
}
//*
//接纳一行数据,有必要界说放数据串的指针方位和巨细del=0x7f,backspace=0x08,cr=0x0d,lf=0x0a
voidgetline(ucharidata*line,unsignedcharn)
{unsignedcharcnt=0;//界说已接纳的长度
charc;
do{
if((c=getbyte())==0x0d)c=0x00;//读一个字节,如果是回车换成完毕符
if(c==0x08||c==0x7f)//BACKSPACE和DEL的处理
{if(cnt!=0)//现已输入退掉一个字符
{cnt–;//总数目减一
line–;//指针减一
putbyte(0x08);//屏幕回显的处理
putbyte();
putbyte(0x08);
}
}
else
{putbyte(*line=c);//其他字符取入,回显
line++;//指针加一
cnt++;//总数目加一
}
}while(cnt*line=0;//再加上中止符0
}
//
//人工输入一个字符到输入缓冲区
putinbuf(ucharc)
{ES=0;if(!inbufful)
{*inlast=c;//放入数据
inlast++;//最终放入的方位加一
if(inlast==inbuf+ILEN)inlast=inbuf;//地址到顶部回到底部
if(inlast==getlast)inbufful=1;//接纳缓冲区满置满标志
inbufsign=1;
}
ES=1;
}
//*
//串口中止处理
serial()interrupt4
{if(TI)
{TI=0;
if(outbufsign)
//if(putlast==outlast)outbufsign=0;
//else
{SBUF=*outlast;//未发送完持续发送
outlast++;//最终传出去的字节方位加一
if(outlast==outbuf+OLEN)outlast=outbuf;//地址到顶部回到底部
if(putlast==outlast)outbufsign=0;//数据发送完置发送缓冲区空标志
}
elseoutbufsign0=0;
}
if(RI)
{RI=0;
if(!inbufful)
{
*inlast=SBUF;//放入数据
inlast++;//最终放入的方位加一
inbufsign=1;
if(inlast==inbuf+ILEN)inlast=inbuf;//地址到顶部回到底部
if(inlast==getlast)inbufful=1;//接纳缓冲区满置满标志

}
}
}
//*
//串口初始化0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
serial_init(){
SCON=0x50;/*mode1:8-bitUART,enablereceiver*/
TMOD|=0x20;/*timer1mode2:8-Bitreload*/
PCON|=0x80;TH1=0xfA;//fa,//baud*2/*reloadvalue19200baud*/
TR1=1;/*timer1run*/
ES=1;REN=1;EA=1;SM2=1;//SM2=1时收到的第9位为1才置位RI标志
TMOD|=0x01;//th1autoload2X8,th01X16
TH0=31;TL0=0;//X32=1S
TR0=1;//ET0=1;

}
//*
//测试用主函数

voidmain(void)
{charc;
idataunsignedcharfree[16];
unsignedcharidata*freep=free;
serial_init();


putstring(“jdioptuejls;j;klj”);
delay(10);

while(1)
{putstring(“comisready!”);}
c=getbyte();
putbyte(0x20);
puthex(c);
switch(c)
{caser:
putbytes(inbuf,ILEN);
break;
caseg:
getline(freep,10);
putbyte(0x20);
putstring(freep);
break;
default:
putbyte(c);
//}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/265341.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部