久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1261|回復(fù): 1
收起左側(cè)

CC2530采集485型modbus傳感器數(shù)據(jù),代碼如下,功能無法實現(xiàn),希望大家進(jìn)行指點,bu...

[復(fù)制鏈接]
ID:841786 發(fā)表于 2022-7-30 16:03 | 顯示全部樓層 |閱讀模式
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define rs485_de P1_7
#define rs485_re P1_5
//延時啊
void delay(unsigned int t,unsigned int u)
{
        unsigned int i,j;
    for(i=0;i<t;i++)
        for(j=0;j<u;j++);
}

//延時
void Delay(uint n)
{
uint i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}

void Init485_Port()
{
  //初始化RS485  
  P1SEL &= ~0xA0;            //P1-7作 P1-5為通用I/O口
  P1DIR |= 0xA0;            
}

void Init485_send()    //傳感器發(fā)送數(shù)據(jù)  
{
  Init485_Port();
  rs485_de =0;
  rs485_re =0;
}
void Init485_rec()    //傳感器發(fā)接收數(shù)據(jù)
{
  Init485_Port();
  rs485_de =1;
  rs485_re =1;
}
/* 485通信 */
unsigned char len;
unsigned char buf[40]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};  //讀取讀取葉面溫濕度設(shè)備(地址 0x01)的溫濕度值
int flagFrame = 0;  //幀接收完成標(biāo)志,即接收到一幀新數(shù)據(jù)
int flagTxd = 0; //單字節(jié)發(fā)送完成標(biāo)志,用來替代 TXD 中斷標(biāo)志位
unsigned char cntRxd = 0;   //接收字節(jié)計數(shù)器
unsigned char  bufRxd[64];  //接收字節(jié)緩沖區(qū)

unsigned char TORH=0;//定時器中用到
unsigned char TORL=0;

unsigned int wendu_H=0x00;                 //溫度值高4位字節(jié)
unsigned int wendu_L=0x00;                 //溫度值低4位字節(jié)
unsigned int shidu_H=0x00;                 //濕度值高4位字節(jié)
unsigned int shidu_L=0x00;                 //濕度值低4位字節(jié)


/* 串口配置函數(shù),baud-通信波特率 */
void initUART0(void)
{
  CLKCONCMD &= ~0x40;                           //設(shè)置系統(tǒng)時鐘源為32MHZ晶振
  while(CLKCONSTA & 0x40);                      //等待晶振穩(wěn)定
  CLKCONCMD &= ~0x47;                           //設(shè)置系統(tǒng)主時鐘頻率為32MHZ

  PERCFG = 0x00;                                  //位置1 P0口
  P0SEL = 0x3c;                                  //P0用作串口
  P2DIR &= ~0XC0;                               //P0優(yōu)先作為UART0   

  U0CSR |= 0x80;                                  //串口設(shè)置為UART方式
  U0GCR |= 7;                               
  U0BAUD |= 59;                                  //波特率設(shè)為4800
//中斷設(shè)置可能需要修改
  UTX0IF = 1; //UART0 TX 中斷標(biāo)志初始置位 1
  U0CSR |= 0X40; //允許接收
  IEN0 |= 0x84; //開總中斷,接收中斷
}

/* 串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度 */
void UartWrite(unsigned char *buf, unsigned char len)
{
        Init485_rec();
    while (len--)  //循環(huán)發(fā)送所有字節(jié)
    {
        flagTxd = 0;       //清零發(fā)送標(biāo)志
        U0DBUF = *buf++;     //發(fā)送一個字節(jié)數(shù)據(jù)
        while (!flagTxd); //等待該字節(jié)發(fā)送完成
    }
        Delay(500);
        Init485_send();
}

/* 串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度 */
unsigned char UartRead(unsigned char *buf, unsigned char len)
{
    unsigned char i;

    if (len > cntRxd)  //指定讀取長度大于實際接收到的數(shù)據(jù)長度時,
   {                     //讀取長度設(shè)置為實際接收到的數(shù)據(jù)長度
       len = cntRxd;
   }
   for (i=0; i<len; i++)  //拷貝接收到的數(shù)據(jù)到接收指針上
   {
       *buf++ = bufRxd[i];
   }
   cntRxd = 0;  //接收計數(shù)器清零
   return len;  //返回實際讀取長度
}


/* 串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔 */
void UartRxMonitor(unsigned char ms)
{
    static unsigned char cntbkp = 0;
    static unsigned char idletmr = 0;

    if (cntRxd > 0)  //接收計數(shù)器大于零時,監(jiān)控總線空閑時間
    {
        if (cntbkp != cntRxd)  //接收計數(shù)器改變,即剛接收到數(shù)據(jù)時,清零空閑計時
        {
            cntbkp = cntRxd;
            idletmr = 0;
        }
        else                      //接收計數(shù)器未改變,即總線空閑時,累積空閑時間
        {
            if (idletmr < 30) //空閑計時小于 30ms 時,持續(xù)累加
            {
                idletmr += ms;
                if (idletmr >= 30) //空閑時間達(dá)到 30ms 時,即判定為一幀接收完畢
                {
                    flagFrame = 1;  //設(shè)置幀接收完成標(biāo)志
                }
            }
        }
    }
    else
    {
        cntbkp = 0;
    }
}

