单片机与昆仑通态通讯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}