找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口开机发送01数据

[复制链接]
ID:237942 发表于 2017-11-15 09:41 | 显示全部楼层 |阅读模式
要求实现的功能是上电后始终发送01数据,但是单片机必须接受过才能发送,程序不长,求指点迷津。


#include <reg51.h>

#define uchar unsigned char

void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}

void main(void)
{
    InitUART();
}

void UARTInterrupt(void) interrupt 4
{
        uchar m=1;
   SendOneByte(m);
    TI = 0;
}

S6]@FCRN0HQKG61$370YR]F.png
回复

使用道具 举报

ID:164602 发表于 2017-11-15 10:13 | 显示全部楼层
要求只发送特定的值,很简单嘛。
在你的程序中,去掉中断功能,串口中断是为了接收而准备的。
你的程序我改为这样,你试试:
#include <reg51.h>

void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    TR1 = 1;
}

void SendOneByte(void)
{
    SBUF = 0x01;
    while(!TI);
    TI = 0;
}

void main(void)
{
    InitUART();
    while(1)
    {
        SendOneByte();
    }
}


我没有检验你的波特率,因为你没有告诉我硬件是怎么样的,如晶振频率等

回复

使用道具 举报

ID:237942 发表于 2017-11-15 11:26 | 显示全部楼层
我用11.0592M的晶振,我自己把程序改了,但是在正确接收到数据之前,前面一直有几组数据帧是错误的。我查了资料说是串扰,可是我用的开发板有没有引入其他信号,怎么会有串扰这个问题呢,很纳闷求解答?  
再请教一个问题,比如说我想只发一次,这个函数一直在循环,具体我要怎么处理
回复

使用道具 举报

ID:237942 发表于 2017-11-15 11:34 | 显示全部楼层
我把你的程序烧写进去后,  结果 如下:
01 40 01 40 01 40 01 40 01 40 01 40  40  40 40............后面一直都发送40,这是什么问题呢
回复

使用道具 举报

ID:249790 发表于 2017-11-15 19:52 | 显示全部楼层
不大明白
回复

使用道具 举报

ID:249565 发表于 2017-11-15 20:50 | 显示全部楼层
数据 : 0103 0000000000000000 1f 0103 0100000000000000 11 0103 0200000000000000 03 0103 0300000000000000 0d 0103 0400000000000000 12 0103 0500000000000000 1c 0103 0600000000000000 0e 求大佬 告知 算法
回复

使用道具 举报

ID:237942 发表于 2017-11-21 15:20 | 显示全部楼层
lucyxi 发表于 2017-11-15 20:50
数据 : 0103 0000000000000000 1f 0103 0100000000000000 11 0103 0200000000000000 03 0103 030000000000 ...

你这个  是哪里的 ? 看这数据帧也不想是协议里面的,难道是自己定义的么?
  还有那个起始位都是0103开始,应该有规律,只是没有参考数据
回复

使用道具 举报

ID:47286 发表于 2017-11-21 16:21 | 显示全部楼层
你用的是12T?波特率是多少? 你自己完整的程序发上来看看
回复

使用道具 举报

ID:213173 发表于 2017-11-21 18:47 | 显示全部楼层
GG276192978 发表于 2017-11-15 11:34
我把你的程序烧写进去后,  结果 如下:
01 40 01 40 01 40 01 40 01 40 01 40  40  40 40............后 ...

你试试
#include <reg51.h>
void InitUART(void)
{
        TMOD=0x20;//定时器1方式2(8位重载)
        TH1=0xfd;//定时器1重载 波特率9600
        TL1=0xfd;//定时器1重载
        TR1=1;        //开定时器1
        SM0=0;        //设置串口方式1(8位UART波特率可变)
        SM1=1;        //设置串口方式1(8位UART波特率可变)
}

void SendOneByte(void)
{
    SBUF = 0x01;
    while(!TI);
    TI = 0;
}

void main(void)
{
    InitUART();
    while(1)
    {
        SendOneByte();
    }
}
回复

使用道具 举报

ID:252026 发表于 2017-11-21 19:50 | 显示全部楼层
你用的晶振是多少啊?
回复

使用道具 举报

ID:252113 发表于 2017-11-21 23:11 | 显示全部楼层
好难
好难好难
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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