久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于MODBUS協(xié)議的單片機主程序 測試通過
[打印本頁]
作者:
dior2017
時間:
2017-4-26 15:46
標題:
基于MODBUS協(xié)議的單片機主程序 測試通過
基于MODBUS協(xié)議的單片機主程序,測試已通過
0.png
(78.29 KB, 下載次數(shù): 98)
下載附件
2017-4-26 21:53 上傳
單片機源程序:
#include"reg51.h"
#include"lcd.h"
#include"address.h"
#include"intrins.h"
#include"crc.h"
#define uint unsigned int
#define uchar unsigned char
uchar code sendbuf[]={0x01,0x03,0x00,0x0b,0x00,0x01,0xf5,0xc8};
//0x01 從站地址,0x03功能碼,0x00寄存器地址高位,0x09寄存器地址低位,0x00數(shù)據(jù)個數(shù)高位,0x01數(shù)據(jù)個數(shù)低位,0x54CRC校驗碼高位,0x08CRC校驗碼低位
uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code error[]={"error!"};
uchar tem[5],tem1[8];
uchar resvbuf[7];
int i,j;
uchar resvend,temp2;
uint crctemp,temp,temp1;
void convert10(uint dat)
{
uchar i;
tem1[0]='U';
tem1[1]='=';
tem1[7]='V';
tem[0]=dat/10000;
dat=dat%10000;
tem[1]=dat/1000;
dat=dat%1000;
tem[2]=dat/100;
dat=dat%100;
tem[3]=dat/10;
tem[4]=dat%10;
for (i=0;i<5;i++)
{
tem1[i+2]=tab[tem[i]];
}
}
void serial_int() interrupt 4 using 1
{
if(RI)
{
RI=0;
//temp2=SBUF;
resvbuf[j++]=SBUF;
if(j==7)
{
j=0;
resvend=1;
}
}
}
void initserial ()
{
resvend=0;
TMOD=0x20;
PCON=0x00;
SCON=0xd8;
TL1=0xfd;
TH1=0xfd;
TR1=1;
ES=1;
}
void displayout()
{
crctemp=crccheck(resvbuf,5);
temp=resvbuf[5];
temp=temp << 8 | resvbuf[6];
if(temp==crctemp)
{
temp1=0;
temp1 |=resvbuf[3];
temp1= temp1<<8 | resvbuf[4];
convert10(temp1);
printf(tem1,8);
}
else
{
printf(error,16);
}
}
void delay_10us(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(uint n)
{
do
{
delay_10us(131);
}while(--n);
}
void main()
{
initlcd();
initserial();
EA=1;
while(1)
{
i=0;
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
下載:
modbus主機單片機程序.rar
(35.81 KB, 下載次數(shù): 136)
2017-4-26 15:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
lele5211314
時間:
2017-6-17 00:25
實物測試通過了嗎
作者:
zhangshanqiao
時間:
2021-1-17 17:39
簡單,明了,可惜的是各種判斷都省略了,如果用在嚴謹?shù)牡膱龊希@然是不適用的。
作者:
shenyuqiu
時間:
2021-1-18 08:39
用在嚴謹場合不形,MODBUS最基本的一串數(shù)據(jù)接收完成的時間間隔判斷都沒有
作者:
wsh123456789
時間:
2021-7-25 13:55
大鍋,拷貝你得程序,LCD根本不顯示
作者:
wsh123456789
時間:
2021-7-25 20:37
為么我的程序,LCD不顯示
#include"reg51.h"
#include"address.h"
#include"intrins.h"
#include"crc.h"
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
#define uint unsigned int
#define uchar unsigned char
uchar code sendbuf[]={0x01,0x03,0x02,0x00,0x00,0x03,0x04,0x73};
//0x01 從站地址,0x03功能碼,0x20寄存器地址高位,0x00寄存器地址低位,0x00數(shù)據(jù)個數(shù)高位,0x03數(shù)據(jù)個數(shù)低位,0x04CRC校驗碼高位,0x73CRC校驗碼低位
uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code error[]={"error!"};
uchar tem[5],tem1[8];
uchar resvbuf[10];
int i,j;
uchar resvend,temp2;
uint crctemp,temp,temp1;
void convert10(uint dat)
{
uchar i;
tem1[0]='U';
tem1[1]='=';
tem1[7]='V';
tem[0]=dat/10000;
dat=dat%10000;
tem[1]=dat/1000;
dat=dat%1000;
tem[2]=dat/100;
dat=dat%100;
tem[3]=dat/10;
tem[4]=dat%10;
for (i=0;i<5;i++)
{
tem1[i+2]=tab[tem[i]];
}
}
void serial_int() interrupt 4 using 1
{
if(RI)
{
RI=0;
//temp2=SBUF;
resvbuf[j++]=SBUF;
if(j==7)
{
j=0;
resvend=1;
}
}
}
void initserial ()
{
resvend=0;
TMOD=0x20;
PCON=0x00;
SCON=0xd8;
TL1=0xfd;
TH1=0xfd;
TR1=1;
ES=1;
}
void displayout()
{
crctemp=crccheck(resvbuf,9);
temp=resvbuf[9];
temp=temp << 8 | resvbuf[10];
if(temp==crctemp)
{
temp1=0;
temp1 |=resvbuf[3];
temp1= temp1<<8 | resvbuf[4];
convert10(temp1);
LcdShowStr(0, 1, tem1);
//printf(tem1,8);
}
else
{
LcdShowStr(0, 1,error );
//printf(error,16);
}
}
void delay_10us(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(uint n)
{
do
{
delay_10us(131);
}while(--n);
}
/* 等待液晶準備好 */
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB; //讀取狀態(tài)字
LCD1602_E = 0;
} while (sta & 0x80); //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
}
/* 向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值 */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0) //由輸入的屏幕坐標計算顯示RAM的地址
addr = 0x00 + x; //第一行字符地址從0x00起始
else
addr = 0x40 + x; //第二行字符地址從0x40起始
LcdWriteCmd(addr | 0x80); //設置RAM地址
}
/* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //設置起始地址
while (*str != '\0') //連續(xù)寫入字符串數(shù)據(jù),直到檢測到結束符
{
LcdWriteDat(*str++); //先取str指向的數(shù)據(jù),然后str自加1
}
}
/* 初始化1602液晶 */
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)接口
LcdWriteCmd(0x0C); //顯示器開,光標關閉
LcdWriteCmd(0x06); //文字不動,地址自動+1
LcdWriteCmd(0x01); //清屏
}
void main()
{
InitLcd1602();
initserial();
EA=1;
while(1)
{
i=0;
while(i<8)
{
SBUF=sendbuf[i];
while(!TI);
delay_10us(50);
TI=0;
i++;
}
delay_ms(1000);
if(resvend)
{
resvend=0;
displayout();
}
}
}
作者:
wsh123456789
時間:
2021-7-26 12:30
上面程序有點錯誤,改了一下。還是不顯示
#include"reg51.h"
#include"intrins.h"
#include"crc.h"
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
#define uint unsigned int
#define uchar unsigned char
uchar code sendbuf[]={0x01,0x03,0x02,0x00,0x00,0x03,0x04,0x73};
//0x01 從站地址,0x03功能碼,0x20寄存器地址高位,0x00寄存器地址低位,0x00數(shù)據(jù)個數(shù)高位,0x03數(shù)據(jù)個數(shù)低位,0x04CRC校驗碼高位,0x73CRC校驗碼低位
uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code error[]={"error!"};
uchar tem[5],tem1[9];
uchar resvbuf[11];
int i,j;
uchar resvend,temp2;
uint crctemp,temp,temp1;
void convert10(uint dat)
{
uchar i;
tem1[0]='U';
tem1[1]='=';
tem1[7]='V';
tem1[8]='\0';
tem[0]=dat/10000;
dat=dat%10000;
tem[1]=dat/1000;
dat=dat%1000;
tem[2]=dat/100;
dat=dat%100;
tem[3]=dat/10;
tem[4]=dat%10;
for (i=0;i<5;i++)
{
tem1[i+2]=tab[tem[i]];
}
}
void serial_int() interrupt 4 using 1
{
if(RI)
{
RI=0;
//temp2=SBUF;
resvbuf[j++]=SBUF;
if(j==11)
{
j=0;
resvend=1;
}
}
}
void initserial ()
{
resvend=0;
TMOD=0x20;
PCON=0x00;
SCON=0xd8;
TL1=0xfd;
TH1=0xfd;
TR1=1;
ES=1;
}
void displayout()
{
crctemp=crccheck(resvbuf,9);
temp=resvbuf[9];
temp=temp << 8 | resvbuf[10];
if(temp==crctemp)
{
temp1=0;
temp1 |=resvbuf[3];
temp1= temp1<<8 | resvbuf[4];
convert10(temp1);
LcdShowStr(0, 1, tem1);
//printf(tem1,8);
}
else
{
LcdShowStr(0,1,error);
//printf(error,16);
}
}
void delay_10us(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(uint n)
{
do
{
delay_10us(131);
}while(--n);
}
/* 等待液晶準備好 */
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB; //讀取狀態(tài)字
LCD1602_E = 0;
} while (sta & 0x80); //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
}
/* 向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值 */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0) //由輸入的屏幕坐標計算顯示RAM的地址
addr = 0x00 + x; //第一行字符地址從0x00起始
else
addr = 0x40 + x; //第二行字符地址從0x40起始
LcdWriteCmd(addr | 0x80); //設置RAM地址
}
/* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //設置起始地址
while (*str != '\0') //連續(xù)寫入字符串數(shù)據(jù),直到檢測到結束符
{
LcdWriteDat(*str++); //先取str指向的數(shù)據(jù),然后str自加1
}
}
/* 初始化1602液晶 */
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)接口
LcdWriteCmd(0x0C); //顯示器開,光標關閉
LcdWriteCmd(0x06); //文字不動,地址自動+1
LcdWriteCmd(0x01); //清屏
}
void main()
{
InitLcd1602();
initserial();
EA=1;
while(1)
{
i=0;
while(i<8)
{
SBUF=sendbuf[i];
while(!TI);
delay_10us(50);
TI=0;
i++;
}
delay_ms(1000);
if(resvend)
{
resvend=0;
displayout();
}
}
}
作者:
seco_li
時間:
2021-8-6 21:59
不知道這個程序能不能用,學飛一下
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久新视频
|
久久久久久久97
|
亚洲免费在线视频
|
91 中文字幕
|
91一区二区三区在线观看
|
成人在线一区二区三区
|
亚洲福利一区二区
|
亚洲视频二区
|
亚洲精品免费在线观看
|
欧美中文字幕一区二区
|
99tv
|
国产精品美女久久久久aⅴ国产馆
|
中文一区二区
|
国内精品久久久久久久
|
久久精品国产a三级三级三级
|
亚洲狠狠
|
九一视频在线播放
|
国产精品99精品久久免费
|
久久久国产一区二区三区四区小说
|
99免费在线观看
|
毛片久久久
|
美日韩中文字幕
|
亚洲国产成人精品久久久国产成人一区
|
一区二区三区韩国
|
国产精品毛片av
|
欧美伊人久久久久久久久影院
|
精品国产一区二区国模嫣然
|
国产精品久久久久一区二区三区
|
日韩精品一区二区三区在线播放
|
黄色免费观看网站
|
九九热精品视频
|
综合久久亚洲
|
国产超碰人人爽人人做人人爱
|
中文字幕一级毛片视频
|
毛片在线免费
|
国产在线拍偷自揄拍视频
|
久久激情网
|
99在线观看视频
|
国产三级精品视频
|
www久久
|
黄色av免费
|