/****************************************************************
                     中斷處理函數(shù)
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
if (URX0IF)  //接收到新字節(jié)
    {
        URX0IF = 0;  //清零接收中斷標(biāo)志位
        if (cntRxd < sizeof(bufRxd)) //接收緩沖區(qū)尚未用完時,
        {                                 //保存接收字節(jié),并遞增計數(shù)器
            bufRxd[cntRxd++] = U0DBUF;
        }
    }
    if (UTX0IF)  //字節(jié)發(fā)送完畢
    {
        UTX0IF = 0;   //清零發(fā)送中斷標(biāo)志位
        flagTxd = 1;  //設(shè)置字節(jié)發(fā)送完成標(biāo)志
    }

}

/****************************************************************
                     定時器
****************************************************************/
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;
        tmp=16000000/12;          //12M晶振
        tmp=(tmp*ms)/1000;
        tmp=65536-tmp;
        tmp=tmp+33;
        T1CTL = 0x0d;
        TORH=(unsigned char)(tmp>>8);
        TORL=(unsigned char)tmp;
        T1CC0L=TORL;
        T1CC0H=TORL;
        T1IE=1;
        T1OVFIM=1;
        EA=1;
        T1CTL|=0x03;
}

void main()
{
ConfigTimer0(1);
initUART0();         //設(shè)置波特率2400
delay(200,500);
UartWrite(buf,len);         //向傳感器發(fā)送命令,01 03 02 00 00 03 04 73
if (flagFrame) //有命令到達(dá)時,讀取處理該命令
    {
       flagFrame = 0;
       len = UartRead(buf, sizeof(buf));  //將接收到的命令讀取到緩沖區(qū)中
        }
shidu_H=bufRxd[3];                //數(shù)據(jù)幀第3字節(jié)是溫度值高位,
shidu_L=bufRxd[4];                //數(shù)據(jù)幀第4字節(jié)是溫度值低位。
wendu_H=bufRxd[5];                //數(shù)據(jù)幀第4字節(jié)是溫度值高位,
wendu_L=bufRxd[6];                //數(shù)據(jù)幀第5字節(jié)是溫度值低位。
}
/****************************************************************
                     定時器中斷
****************************************************************/
#pragma vector = T1_VECTOR
__interrupt void T1_INT(void)
{
        T1CC0L=TORL;
        T1CC0H=TORH;
        UartRxMonitor(1);  //串口接收監(jiān)控
}


回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-7-30 18:07 | 顯示全部樓層
你這延時,看著都別扭,用得著5個for嗎?485是要先操作DE和RE來確定為接收還是發(fā)送模式的
485可以連續(xù)發(fā)送多個字節(jié),可以用數(shù)組發(fā)送
這是我的485發(fā)送程序,你參考一下
Delay10us:10uS延時函數(shù)
Send_Out_Byte:串口發(fā)送一個字節(jié)函數(shù),根據(jù)不同單片機,自己寫
void Send_Rs485(unsigned char *buf,unsigned char len)//RS485發(fā)送數(shù)據(jù),待發(fā)送數(shù)據(jù)指針buf,數(shù)據(jù)長度len
{
        RE=1;                                        //RS485設(shè)定為發(fā)送狀態(tài)
        Delay10us(5);                         //此處要加延時,讓MAX485有反應(yīng)的時間
        do
        {                               
                Send_Out_Byte(*buf);//通過串口發(fā)送到485總線
                buf++;
        }
        while(len--);
        Delay10us(5);                        //延時
        RE=0;                                        //RS485設(shè)定為接收狀態(tài)
}

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 最新中文字幕在线播放 | 日韩中文字幕 | 男人天堂手机在线视频 | a国产视频 | 国产日韩欧美综合 | 国产精品欧美一区喷水 | 性高湖久久久久久久久aaaaa | 色综合久久天天综合网 | 老外黄色一级片 | 黄色一级免费 | 国产日韩欧美在线 | 日韩在线中文 | 国产一区二区三区四区 | 亚洲成人午夜电影 | 国产亚洲精品久久午夜玫瑰园 | 欧美激情在线观看一区二区三区 | 久久久女女女女999久久 | 亚洲高清电影 | 久草在线影| 精品久久久久久久人人人人传媒 | 超碰成人免费观看 | 在线观看的av | 国产成人精品a视频 | 中文天堂在线观看 | 中文在线视频 | 久久国产精品99久久久久 | 亚洲区一区二 | 国产一区二区三区久久久久久久久 | 日韩视频一区二区三区 | 欧美大片一区 | 国产精品一区二区在线 | 91亚洲免费 | 国产精品成人一区二区 | 91精品国产91久久久久久最新 | 欧美成人免费在线视频 | 美女视频一区二区三区 | 羞羞网站在线免费观看 | 国产激情亚洲 | 毛片国产 | 伦理片97| 美国一级毛片a |