串口调试结果
1:我用的串口调试助手不能显示汉字,超级终端可以;
2ASCII码来显示,比如将0x61发送给串口,串口助手和超级终端都显示a;
3:不用包含stdio.h头文件同样可以在超级终端和串口助手做到回车换行的效果,方法是发送0d,0a两个字节就可以
4:串口发送字符时也是按照ASCII码发送,比如说发送a时SBUF将接收到0x61,发送1时SBUF将接收到49等。所以判断时先将ASCII码转换成十进制才正确
5:将a25a这四个字符一个一个的发,和一次全部发,效果一样。
6:调试时要根据自己的晶振在串口调试助手那选择对应的波特率。
7:以下是经过过修改的网络程序,已经注明转帖
#include<reg51.h>
#include <string.h>
static unsigned char data CN[4];
static unsigned char data CT;
unsigned char TS[8]={254,252,248,240,224,192,128,0};
sbit P2_6=P2^6;
void delay(unsigned int time)
{
while(time--);
}
void S_init(unsigned char baudrate)
{
unsigned char THTL;
switch(baudrate)
{
case 1: THTL = 64; break; //波特率300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON=0x50; //方式1,允许接收
TMOD=0x20;
PCON|=0x80;
TH1=THTL;
TL1=THTL;
TI=0;
RI=0;
TR1=1;
ES=1;
EA=1;
}
//向串口输出一个字符
void S_PutNum(unsigned char dat)
{
ES=0;
TI=0;
SBUF=dat;
while(!TI);
TI=0;
ES=1;
}
/**************************************************************************
- 功能描述:51单片机的串口发送0d 0a ,即回车换行
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:无
- 返回说明:无
- 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果
**************************************************************************/
void UART_Send_Enter()
{
S_PutNum(0x0d);
S_PutNum(0x0a);
}
/**************************************************************************
- 功能描述:51单片机的串口发送字符串
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:s:指向字符串的指针
- 返回说明:无
- 注:如果在字符串中有'\n',则会发送一个回车换行
**************************************************************************/
void UART_Send_Str(char *s)
{
int len=strlen(s)-1;
int i;
for(i=0;i<len;i++)
S_PutNum(s);
if(s=='\n')
{
UART_Send_Enter();
}
else
{
S_PutNum(s);
}
}
void CNToOut(void)
{
S_PutNum(CN[0]);
S_PutNum(CN[1]);
S_PutNum(CN[2]);
S_PutNum(CN[3]);
}
void CS2OUT()
{
unsigned char a;
unsigned char b;
switch(CN[1]) //aXXa的格式定义是第一个X为端口,0为P0,1为P1,2为P2,3为关闭所有(同时第二个X也是3)
{ //XX=4为测试用,5 为读取端口状态,大于5 则为无效数据
case 48: //第一个X 小于3 时,第二个X 为要输出的数据
P0=CN[2];
CNToOut();
break;
case 49:
P1=CN[2];
CNToOut();
break;
case 50:
P2=CN[2];
CNToOut();
break;
case 51:
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
CNToOut();
break;
case 52:
P0=0xff;
P1=0xff;
P2=0xff;
for(a=0;a<8;a++)
{
P0 = TS[a];
for (b=0; b<50000; b++);
}
P0=0xff;
for (a=0; a<8; a++)
{
P1 = TS[a];
for (b=0; b<50000; b++);
}
P1 = 0xFF;
for (a=0; a<4; a++)
{
P2 = TS[a];
for (b=0; b<50000; b++);
}
P2 = 0xFF;
CNToOut();
break;
case 53: //根据CN[2]返回所要读取的端口值
switch(CN[2])
{
case 48:
S_PutNum(CN[0]);
S_PutNum(CN[1]);
S_PutNum(P0);
S_PutNum(CN[3]);
break;
case 49:
S_PutNum(CN[0]);
S_PutNum(CN[1]);
S_PutNum(P1);
S_PutNum(CN[3]);
break;
case 50:
S_PutNum(CN[0]);
S_PutNum(CN[1]);
S_PutNum(P2);
S_PutNum(CN[3]);
break;
case 51:
S_PutNum(CN[0]);
S_PutNum(CN[1]);
S_PutNum(P3);
S_PutNum(CN[3]);
break;
}
break;
}
}
void S_INT() interrupt 4
{
if(RI)
{
if (CT>3)
{
CT = 0; //收完一组数据,序列指针清零
CN[0] = 0;
CN[1] = 51;
CN[2] = 51;
CN[3] = 0;
}
CN[CT]=SBUF;
P1=SBUF;
<?xml:namespace prefix = st1 />CT++;
RI=0;
if((CN[0]==0x61)&&(CN[3]==0x61)) //用aXXa的简单方式保障接收的可靠性
{
CS2OUT();
}
}
}
void main()
{
unsigned int a;
CT = 0; //接收字符序列
CN[0] = 0;
CN[1] = 51;
CN[2] = 51;
CN[3] = 0;
S_init(6);
UART_Send_Str("串口设置完毕\r\n");
for(a=0;a<10;a++)
{
S_PutNum(0x61);
}
do
{
delay(50000);
delay(50000);
delay(50000);
P2_6 = 1;
delay(50000);
delay(50000);
delay(50000); //指示灯闪动
P2_6 = 0;
}while(1);
}
文章评论(0条评论)
登录后参与讨论