51单片机串行口中断服务程序_第1页
51单片机串行口中断服务程序_第2页
51单片机串行口中断服务程序_第3页
51单片机串行口中断服务程序_第4页
51单片机串行口中断服务程序_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、51单片机串行口中断服务程序串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理编程:聂小猛。该资料来自“51单片机世界 HYPERLINK /dz2000,%e6%ac%a2%e8%bf%8e%e8%ae%bf%e9%97%ae%e3%80%82 /dz2000,欢迎访问。出入均设有缓冲区,大小可任意设置。可供使用的函数名:/char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。/getline(char idata *line, unsigned char n);获取一行数据回车结束,已处理backspce和delete

2、,必须定义最大输入字符 数/putinbuf(uchar c);模拟接收到一个数据/putbyte(char c);放入一个字节到发送缓冲区/putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度/putstring(unsigned char code *puts);发送一个字符串到串口/puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。/putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置/putint(uint ui,uchar j);发送一个整

3、型数据的asc码表达方式,需要定义小数点的位置/CR;发送一个回车换行 #include /该头文件包括了 51,52,80320的特殊寄存器,用在51,52上也可 #define uchar unsignedchar #define uint unsigned int #define OLEN 64/* size of serial transmission buffer */ idata unsigned char outbufOLEN;/* storage for transmission buffer */unsigned char idata *outlast=outbuf; 最后由

4、中断传输出去的字节位置 unsigned char idata *putlast=outbuf;最后放入发送缓冲区的字节位置#define ILEN 2 /* size of serial receiving buffer */idata unsigned char inbufILEN;unsigned char idata *inlast=inbuf; 最后由中断进入接收缓冲区的字节位置unsignedchar idata *getlast=inbuf; /最后取走的字节位置bit outbufsign; /输出缓冲区非空标志有=1 bit inbufsign;接收缓冲区非空标志有=1bit

5、 inbufful;输入缓冲区满标志满=1#define CR putstring(rn) /CR=回车换行放入一个字节到发送缓冲区putbyte(char c) (uchar i,j; ES=0;/*暂停串行中断,以免数据比较时出错? */if (outlast=putlast )( i=(0-TH1);do(i-;j=36;do (j-;while(j!=0);while(i!=0);延时一个字节发送时间*putlast=c; /放字节进入缓冲区putlast+; /发送缓冲区指针加一 if(putlast=outbuf+OLEN) putlast=outbuf; 指针到了顶部换到底部 i

6、f (!outbufsign)(outbufsign=1;TI=1; 缓冲区开始为空置为有,启动发送ES=1; /* 放一串数据到发送缓冲区putbytes(unsigned char *outplace,unsigned char j) int i; for(i=0;i4)&0 x0f; putbyte(hex_ch); ch=c&0 x0f; putbyte(hex_ch); /* 从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。uchar getbyte (void)( char idata c;while (!inbufsign); / 缓冲区空等待ES

7、=0; c= *getlast; 取数据getlast+; /最后取走的数据位置加一inbufful=0; 输入缓冲区的满标志清零if (getlast=inbuf+ILEN) getlast=inbuf; / 地址到顶部回到底部if (getlast=inlast) inbufsign=0; /地址相等置接收缓冲区空空标志,再取数前要检该标志ES=1; return (c);/取回数据 /* /接收一行数据,必须定义放数据串的指针位置和大小 del=0 x7f,backspace=0 x08,cr=0 x0d,lf=0 x0a void getline (uchar idata *line,

8、 unsigned char n) (unsigned char cnt = 0; /定义已接收的长度 char c;do if (c = getbyte () = 0 x0d)c = 0 x00; 读一个字节,如果是回车换成结束符if (c = 0 x08 II c = 0 x7f) /BACKSPACE 和 DEL 的处理 if (cnt != 0) 已经输入退掉一个字符cnt-; /总数目减一line-; 指针减一putbyte (0 x08); 屏幕回显的处理putbyte ();putbyte (0 x08);else putbyte (*line = c);其他字符取入,回显 li

9、ne+; / 指针加一 cnt+; /总数目加一 while (cnt n - 1 & c != 0 x00 & c!=0 x1b); /数目到了,回车或 ESC 停止*line = 0; /再加上停止符0 模拟接收到一个数据putinbuf(uchar c)ES=0; if(!inbufful)*inlast= c; /放入数据 inlast+;最后放入的位置加一if (inlast=inbuf+ILEN)inlast=inbuf;/地址到顶部回到底部 if (inlast=getlast)inbufful=1; /接收缓冲区满置满标志 inbufsign=1;ES=1;串口中断处理seri

10、al () interrupt 4 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; /数据发送完置发送缓冲区空标志if (RI)RI = 0; if(!inbufful) *inlast= SBUF; /放 入数据inlast+; /最后放入

11、的位置加一inbufsign=1;if (inlast=inbuf+ILEN)inlast=inbuf;/地址到顶部回到底部 if (inlast=getlast)inbufful=1; /接收缓冲区满置满标志串口初始化 0 xfd=19200,0 xfa=9600,0 xf4=4800,0 xe8=2400,0 xd0=1200serial_init ()SCON = 0 x50; /* mode 1: 8-bit UART, enable receiver */TMOD |= 0 x20; /* timer 1 mode 2: 8-Bit reload */PCON |= 0 x80;TH1 = 0 xfd;/fa, /baud*2/* reload

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论