单片机与昆仑通态通讯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*********************************************

**备注:modbus RTU协议,rs485通讯

单片机为从机PLC或者PC为上位机

*********************************************/

#include

#define uchar unsigned char

#define uint unsigned int

sbit rx_led=P0^0;//接收指示灯

sbit tx_led=P0^1;//发送指示灯

sbit ctrl_485=P3^2;//485接发发送转换控制

sbit dm=P1^4;

sbit wm=P1^5;

sbit led_cs=P1^6;

sbit b7=P2^7;//波特率设置位

unsigned int crc=0;

uchar sendBuf[20],receive_count=0,a[10];

uchar send_count= 0,send_num=0,addr_dip=0;

uchar aaa,bbb;

uint crc16(unsigned char *puchMsg, unsigned int usDataLen);

void beginsend(void);

void check_modbus(void);

void display(uint date);

void delay(uint z);

uchar code duan[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71 };

//此数组为!!! 0~9 A B C D E F !!!

uchar code wei[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

//此数组表示数码管显示的位数

void display(uint date) //num 表示在第几位显示words 表示显示的字符

{

P2=duan[date/100];

P1=wei[0];

delay(1);

P1=0xff;

P2=duan[date%100/10];

P1=wei[1];

delay(1);

P1=0xff;

P2=duan[date%10];

P1=wei[2];

delay(1);

}

/*************延时*****************/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=113;y>0;y--);

}

/************串口初始化*****************/ void uart_init(void)

{

TMOD=0x20;//定时器1,模式2

SCON=0x50;//串口通讯方式1

TH1=0xfd;//波特率9600

TL1=0xfd;

if(b7==1)

PCON=0x00;

else

PCON=0x80;

TI=0;//发送中断标志位清零

RI=0;//接收中断标志位清零

TR1=1;//启动定时器1

EA=1;

ES=1;

}

/**************定时器0初始化**************/ void timer0_init(void)

{

TMOD=TMOD&0xf0;

TMOD=TMOD|0x01;

TH0=0; //16位定时计数器

TL0=0;

ET0=1; //允许定时器中断

}

void main(void)

{

dm=0;

wm=0;

led_cs=1;

uart_init();

timer0_init();

ctrl_485=0;//先置为接收

while(1)

{

RI=0;

delay(1);

rx_led=1;

tx_led=1;

if(P2^0==0)

bbb++;

if(bbb==10)

aaa++;

display(aaa);

}

}

void beginsend(void)

{

ctrl_485=1; //开始置位发送状态 TI=0;

send_count = 0;

SBUF = sendBuf[0];

send_num--;

}

void time0() interrupt 1///定时器中断{

TR0=0;

RI=0;

check_modbus();

receive_count=0;

}

void ser() interrupt 4

{

if(TI)

{

if(send_count < send_num)

{

TI=0;

tx_led=0;

SBUF = sendBuf[++send_count]; }

else

{

receive_count=0;

ctrl_485=0;

TI=0;

}

相关文档
最新文档