📄 serial_int_3.c
字号:
//文件名:serial_int_3.c
//说明:中断法串口通讯程序
//可以使用串口调试助手测试
//编写:王晓荣
//日期:20080403
#include <REGX51.H>
#define OUTBUF_LENGTH 20 //输出缓冲区大小
unsigned char arOutbuf[OUTBUF_LENGTH]; //输出缓冲区
unsigned char *pOutlast = arOutbuf; //输出缓冲区中已发送数据位置指针
unsigned char *pPutlast = arOutbuf; //输出缓冲区中已存放数据位置指针
#define INBUF_LENGTH 20 //输入缓冲区大小
unsigned char arInbuf[INBUF_LENGTH]; //输入缓冲区
unsigned char *inlast = arInbuf; //输入缓冲区中已接收数据位置指针
unsigned char *getlast = arInbuf; //输入缓冲区中已读取数据位置指针
bit sendFlg; //一组数据的启动发送标志
bit outbufEmptyFlg; //输出缓冲区空标志
bit inbufEmptyFlg; //输入缓冲区空标志
bit inbufFullFlg; //输入缓冲区满标志
putbyte(char c); //存一个字节到输出缓冲区
putbytes(unsigned char *,unsigned char); //存多个字节到输出缓冲区
putstring(unsigned char *); //存字符串到输出缓冲区
unsigned char getbyte (); //从输入缓冲区中读取一个字节数据
void getbytes (unsigned char *, unsigned char); //从输入缓冲区中读取多个字节数据
void getstring (unsigned char *, unsigned char);//从输入缓冲区中读取字符串
//////////////////////////////////////////////////////////////////////////////////////////
//测试用主函数
void main( )
{
//unsigned char i;
unsigned char free[20];
sendFlg = 1; //一组数据的启动发送标志
outbufEmptyFlg = 1; //输出缓冲区空
inbufEmptyFlg = 1; //输入缓冲区空
serial_init ();
IE = 0X90;
//for(i = 0; i < 10; i ++)
//free[i] = i + 0x30;
//getstring(free, 10);
//putstring(free);
//putbytes(free,10);
//getbytes(free, 10);
//putbytes(free);
getstring(free, 10);
putstring(free);
putstring("ready!");
while(1);
}///////////////////////////////////////////////////////////////////////////////////
//存一个字节到输出缓冲区
putbyte(char c)
{
//等待,防止写入数据时发生套圈现象
while ((pOutlast == pPutlast + 2) ||
(OUTBUF_LENGTH + pOutlast == pPutlast + 2));
ES=0; //暂停串行中断
*pPutlast = c; //存数据
pPutlast ++; //已存放数据位置指针调整
if (pPutlast == arOutbuf + OUTBUF_LENGTH)
pPutlast = arOutbuf; //指针到了顶部换到底部
outbufEmptyFlg = 0; //输出缓冲区标志为非空
if (sendFlg) //如果是第1个数据,启动发送
{
sendFlg = 0;
TI = 1; //启动发送
}
ES = 1;
}///////////////////////////////////////////////////////////////////////
//存多个字节到输出缓冲区
putbytes(unsigned char *pOutput,unsigned char length)
{
unsigned char i;
for(i = 0; i < length; i++)
{
putbyte(*pOutput);
pOutput ++;
}
}////////////////////////////////////////////////////////////
//存字符串到输出缓冲区
putstring(unsigned char *pString)
{
for (;*pString != 0; pString++) //遇到停止符0结束
putbyte(*pString);
}//////////////////////////////////////////////////////////
//从输入缓冲区中读取一个字节数据
unsigned char getbyte ()
{
unsigned char ch ;
while (inbufEmptyFlg); //如果缓冲区空,则等待
ES = 0;
ch = *getlast; //读取输入缓冲区数据
getlast ++; //调整已读取数据位置指针
inbufFullFlg = 0; //输入缓冲区未满
if (getlast == arInbuf + INBUF_LENGTH)
getlast = arInbuf; //地址到顶部回到底部
if (getlast == inlast) //如果缓冲区数据已读取完
inbufEmptyFlg = 1;
ES = 1;
return (ch); //取回数据
}//////////////////////////////////////////////////////////////////////////////////
//从输入缓冲区中读取多个字节数据
//参数 接收数据存放位置, 接收数据长度
void getbytes (unsigned char *pline, unsigned char length)
{
unsigned char i;
for(i = 0; i < length; i++)
{
*pline = getbyte ();
pline ++;
}
}/////////////////////////////////////////////////////////////////////////
//从输入缓冲区中读取字符串
//参数 接收数据存放位置, 接收数据长度
void getstring (unsigned char *pline, unsigned char length)
{
unsigned char i;
for(i = 0; i < length; i++)
{
*pline = getbyte ();
if( *pline == 0x00)
break;
pline ++;
}
*pline = 0x00; //加上停止符0
}/////////////////////////////////////////////////////////////////////////
//串口中断处理
serial () interrupt 4
{
if (TI )
{
TI = 0;
if (!outbufEmptyFlg)
{
SBUF = *pOutlast; //未发送完继续发送
pOutlast++ ; //最后传出去的字节位置加一
if (pOutlast == arOutbuf + OUTBUF_LENGTH)
pOutlast = arOutbuf; //地址到顶部回到底部
if (pPutlast == pOutlast)
outbufEmptyFlg = 1; //数据发送完置发送缓冲区空标志
}
else
sendFlg = 1;
}
if (RI)
{
RI = 0;
if(!inbufFullFlg)
{
*inlast = SBUF; //放入数据
inlast ++; //最后放入的位置加一
inbufEmptyFlg = 0; //输入缓冲区非空
if (inlast == arInbuf + INBUF_LENGTH)
inlast = arInbuf; //地址到顶部回到底部
if (inlast == getlast)
inbufFullFlg = 1; //输入缓冲区满
}
}
}//////////////////////////////////////////////////////////////////////////////////
//串口初始化
serial_init ()
{
TMOD = 0x20;
TH1 = 256 - 12; //1.5: 波特率19200; 3: 波特率9600; 6:波特率4800; 12:波特率2400
TL1 = 256 - 12;
SCON = 0x50; //工作方式1
PCON &= 0xef; // 波特率不倍增
TR1 = 1;
}//////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -