找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3364|回复: 30
收起左侧

串口问题求解

  [复制链接]
ID:171584 发表于 2017-4-7 20:50 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P2^0;
uchar flag=0,a=0;
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xf9;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void main()//&Ouml;÷&sup3;&Igrave;&ETH;ò
{
init();
while(1)
{
  if(flag==1)
  {
   ES=0;
   if(a==0x01)
   {
    led=0;
   }
   if(a==0x02)
   {
    led=1;
   }
   flag=0;
   ES=1;
  }

}  
}
void chuan() interrupt 4
{
RI=0;
a=SBUF;
flag=1;

}


为什么我把主函数里的0x02改成0x11之类的就无法实现led亮灭的效果

回复

使用道具 举报

ID:151348 发表于 2017-4-7 21:47 | 显示全部楼层
你发送端发送的是什么
回复

使用道具 举报

ID:187200 发表于 2017-4-8 08:36 | 显示全部楼层
0X02二进制是0X00000010改成0X11就是0X00000011了,位不同
回复

使用道具 举报

ID:187200 发表于 2017-4-8 08:37 | 显示全部楼层
0x02改成0x11的二进制位不同

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:171584 发表于 2017-4-8 11:42 来自手机 | 显示全部楼层
我把0x02改成0x11就不行了
回复

使用道具 举报

ID:171584 发表于 2017-4-8 11:43 来自手机 | 显示全部楼层
imxuheng 发表于 2017-4-7 21:47
你发送端发送的是什么

我把0x02改成0x11或0x3f之类的就不行了,这是为什么?
回复

使用道具 举报

ID:171584 发表于 2017-4-8 13:12 | 显示全部楼层
imxuheng 发表于 2017-4-7 21:47
你发送端发送的是什么

我把0x02改成0x11和0x3f之类的就不行了,这是为什么
回复

使用道具 举报

ID:187428 发表于 2017-4-8 14:44 | 显示全部楼层
我也想知道·····同求
回复

使用道具 举报

ID:151348 发表于 2017-4-8 19:33 | 显示全部楼层
xcj 发表于 2017-4-8 11:43
我把0x02改成0x11或0x3f之类的就不行了,这是为什么?

没问啊,我试了,可以
回复

使用道具 举报

ID:171584 发表于 2017-4-8 21:52 | 显示全部楼层
你就修改了
if(a==0x02)    if(a==0x3f)
这个地方吗?
回复

使用道具 举报

ID:171584 发表于 2017-4-8 21:53 | 显示全部楼层
imxuheng 发表于 2017-4-8 19:33
没问啊,我试了,可以

你就修改了
if(a==0x02)    if(a==0x3f)
这个地方吗?
回复

使用道具 举报

ID:171584 发表于 2017-4-8 21:54 | 显示全部楼层
我把这个改了再下载程序串口输入0x01可以电灯但是输入0x3f等却不灭
回复

使用道具 举报

ID:47286 发表于 2017-4-9 02:39 | 显示全部楼层
xcj 发表于 2017-4-8 21:54
我把这个改了再下载程序串口输入0x01可以电灯但是输入0x3f等却不灭

只修改 if(a==0x02)  成  if(a==0x3f)没问题 你发0x3f就可以

这个程序 先初始化串口  然后主程序不断扫描接收标记是否置1 接收标记由串口服务在接收到数据后置1 每次接收到数据 服务程序把标记置1表示有数据需要处理 主程序发现有要处理的就去比较是什么 如果和if后边的一样 就动作 然后把标记清零 否则丢弃

你改成什么 就要给它发什么 比如02改3f 就得发3f

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:187614 发表于 2017-4-9 08:54 | 显示全部楼层
串口初始化有点小问题,灯亮与灭受控于串口接收数据

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:151348 发表于 2017-4-9 09:05 | 显示全部楼层
xcj 发表于 2017-4-8 21:53
你就修改了
if(a==0x02)    if(a==0x3f)
这个地方吗?

是的,改成什么数,就发什么数,发送模式是16进制模式
回复

使用道具 举报

ID:171584 发表于 2017-4-9 10:08 | 显示全部楼层
dzbj 发表于 2017-4-9 02:39
只修改 if(a==0x02)  成  if(a==0x3f)没问题 你发0x3f就可以

这个程序 先初始化串口  然后主程序不 ...

但我试了下好像只能00到0f可以实现功能
超过了15就无效
回复

使用道具 举报

ID:171584 发表于 2017-4-9 10:11 | 显示全部楼层
dzbj 发表于 2017-4-9 02:39
只修改 if(a==0x02)  成  if(a==0x3f)没问题 你发0x3f就可以

这个程序 先初始化串口  然后主程序不 ...

但我这里好像只能实现16进制的0-15
超了就无法实现了
回复

使用道具 举报

ID:171584 发表于 2017-4-9 10:16 | 显示全部楼层
dzbj 发表于 2017-4-9 02:39
只修改 if(a==0x02)  成  if(a==0x3f)没问题 你发0x3f就可以

这个程序 先初始化串口  然后主程序不 ...

我只有16进制0到15实现功能超过了就不行想0x10就没反应了这是为什么
回复

使用道具 举报

ID:18297 发表于 2017-4-9 10:26 | 显示全部楼层
估计串口上位机设置不对,没有发送对应的码,如选择十六进制数还是ascii码,这个接收到的数据就不一样的。
最直接的方法是不要考虑灯是否亮灭,直接将单片机接收到的数据输出到端口,看是否接收正确。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:171584 发表于 2017-4-9 10:52 | 显示全部楼层
qinyike51 发表于 2017-4-8 08:37
0x02改成0x11的二进制位不同

那要怎么才能发送超过16的16进制才能有效
回复

使用道具 举报

ID:171584 发表于 2017-4-9 11:40 | 显示全部楼层
qinyike51 发表于 2017-4-8 08:36
0X02二进制是0X00000010改成0X11就是0X00000011了,位不同

0x11不是00010001吗?
回复

使用道具 举报

ID:187674 发表于 2017-4-9 12:53 来自手机 | 显示全部楼层
0x是十六进制,后面两个数字是十六进制,你可以写成二进制一位一位的对比一下喃!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:47286 发表于 2017-4-9 13:12 | 显示全部楼层
xcj 发表于 2017-4-8 21:54
我把这个改了再下载程序串口输入0x01可以电灯但是输入0x3f等却不灭

我实测了 没问题(为了降低工作时的功耗 我把led调的特暗 阳光下不太明显)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit led=P1^4;                        //端口改成我的模块上电源灯口了
uchar flag=0,a=0;

void init()        //这孩纸写程序怎么不标注呢
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xf9;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
}

void main()
{
        init();                //串口初始化

        while(1)        //循环
        {
                if(flag==1)                //如果 接收标记为1
                {
                        ES=0;                        //关串口中断
                        if(a==0x01)                //如果接受位是0x01
                        {
                                led=0;                        //开led
                        }
                        if(a==0x3f)                //如果接受位是0x3f
                        {
                                led=1;                        //关led
                        }
                        flag=0;                        //接收标记清零
                        ES=1;                        //开串口中断
                }
        }  
}

void chuan() interrupt 4        //中断服务
{
        RI=0;                //RI位清零
        a=SBUF;                //负值 变量a值为接收缓冲区
        flag=1;                //接收标记置1
}


发01开
01开.jpg


发02关
02关.jpg


发01再开我没截图 反正都一样

发3f关
3f关.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:171584 发表于 2017-4-9 13:37 | 显示全部楼层
dzbj 发表于 2017-4-9 13:12
我实测了 没问题(为了降低工作时的功耗 我把led调的特暗 阳光下不太明显)
#include
#define uchar unsi ...

难道我板子问题?
那蓝牙模块我把tx,rx,gnd,vcc连上后与手机连接怎么操控这段代码
是直接输就可以实现还是要做其他的步奏
回复

使用道具 举报

ID:187691 发表于 2017-4-9 13:51 | 显示全部楼层
你的位设置不同
回复

使用道具 举报

ID:171584 发表于 2017-4-9 14:03 | 显示全部楼层



哪里不对?
回复

使用道具 举报

ID:171584 发表于 2017-4-9 14:25 | 显示全部楼层
zjjhtony 发表于 2017-4-9 10:26
估计串口上位机设置不对,没有发送对应的码,如选择十六进制数还是ascii码,这个接收到的数据就不一样的。
...

那程序要怎么写,刚学搞不清楚
回复

使用道具 举报

ID:18297 发表于 2017-4-9 16:15 | 显示全部楼层

void chuan() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
改成void chuan() interrupt 4
{
RI=0;
P1=SBUF;
flag=1;
}
1)这样每次串口调试软件发送后,就能看到你的芯片接收到啊的数据是否正常;
看proteus的芯片的P1输出是多少,就是你的接收到的;
2)串口调试软件有设置如文本模式,hex模式,一定要设置清楚,不同的设置接收到的数值会不同的。
回复

使用道具 举报

ID:187758 发表于 2017-4-9 16:33 | 显示全部楼层
xcj 发表于 2017-4-8 11:43
我把0x02改成0x11或0x3f之类的就不行了,这是为什么?

百度一下?
回复

使用道具 举报

ID:171584 发表于 2017-4-9 19:00 | 显示全部楼层
zjjhtony 发表于 2017-4-9 16:15

void chuan() interrupt 4
{

像这样是不是led只会闪一下
回复

使用道具 举报

ID:171584 发表于 2017-4-9 19:29 | 显示全部楼层
zjjhtony 发表于 2017-4-9 16:15

void chuan() interrupt 4
{

还有我想问下HC-05蓝牙模块与手机连接后是不是直接可以发送指令
需要别的什么操作吗?

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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