找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2019|回復: 5
收起左側

這個串口自己寫的 寫到一半不知道怎么寫了 希望有人指導下

[復制鏈接]
ID:125710 發(fā)表于 2016-11-4 23:26 | 顯示全部樓層 |閱讀模式
我想讓單片機收到1的數(shù)據(jù)后 不斷往外發(fā)送  發(fā)送格式是 AA 55 00 01 HH XX DD  其中 AA 55 是固定的  00是地址碼 01是數(shù)據(jù)類型  HH XX DD是數(shù)據(jù)位 0-7的IO口 我控制東西用的  我現(xiàn)在要寫一個程序 一個測試程序 HH XX DD這里有變化 HH從01開始位移 當HH=0X40的時候 HH=00  XX開始從01位移 當位移至 XX=0X40的時候 DD=0X00 DD開始位移 位移至0X40的時候 XX=0X00 地址碼+1   重復HH XX DD的步驟 然后地址碼再+1如此循環(huán) 。 寫了一點點 實在不知道怎么寫了 請教下大家
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() //串口配置函數(shù),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)//數(shù)據(jù)發(fā)送
{

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;
       
}


回復

使用道具 舉報

ID:125710 發(fā)表于 2016-11-4 23:29 | 顯示全部樓層
位移1次發(fā)送一次數(shù)據(jù)出去 格式還是7個字節(jié)
回復

使用道具 舉報

ID:123289 發(fā)表于 2016-11-5 00:10 | 顯示全部樓層
需要做三件事:
第一:需要做一個緩沖區(qū)放需要發(fā)送的所有數(shù)據(jù),設:BUF1為緩沖區(qū)。用數(shù)組也可以。
回復

使用道具 舉報

ID:123289 發(fā)表于 2016-11-5 00:11 | 顯示全部樓層
第二:需要做一個存放數(shù)據(jù)的指針,設為:P放。P放=放入數(shù)據(jù)的地址,放1個數(shù)以后就+1,開始P放=1,以后始終指向末尾,即下一個要放的位置。數(shù)據(jù)何時放不限。
回復

使用道具 舉報

ID:123289 發(fā)表于 2016-11-5 00:12 | 顯示全部樓層
第三:需要做一個發(fā)送數(shù)據(jù)的指針,設為:P發(fā)。開始P發(fā)=1,當P發(fā)<>P放,就從P發(fā)指定的位置取一個數(shù)發(fā)送出去,而后P發(fā)+1;
      當P發(fā)=P放,結束發(fā)送。
回復

使用道具 舉報

ID:123289 發(fā)表于 2016-11-5 00:28 | 顯示全部樓層
本帖最后由 yzwzfyz 于 2016-11-5 00:32 編輯

主程序中,截取部分如下,供參考:
SEND_NEXT:      MOV          A, R_TX1PC發(fā)                    ;取發(fā)送指針
                        CJNE          A, R_TX1PC放, SEND1_TX   ;與存入指針比
                        MOV           R_TX1PC發(fā), #0                 ;相同結束,指針復位,也可不復位(循環(huán)使用)
                        MOV           R_TX1PC放, #0         
                        JMP           SEND1END                         ;結束
;發(fā)、放指針不等來此處,取一個數(shù)發(fā)送           
SEND1_TX:        MOV          A, R_TX1PC發(fā)                   ;將發(fā)送指針                        
                        MOV          DPL, A                              ;指向緩沖區(qū)地址
                        MOV          DPH, #HIGH(BUF1)            ;發(fā)送緩沖區(qū)首
                        MOVX        A, @DPTR                        ;取數(shù)
                        MOV          SBUF, A                           ;發(fā)一個字節(jié)
                        INC           R_TX1PC發(fā)                       ;下個字節(jié)
SEND1END:
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表