找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3521|回复: 10
收起左侧

52单片机学习中,通过串口发字符的问题,请大侠帮忙

[复制链接]
ID:161951 发表于 2017-7-7 17:01 | 显示全部楼层 |阅读模式
一台成品机器通过串口助手找出来的控制代码:FE  68  00  01  0F  00  00  76  16 。我这里用了如下程序代码,可是就发不出这样的 16 进制代码,只能发出相同的字符,希望有大侠给指点指点,谢谢!
QQ截图20170703102401.jpg
QQ截图20170707162624.jpg

#include <reg52.h>
#define botelv                /*波特率定义为1200*/
unsigned char zifuchuan[]="FE 68 00 01 0F 00 00 76 16";                        //待显示字符。
volatile unsigned char sending;
sbit s2=P3^4;

void delay(unsigned char i)
{
        unsigned char j,k;
        for(j=i;j>0;j--)
                for(k=90;k>0;k--);
}
void init(void)                                //串口初始化
{
EA=0; //暂时关闭中断
TMOD&=0x0F;  //定时器1模式控制在高4位
TMOD|=0x20;    //定时器1工作在模式2,自动重装模式
SCON=0x50;     //串口工作在模式1
TH1=0xE8;  //计算定时器重装值
TL1=0xE8;
//PCON|=0x80;    //串口波特率加倍
ES=1;         //串行中断允许
TR1=1;        //启动定时器1
REN=1;        //允许接收
EA=1;         //允许中断
}

void send(unsigned char d)                  //发送一个字节的数据,形参d即为待发送数据。
{

SBUF=d; //将数据写入到串口缓冲
sending=1;         //设置发送标志
while(sending); //等待发送完毕
}

void sendc(unsigned char * pd)
{
while((*pd)!='\0') //发送字符串,直到遇到0才结束
{
  send(*pd); //发送一个字符
  pd++;  //移动到下一个字符
}
}

void main()
{
        init();
        while(1)
        {
                if(s2==0)
                {
                        delay(20);
                        if(!s2)
                        {
                                while(!s2);               
                                sendc(zifuchuan);
                        }
                }
        }
}

void uart(void) interrupt 4                 //串口发送中断
{
if(RI)    //收到数据
{
  RI=0;   //清中断请求
}
else      //发送完一字节数据
{
  TI=0;
  sending=0;  //清正在发送标志
}
}



回复

使用道具 举报

ID:82765 发表于 2017-7-7 18:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:210756 发表于 2017-7-7 19:54 | 显示全部楼层
unsigned char zifuchuan[]="FE 68 00 01 0F 00 00 76 16";&nbsp;改成unsigned char zifuchuan[]={0xfe,……}这种形式
回复

使用道具 举报

ID:103316 发表于 2017-7-7 20:03 | 显示全部楼层
首先,你发送的是字符串,也就是"FE 68 00 01 0F 00 00 76 16"这一串的ASCII码,你要写成unsigned char zifuchuan[]=0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16";还有,51单片机的停止位是1位,你的串口调试助手上面是两位
回复

使用道具 举报

ID:161951 发表于 2017-7-7 22:23 | 显示全部楼层
怯情久° 发表于 2017-7-7 20:03
首先,你发送的是字符串,也就是"FE 68 00 01 0F 00 00 76 16"这一串的ASCII码,你要写成unsigned char zif ...

unsigned char zifuchuan[]=0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16";
改了问题依旧哟  串口调试助手停止位也改成1位了。
回复

使用道具 举报

ID:213173 发表于 2017-7-8 07:10 | 显示全部楼层
hdle 发表于 2017-7-7 22:23
unsigned char zifuchuan[]=0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16";
改了问题依旧哟  串口调试 ...

你改成这样还是字符串,不要用双引号,要用花括号,如楼上所述unsigned char zifuchuan[]={0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16};
回复

使用道具 举报

ID:103316 发表于 2017-7-8 09:09 | 显示全部楼层
hdle 发表于 2017-7-7 22:23
unsigned char zifuchuan[]=0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16";
改了问题依旧哟  串口调试 ...

没打全,是unsigned char zifuchuan[]={0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16};
还有你的发送代码要改一下,别用指针了,既然知道要发送几个数据,直接发送固定长度的字符串就行。 void sendc(unsigned char  *pd)
{
unsigned char i;
for(i=0;i<9;i++)
{
  send(*pd); //发送一个字符
}
}
回复

使用道具 举报

ID:161951 发表于 2017-7-8 10:43 | 显示全部楼层
怯情久° 发表于 2017-7-8 09:09
没打全,是unsigned char zifuchuan[]={0XFE,0X68,0X00,0X01,0X0F,0X00,0X00,0X76,0X16};
还有你的发送 ...

修行的路上有困难也不会害怕了,在51黑中有你们真好!
大侠依你的指点,问题解决了,非常的感谢!
sendc(unsigned char  *pd)
{
unsigned char i;
for(i=0;i<9;i++)
{
  send(*pd); //发送一个字符
  pd++;  //移动到下一个字符
}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表