51串口通信程序(带详细注释)
#include
#define uchar unsigned char
#define uint unsigned int
bit UART_Flag=0; //定义串口接收标志位
uchar str[50]; //定义一数组
uchar length=0; //数组长度从0开始
void init() //初始化uart
{
TMOD=0X20; //定时器1定时器方式 工作模式2,可自动重载的8位计数器常把定时/计数器1以模式2作为串行口波特率发生器
SCON=0X50; //选择工作模式1使能接收,允许发送,允许接收
EA=1; //开总中断
ES=1; //打开串口中断
ET1=0; //打开定时器中断
PCON=0X80; //8位自动重载,波特率加倍
TH1=0XFF; //用22.1184 mhz波特率
TL1=0XFF;
TR1=1; //打开中时器
}
void UART_Putch(uchar dat) //输出一个字符
{
SBUF=dat; //把数据送给sbuf缓存器中
while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
TI=0; //到了,TI清为0
}
void init1() interrupt 4 //uart中断 ,4为串口中断
{
if(RI==1) //收到数据
{
uchar m=SBUF; //m为计算机发送给串口的数据,例,open //总体思想是,计算机通知串口,我要发数据了
RI=0; //收到清0
if(m==) //判断m这位数据有无
{
UART_Putch(); //回车
UART_Putch(); // 换行
str[length]=; //数据最后位加0标志位表示发完了数据
UART_Flag=1; // 传 完 标 志 位
}
else if(m==)
{
}
else if(m==)//b表退格 //下面几句表删锄
{
UART_Putch();
UART_Putch( );
UART_Putch();
length=length-1; //删锄了后总长度减一
}
else
{
str[length++]=m; //比如m为open,先传0后传p,length加一
UART_Putch(m); //输出 比如open
}
}
}
void check(char *str) //计算机发一数据,我来检查,
{
if( strcmp("open",str)==0 ) //比较两数是否相同,相同为0,不同为1 //要加string.h头文件
{
UART_Putch(o); //计算机中写入open我回复ok
UART_Putch(k);
UART_Putch(); //回车是跑到这一行的最前 UART_Putch(); //换行是跳到下一行
}
else if( strcmp("close",str)==0 )
{
UART_Putch(o);
UART_Putch(k);
UART_Putch();
UART_Putch();
}
else //否则出错
{
UART_Putch(e);
UART_Putch(r);
UART_Putch(r);
UART_Putch(o);
UART_Putch(r);
UART_Putch(!);
UART_Putch();
UART_Putch();
}
}
void main()
{
init();
while(1)
{
if(UART_Flag==1) //接收标志位表示接收完成
{
check(str);//检查
length=0; //长度清0
UART_Flag=0;//标志位清0
}
}
}
51串口通信程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)