找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1626|回复: 5
打印 上一主题 下一主题
收起左侧

这个串口自己写的 写到一半不知道怎么写了 希望有人指导下

[复制链接]
跳转到指定楼层
楼主
ID:125710 发表于 2016-11-4 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想让单片机收到1的数据后 不断往外发送  发送格式是 AA 55 00 01 HH XX DD  其中 AA 55 是固定的  00是地址码 01是数据类型  HH XX DD是数据位 0-7的IO口 我控制东西用的  我现在要写一个程序 一个测试程序 HH XX DD这里有变化 HH从01开始位移 当HH=0X40的时候 HH=00  XX开始从01位移 当位移至 XX=0X40的时候 DD=0X00 DD开始位移 位移至0X40的时候 XX=0X00 地址码+1   重复HH XX DD的步骤 然后地址码再+1如此循环 。 写了一点点 实在不知道怎么写了 请教下大家
9600波特率


#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int flag,a,b,i;
unsigned char Send_data[7];
unsigned char DATA[3];
void Readdata(void)
{
unsigned char A1;
unsigned char A2;
unsigned char A3;
unsigned char A4;
unsigned char B1;
unsigned char B2;
unsigned char B3;
unsigned char B4;
        A1=0X01;
        A2=0X01;
        A3=0X01;
        A1=_crol_(A1,1);
        DATA[0]=A1;
        DATA[1]=0X10;
        DATA[2]=0X12;
}


void init() //串口配置函数,baud为波特率
{


    TMOD= 0x20;  //配置T1为模式2
    TH1 = 0XFD;
    TL1 = 0XFD;     //初值等于重载值
    TR1 = 1;       //启动T1
    ES  = 1;       //使能串口中断
          SM0=0;
          SM1=1;
          REN=1;
          EA=1;
          ES=1;
}



void Uart1sendData(unsigned char send_data)//数据发送
{

SBUF=Send_data;
}



void main()
{
        init();
        Readdata();

    while(1)
                {
             if(flag==1)
                        {
       ES=0;
                                if(a==1)
                                {
                                        while(1)
                                         {
       Send_data[0]=DATA[0];
                         Send_data[1]=DATA[1];
                         Send_data[2]=DATA[2];
                         
                         
               
           }
         }
                               
          while(!TI);                               
                                        TI=0;
                                 ES=1;flag=0;
      }
                                               
    }
}


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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:125710 发表于 2016-11-4 23:29 | 只看该作者
位移1次发送一次数据出去 格式还是7个字节
回复

使用道具 举报

板凳
ID:123289 发表于 2016-11-5 00:10 | 只看该作者
需要做三件事:
第一:需要做一个缓冲区放需要发送的所有数据,设:BUF1为缓冲区。用数组也可以。
回复

使用道具 举报

地板
ID:123289 发表于 2016-11-5 00:11 | 只看该作者
第二:需要做一个存放数据的指针,设为:P放。P放=放入数据的地址,放1个数以后就+1,开始P放=1,以后始终指向末尾,即下一个要放的位置。数据何时放不限。
回复

使用道具 举报

5#
ID:123289 发表于 2016-11-5 00:12 | 只看该作者
第三:需要做一个发送数据的指针,设为:P发。开始P发=1,当P发<>P放,就从P发指定的位置取一个数发送出去,而后P发+1;
      当P发=P放,结束发送。
回复

使用道具 举报

6#
ID:123289 发表于 2016-11-5 00:28 | 只看该作者
本帖最后由 yzwzfyz 于 2016-11-5 00:32 编辑

主程序中,截取部分如下,供参考:
SEND_NEXT:      MOV          A, R_TX1PC发                    ;取发送指针
                        CJNE          A, R_TX1PC放, SEND1_TX   ;与存入指针比
                        MOV           R_TX1PC发, #0                 ;相同结束,指针复位,也可不复位(循环使用)
                        MOV           R_TX1PC放, #0         
                        JMP           SEND1END                         ;结束
;发、放指针不等来此处,取一个数发送           
SEND1_TX:        MOV          A, R_TX1PC发                   ;将发送指针                        
                        MOV          DPL, A                              ;指向缓冲区地址
                        MOV          DPH, #HIGH(BUF1)            ;发送缓冲区首
                        MOVX        A, @DPTR                        ;取数
                        MOV          SBUF, A                           ;发一个字节
                        INC           R_TX1PC发                       ;下个字节
SEND1END:
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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