51串口接收函数.docx
- 文档编号:24278985
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:11
- 大小:18.33KB
51串口接收函数.docx
《51串口接收函数.docx》由会员分享,可在线阅读,更多相关《51串口接收函数.docx(11页珍藏版)》请在冰豆网上搜索。
51串口接收函数
竭诚为您提供优质文档/双击可除
51串口接收函数
篇一:
51串口发送和接收程序
/********************************************************************
*文件名:
串口发送试验.c
*描述:
该文件实现通过串口把数据从单片机发送到电脑,通过串口调试助手显示出来。
***********************************************************************/#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/********************************************************************
*名称:
com_Init()
*功能:
初始化串口程序,晶振11.0592,波特率9600
*输入:
无
*输出:
无
***********************************************************************/voidcom_Init(void)
{
TmoD=0x20;
pcon=0x00;
scon=0x50;
Th1=0xFd;
TL1=0xFd;
TR1=1;
}
/********************************************************************
*名称:
main()
*功能:
主函数
*输入:
无
*输出:
无
***********************************************************************/voidmain()
{
uchari=0;
ucharcodebuffer[]="当前时间";//所要发送的数据
uchar*p;
com_Init();
p2=0x00;
p=buffer;
while
(1)
{
sbuF=*p;
while(!
TI)//如果发送完毕,硬件会置位TI{_nop_();}p++;
if(*p==\0)break;//在每个字符串的最后,会有一个\0
TI=0;//TI清零
}
while
(1);
}
/********************************************************************
*文件名:
串口接收试验.c
*描述:
该文件实现通过单片机从电脑接收数据。
通过数码管显示
该试验使用的晶振是11.0592,如果使用12m晶振,会出现串口接收不正常的情况。
原因是用12m晶振,波特率9600时的误差率达8%当下载这个程序到单片机时,单片机的最高为为乱码,是正常现象,按一下复位键便可。
是由于单片机下载也是通过串口下载引起的。
***********************************************************************/#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharLeD_buffer[8]={0};//从串口接收的数据
/********************************************************************
*名称:
Delay_1ms()
*功能:
延时子程序,延时时间为1ms*x
*输入:
x(延时一毫秒的个数)
*输出:
无
***********************************************************************/voidDelay_1ms(uinti)//1ms延时
{
ucharx,j;
for(j=0;j for(x=0;x48;x++);
}
/********************************************************************
*名称:
com_Int()
*功能:
串口中断子函数
*输入:
无
*输出:
无
***********************************************************************/voidcom_Int(void)interrupt4
{
staticuchari=7;//定义为静态变量,当重新进入这个子函数时i的值不会发生改变eA=0;
if(RI==1)//当硬件接收到一个数据时,RI会置位
{
LeD_buffer[i]=sbuF-48;//这里减去48是因为从电脑中发送过来的数据是AscII码。
RI=0;
if(i==0)i=8;
i--;
}
eA=1;
}
/********************************************************************
*名称:
com_Init()
*功能:
串口初始化,晶振11.0592,波特率9600,使能了串口中断
*输入:
无
*输出:
无
***********************************************************************/voidcom_Init(void)
{
TmoD=0x20;
pcon=0x00;
scon=0x50;
Th1=0xFd;//设置波特率9600
TL1=0xFd;
TR1=1;//启动定时器1
es=1;//开串口中断
eA=1;//开总中断
}
/********************************************************************
*名称:
main()
*功能:
主函数
*输入:
无
*输出:
无
***********************************************************************/voidmain()
{
uchari=0;
Delay_1ms(100);
com_Init();
p2=0x80;//这里把p2口的最高为置1,进入循环后循环左移一位正好是p2最低为置1
while
(1)
{
p0=table[LeD_buffer[i]];
p2=i++;
Delay_1ms
(1);
if(i==8)i=0;
}
}
篇二:
51单片机串口接收的函数模块
51单片机串口接收的函数模块.txt机会就像秃子头上一根毛,你抓住就抓住了,抓不住就没了。
我和你说了10分钟的话,但却没有和你产生任何争论。
那么,我们之间一定有个人变得虚伪无比!
过错是短暂的遗憾,错过是永远的遗憾。
相遇是缘,相知是份,相爱是约定,相守才是真爱。
标题:
51单片机串口接收的函数模块Zz
发信站:
郁金香bbs站(20XX年07月05日13:
06:
32星期三),站内信件
//**************************************************************************//本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。
//主页地址/
//本程序为本站推出的"mcu51-63K仿真器"及"Dx-51多功能试验板"而设计的,详情请到本站查看.
//"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途
//**************************************************************************//串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
//串口输入设有缓冲区,大小可任意设置。
//可供使用的函数名:
/*
externchargetbyte(void);//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
externputbyte(charc);//放入一个字节到发送缓冲区
externputstring(uchar*puts);//发送一个字符串到串口
externputhex(ucharc);//发送一个字节的hex码,分成两个字节发。
externbitinbufsign;
#definecRputstring("\r\n")//发送一个回车换行
externvoidserial_init(void);
externputint(uintn);
*/
//*************************************************************************#include
#defineucharunsignedchar
#defineuintunsignedint
#defineILen16//32//设置串口中断接收缓冲区大小
idataucharinbuf[ILen];
dataucharidata*inlast=inbuf;//最后由中断进入接收缓冲区的字节位置
dataucharidata*getlast=inbuf;//最后取走的字节位置
bitinbufsign;//接收缓冲区非空标志有=1
bitinbufful;//输入缓冲区满标志满=1
#definecRputstring("\r\n")//cR=回车换行
//*****************************
//放入一个字节到发送缓冲区
putbyte(unsignedcharc)
{
sbuF=c;
while(!
TI);TI=0;
}
//***************************************
//发送一个定义在程序存储区的字符串到串口
putstring(uchar*puts)
{
for(;*puts!
=0;puts++)//遇到
停止符0结束
putbyte(*puts);
}
//*************************************
//发送一个字节的hex码,分成两个字节发。
ucharcodehex_[]={"0123456789AbcDeF"};
puthex(unsignedcharc)
{
intch;
ch=(c>>4)
putbyte(hex_[ch]);
ch=c
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);//取回数据
}
/*
//*************************
//以十进制的形式输出一个整型数到串口
putint(uintn)
{
uchari[6];
i[0]=0x30+n/10000;
i[1]=0x30+(n%10000)/1000;
i[2]=0x30+(n%1000)/100;
i[3]=0x30+(n%100)/10;
i[4]=0x30+n%10;
i[5]=0;
putstring(i);
}
//*********************
//模拟接收到一个字符,
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(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=120XX10592
voidserial_init(void)
{
//用t1作波特率
scon=0x50;//mode1:
8-bituART,enablereceiverTmoD|=0x21;//timer1mode2:
8-bitreloadth01x16pcon|=0x00;//smoD=0
Th1=0xfd;//baud*1/*reloadvalue9600baudTL1=0xfd;
TR1=1;//timer1run
//用t2作波特率
/*
T2con=0x30;
RcAp2h=0xFF;
RcAp2L=0xb8;//70=4800,b8=9600,dc=19200,ee=38400,f4=57600,fa=115200TR2=1;eT2=1;
scon=0x50;//scon=0xd0;
*/
es=1;
Ren=1;
eA=1;
sm2=1;//sm2=1时收到的第9位为1才置位RI标志
TI=1;
}
篇三:
单片机c51串口中断接收和发送范例
//这是一个单片机c51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样
#include
#include
#defineInbuF_Len4//数据长度
unsignedcharinbuf1[InbuF_Len];
unsignedcharchecksum,count3;
bitread_flag=0;
voidinit_serialcomm(void)
{
scon=0x50;//scon:
serailmode1,8-bituART,enableucvr
TmoD|=0x20;//TmoD:
timer1,mode2,8-bitreload
pcon|=0x80;//smoD=1;
Th1=0xF4;//baud:
4800fosc="11".0592mhz
Ie|=0x90;//enableserialInterrupt
TR1=1;//timer1run
//TI="1";
}
//向串口发送一个字符
voidsend_char_com(unsignedcharch)
{
sbuF="ch";
while(TI==0);
TI=0;
}
//向串口发送一个字符串,strlen为该字符串长度
voidsend_string_com(unsignedchar*str,unsignedintstrlen)
{
unsignedintk=0;
do
{
send_char_com(*(str+k));
k++;
}while(k }
//串口接收中断函数
voidserial()interrupt4using3
{
if(RI)
{
unsignedcharch;
RI=0;
ch="sbuF";
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum=ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum^=ch;
if((count3==(InbuF_Len-1))//如果串口接收的数据达到InbuF_Len个,且校验没错,//就置位取数标志
}
}
}
}
main()
{
init_serialcomm();//初始化串口
while
(1)
{
if(read_flag)//如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0;//取数标志清0
send_string_com(inbuf1,InbuF_Len);
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 串口 接收 函数