RS485多机通信程序(终结版AVR)
485通讯从机接收程序(带帧校验)
![485通讯从机接收程序(带帧校验)](https://img.taocdn.com/s3/m/7846126c1eb91a37f1115c01.png)
//从机程序//01数据帧//02命令帧//03功能帧 01 确认 02 否认#include<avr/io.h>#include<avr/interrupt.h>#include<inttypes.h>#include<util/delay.h>#include <avr/pgmspace.h>#include<string.h>#define myaddr 0x01 //定义本机地址#define rx_485(); asm("cbi 0x13,2"); //portd.2清零改为接收状态#define tx_485(); asm("sbi 0x13,2"); //portd.2置位改为发送状态volatile struct conn{unsigned char buf[70];unsigned char data[64];unsigned char srcadd;//源地址unsigned char aimadd;//目的地址unsigned char tp;//帧类型int num;int tmp;unsigned char ver; //验证码;unsigned char err; //错误码; 01:帧校验错}tx,rx;volatile unsigned char com; //命令const unsigned char flash_str[] PROGMEM = "0123456789";ISR(USART_RXC_vect){rx.buf[rx.tmp]=UDR;/*testif(rx.tmp==0 && rx.buf[rx.tmp]=='t'){totx();tx.num=16;strcpy(tx.buf,"can i help you");tx.buf[15]=0x0D;UCSRB|=(1<<UDRIE);//发送帧};*/if(rx.tmp==0 && rx.buf[rx.tmp]!=myaddr) //地址不对直接返回{//禁止接收0.15秒。
RS485双机通信程序
![RS485双机通信程序](https://img.taocdn.com/s3/m/79ac0a395727a5e9856a61e3.png)
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void master(uchar command)
{
uchar aa,i;
DR=1;
SBUF=command;
while(TI!=1);
0xb0,0x92,0x66,0xfF};
uchar rebuf[8];
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar j;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
RS-485双机通信程序
主机程序
此程序的主要特点是加的的校验少,适合初学者利用max485模拟单片机双机通信
建议看程序前看看郭天祥的单片机双机通信或者对于单片机双机通信协议有一个总体的了解,如果有了这个基础我相信你能够很快看明白下面的程序。
#include <reg52.h>
#define uchar unsigned char
PCON=0x00;
TR1=1;
SCON=0xd0;
EA=1;
while(1)
{
DR=0;
ES=1;
for(j=0;j<8;j++)
{
P0=rebuf[j];
delay(1000);
}
}
rs485通讯程序接收0123456789,只接收不发送,使用LM1602液晶显示.doc
![rs485通讯程序接收0123456789,只接收不发送,使用LM1602液晶显示.doc](https://img.taocdn.com/s3/m/c6e3562fef06eff9aef8941ea76e58fafab0456c.png)
rs485通讯程序接收0123456789,只接收不发送,使用LM1602液晶显示2008-12-07 19:45#include <avr/io.h>#include <util/delay.h>#include <inttypes.h>#include<avr/interrupt.h>//液晶为JDH162A 1602液晶 16*2//以下宏定义语句可根据实际情况更改#define dataport PORTB#define datapin PINB#define dataddr DDRB#define conport PORTA#define conddr DDRA#define rw PA5#define rs PA6#define e PA4unsigned char str1[]="Waiting.........";volatile int num;//中断接收函数ISR(USART_RXC_vect){writelocatechar(num,0,UDR);num++;};unsigned char isbusy(void){unsigned char tmp;conport&=~(1<<e); //先清0//设定dataport为输出dataddr=0x00;conport&=~(1<<rs);conport|=(1<<rw);_delay_us(1);conport|=(1<<e);_delay_us(2);tmp=datapin;tmp=tmp&(1<<7);conport&=~(1<<e);return tmp;}void writecom(unsigned char com,unsigned char busy_flag) {if (busy_flag)while(isbusy()!=0);dataddr=0xff;conport&=~(1<<e); //先清0//设定dataport为输出conport&=~((1<<rs)|(1<<rw));_delay_us(1);dataport=com;_delay_us(1);conport|=(1<<e);_delay_us(2);conport&=~(1<<e);dataddr=0x00;}void uart_init(uint8_t ubbrh,uint8_t ubbrl){UCSRB = 0x00; //disable while setting baud rateUCSRA = 0x00;UCSRC =_BV(URSEL)| 0x06;UBRRL = ubbrl; //set baud rate lo//UBRRH = ubbrh; //set baud rate hiUCSRB = 0x90;}void writedata(unsigned char com,unsigned char busy_flag) {if (busy_flag)while(isbusy()!=0);dataddr=0xff;conport&=~(1<<e); //先清0//设定dataport为输出conport&=~(1<<rw);conport|=(1<<rs);_delay_us(1);dataport=com;_delay_us(1);conport|=(1<<e);_delay_us(2);conport&=~(1<<e);dataddr=0x00;}unsigned char readcom(void){unsigned char tmp;conport&=~(1<<e); //先清0//设定dataport为输出dataddr=0x00;conport&=~(1<<rs);conport|=(1<<rw);_delay_us(1);conport|=(1<<e);_delay_us(2);tmp=datapin;conport&=~(1<<e);return tmp;};void init_lcd(void){_delay_ms(15);writecom(0x38,0);_delay_ms(5);writecom(0x38,0);_delay_ms(5);writecom(0x38,0);_delay_ms(5);writecom(0x38,1);writecom(0x08,1);writecom(0x01,1);//清除屏幕writecom(0x06,1);writecom(0x0c,1);};//写指定坐标,制定文字(x为横向 y为纵向 x={0,...13} y={0,1}void writelocatechar(unsigned char x,unsigned char y,unsigned char ch) {writecom(128+x+y*0x40,1);writedata(ch,1);}//字符串长度计算函数 p指向字符串的指针//针对flash字符串长度unsigned char len(const char *p){unsigned char n;n=0;do{n++;p++;}while(*p!=0);return n;}//针对ram中字符串返回字符串个数unsigned char lenr(char *p){unsigned char n;n=0;do{n++;p++;}while(*p!=0);return n;}//字符串清空 p:字符串指针 n:欲清空位数void cleanstr(char *p,unsigned char n){unsigned char i;for(i=0;i<n;i++){*p=0;p++;}}//字符串复制,由flash复制到内存从p2 复制到p1void strftor(char *p1,const char *p2){unsigned char n,i;n=len(p2);for(i=0;i<=n;i++){*(p1+i)=*(p2+i);};}//写字符串函数(针对flash字符串) 错误函数待改进使用read_pgm_str unsigned char strout(const char *p,unsigned char x,unsigned char y) {unsigned char n,i;n=len(p);if(n<=(20-x+(1-y)*20)){for(i=0;i<n;i++){writelocatechar(x,y,*(p+i));x++;if(x==20){x=x-20;y++;}}return 1;}elsereturn 0;}//针对内存字符串输出unsigned char stroutr(char *p,unsigned char x,unsigned char y){unsigned char n,i;n=lenr(p);if(n<=(16-x+(1-y)*16)){for(i=0;i<n;i++){writelocatechar(x,y,*(p+i));x++;if(x==16){x=x-16;y++;}}return 1;}elsereturn 0;}//将16位单片数字转换为字符,10进制数字低位在低地址内存,高位在高地址内存unsigned char adctochar(uint16_t adc,char *p){unsigned char i;uint16_t ys;cleanstr(p,5);i=0;do{ys=adc%10;adc=adc/10;*(p+i)=ys;i++;}while(adc!=0);return i;}//数字显示,从右往左开始显示void shownum(char *p,unsigned char n,unsigned char x,unsigned char y) {unsigned char i;for(i=n;i>0;i--){writelocatechar(x+i-1,y,(*p+48));p++;}}void port_init(void){PORTA = 0x00;DDRA = 0xFF;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}//call this routine to initialize all peripherals void init_devices(void){//stop errant interrupts until set upasm("cli"); //disable all interruptsport_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x00; //timer interrupt sourcesasm("sei"); //re-enable interrupts//all peripherals are now initialized}int main(){init_devices();init_lcd();writecom(0x01,1);//清除屏幕num=0;uart_init(0x00,0x17);asm("sei");while(1);}。
温腾HMI与多个Modbus RTU(RS-485)从机设备通信指南说明书
![温腾HMI与多个Modbus RTU(RS-485)从机设备通信指南说明书](https://img.taocdn.com/s3/m/085bc6092f3f5727a5e9856a561252d380eb20e2.png)
Weintek USA, Inc. Rev. JAN 27, 2020(425) 488-1100Weintek HMI to Multiple Modbus RTU (RS-485) Slave DevicesIntroduction: This instruction manual discusses how to communicate with Modbus RTU slave devices through a RS-485 network. The Modbus RTU protocol is widely used on many industrial sites and adopted by many manufacturers because this protocol is free, open, and simple. Modbus RTU enables master-slave communication between devices connected through serial RS-485 using two-wires. In a RS-485 network, a master queries one or more slave devices for data acquisition or parameter settings. The slaves return a response to all queries addressed to them individually and only respond to the queries transmitted from the master. Typically, a Modbus RS-485 communication network requires a 120 ohm resistor at each physical end of a network. That means there should be a resister at the master and the last slave. The terminating resistor should match the characteristic impedance of the cable being terminated.RS-485 Wiring DiagramEquipment & Software:1.EasyBuilder Pro v6.03.02.2942.Weintek HMI cMT30903.Modbus RTU (RS-485) slave devicesKnowledge of Modbus RTU Protocol:A Modbus slave device provides a Modbus master device with the following memory tables to access data.The supported Modbus Function Codes vary from the manufacturers. The common function codes are shown below.A Modbus map is a list of parameters stored in Modbus addresses. It provides the essential information for users to access data. Most slave devices are built with fixed map defined by the manufacturer. While some Modbus slave devices, such as PLCs or HMIs, allow programmers to configure custom maps. You will need to know the following information defined by your devices.•What is the unit ID of the device? (fixed or configurable?)•Where is data stored? (which tables and addresses)•How is data stored? (data types and byte, word ordering)•How do you find the range?Prerequisites:•Each Modbus RTU slave device must use the same serial configuration, including Baud rate, Data bits, Stop bits, and Parity.•Each Modbus RTU slave devices must be assigned a unique slave ID number (unit address) from 1 to 247.These settings should be configurable by software of your Modbus devices.Detail of the HMI Programming:Open a new project and choose the HMI model cMT3090. To get the HMI talking to the Modbus slaves, go to the [HOME] tab on the top of the menu and then click on the [System Parameters] button.You will need to select one of the drivers based on the specification of your devices.In this case, the Modbus RTU(Zero-based Addressing) driver is used.I/F: RS-485 2WDevice default station no.: You can enter the station number of the first slave device.Click on the [Settings..] button to enter the serial settings of your Modbus slave devices, including Baud rate, Data bits, Stop bits, and Parity.Click on the [Data Conversion] button to implement Byte swap, Word swap, or Double Word swap.•Each character, such as “A”, represents one byte.•AB->BA does a byte swap.•ABCD->CDAB does a word swap.•You can do a byte swap and word swap with 3x_Double and 4x_Double.•ABCDEFGH->EFGHABCD does a double word swap (for CMT HMIs only).•You can do a byte swap, word swap, and double word swap with 3x_QWord4x_QWord (for CMT HMIs only).Since the Modbus protocol does not define exactly how data is stored in the registers. You will need to check with the manufacturer to find out which ordering format your slave device stores data.By default the Modbus RTU master driver in Weintek HMI uses Low byte (or word, double word) first as ordering.Accessible device memory in EasyBuilder ProThe Weintek HMI uses the following Modbus Function Codes.*1. The Modbus RTU(Zero-based Addressing) driver reads a group of 16 bits at a time. Bit groups are 0-15, 16-31, 32-47,48-63, etc. All bits in the group must be available in the controller for the HMI to read. Otherwise, errors will result.*2. The 5x is exactly the same as the 4x. Use the 5x when reading/writing to a 32-bit registers using the low word first format. For example,4x contains the following data,Then use 5x instead of 4x, it will be*3. By default the Weintek HMI uses a Function Code 16 to write multiple registers, even if it is only writing to one register. The 6x forces the HMI to transmit a Function Code 06 to write a single register.Special device memory in EasyBuilder ProHow to read/write 32-bit unsigned dataTo read 32-bit unsinged data from register40106 (combined with 40107 to generate 32-bit data) with high word first format, please check the Word swap[ABCD ->CDAB] option on [Data Conversion].Create a Numeric object and specify the address 4x_Double - 106 on the [General] tab as below.Under the [Format] tab, enter the number of digits used in this parameter as well as the device’s low limit and high limit. Click the [OK] button to finish setting up this object.Place the Numeric object onto the editing area.How to read/write bits in the 4x/3x memory tablesThe 4x_Bit is used to read/write to individual bits in the 4x memory table. To access a bit in 4x memory table, select the 4x_Bit as the address for bit-type objects such as Bit Lamp. Under the Address, use the format DDDDDdd to enter the word memory area, followed by the two-digit bit reference.For example, to monitor the second bit of 40030, enter "3001" into the Address. (DD=30, dd=01)The 3x_Bit works the same as for the 4x_Bit, except that it is used for accessing bits in a 3x memory table (input register, read only).How to read data on the different station numberThe address format of station number is ABC#AddrThe ABC stands for device station number and ranges from 0 to 255.The Addr stands for device address. T he “#” is a sign that separates the station number and the address.To read the station number 2 and address 0, input 2# as prefix.Once finishing the input, the HMI will read address 0 in the 3x (The 3xxxx table) Modbus table using Function Code 0x04.If you input the address without a station number, the HMI will query the default slave device. (where you set up on the Modbus RTU driver)How to use Station Number VariableStation Number Variable allows you to change the station number (unit ID) during runtime to monitor different slaves. Up to 16 Station Number Variables can be used in one project.The address format of Station Number Variables is var{i}#AddrThe i can be a constant value from 0 to 15.The Addr stands for the device address. T he “#” is a sign that separates the station number and the address.In this example, the station number is determined by var1. You will need to enter a station number to System Register LW-10001.A Number object specified the address of the Modbus slaveThe other Number object specified System Register LW-10001When you input the constant value 3 to the Numeric object that is specified address LW-10001 during runtime, the other Numeric object will display thevalue pulled out from the slave ID 3.Founded in 1996, WEINTEK LABS is a global-leading HMI manufacturer and is dedicated to the development, design, and manufacturing of practical HMI solutions. WEINTEK LAB’s mission is to provide quality, customizable HMI-solutions that meet the needs of all industrial automation requirements while maintaining customer satisfaction by prov iding “on-demand” customer service. WEINTEK LABS brought their innovative technology to the United States in 2016, WEINTEK USA, INC., to provide quality and expedient solutions to the North American industrial market.6219 NE 181s Street STE 120Kenmore, WA 98028425-488-1100。
基于avr单片机的485通信系统设计
![基于avr单片机的485通信系统设计](https://img.taocdn.com/s3/m/d58c9178e45c3b3566ec8b10.png)
目录摘要.................................................................. - 1 -Abstract.............................................................. - 2 -1 引言........................................................... - 3 -2 系统总体方案确定................................................... - 4 -2.1 设计方案选择...................................................... - 4 -2.2 设计的内容以及要求................................................ - 4 -2.2.1 设计的内容...................................................... - 4 -2.2.2 设计的要求...................................................... - 4 -3 系统的组成及其工作的原理........................................... -4 -3.1 系统的组成........................................................ -5 -3.2 工作原理.......................................................... - 5 -4 硬件电路方案设计................................................... - 6 -4.1 系统硬件的介绍.................................................... - 6 -4.2 主机电路控制模块.................................................. - 6 -4.2.1 ATmega16 AVR单片机介绍......................................... - 7 -4.3 数据显示模块...................................................... - 8 -4.4 键盘输入模块...................................................... - 9 -4.5 通信电路模块...................................................... - 9 -4.5.1 RS-485协议.................................................... - 10 -4.6 从机控制模块..................................................... - 10 -4.6.1 单片机最小系统................................................. - 10 -5 软件设计......................................................................................................................................... - 12 -5.1 IAR FOR AVR软件的介绍........................................................................................................ - 12 -5.2 通信协议 ...................................................................................................................................... - 13 -5.2.1 串行通信协议RS232和RS485的比较 ........................................................................... - 13 -5.2.2 通信过程.................................................................................................................................. - 13 -5.3 主机程序 ...................................................................................................................................... - 14 -5.3.1 主程序总流程图 .................................................................................................................... - 14 -5.3.2 键盘输入的子程序................................................................................................................ - 15 -5.3.3 用数码管显示子程序 ........................................................................................................... - 16 -5.4 从机程序 ...................................................................................................................................... - 16 -5.4.1 从机总流程图......................................................................................................................... - 16 -5.4.2 接收并且显示主程序 ........................................................................................................... - 17 -6 实验调试和测试结果与分析..................................................................................................... - 18 -总结 ............................................................................................................................................... - 18 -谢辞 ............................................................................................................................................... - 18 -参考文献......................................................................................................................................... - 20 -蚌埠学院本科毕业设计(论文)基于AVR单片机的485通信系统设计摘要:现在的社会是一个数字化的时代,多机通信系统的应用已经广泛渗透到人们生活的方方面面,在科学研究的军事技术领域、文化艺术领域、工程设计领域都有它的应用。
RS-485网络多主机接口解决方案
![RS-485网络多主机接口解决方案](https://img.taocdn.com/s3/m/f1ec4ac714791711cd7917d5.png)
R S-485网络多主机接口解决方案-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIANRS-485网络多主机接口解决方案引言:在RS-485网络(以下简称为485网络)中,经常需要多台主机控制多台从机。
当多台主机同时发送数据时,将发生竞争冒险。
本文采用可重触发单稳态触发器74123作为延时控制,设计了一款多主机485网络中避免RS-485总线(以下简称为485总线)竞争冒险、保持数据完整性的模块。
经过长时间测试,多主机发送数据在485总线上发生竞争冒险的概率降至0.1%以下,取得了显着的效果。
RS-485网络综述RS-485是一种符合工业通讯标准的数据传输总线,它是美国电子工业协会(EIA)制定的平衡发送、差分接收的标准异步串行总线。
RS-485传输数据线路少,易于实现和扩展,传输距离远,最大传输距离可达1200米;它的通讯速率高,数据最高传输速率为10Mbps;它从根本上消除了信号地线,具有很强的抗干扰能力。
它易于实现一对多点的通讯,接口总线上可连接32个站点,加中继器后可达255个站点。
竞争冒险RS-485为半双工接口,采用双向单信道通信方式。
在485网络中,同一个时刻只能有一个站点发送数据,其它站点处于接收状态,以免发生485总线竞争冒险。
485网络中,一台主机控制多台从机,采用主/从通信方式,从机不主动发送数据。
每次通信均从主机发起,不会出现485总线竞争冒险。
在有些工业现场,需要多台主机同时控制从机,如果将主机与从机直接互连,每台主机发送数据为主动的且随机的,直接互连势必出现两台以上主机同时发送数据的情况,数据同时发送到485总线上,造成485总线竞争冒险。
为了避免此错误的发生,在多台主机与485总线之间分别加入一个模块,使多台主机在同一个时刻只能有一台主机数据发送到485总线上,屏蔽其它主机发送信号。
屏蔽原则:在空闲状态下,第一个发送数据的主机不屏蔽,在该主机发送数据结束之前,屏蔽其它主机发送的数据。
RS485通信原理图及程序实例详解
![RS485通信原理图及程序实例详解](https://img.taocdn.com/s3/m/8a6e3a32580102020740be1e650e52ea5518ceec.png)
RS485通信原理图及程序实例详解RS232 标准是诞⽣于 RS485 之前的,但是 RS232 有⼏处不⾜的地⽅:接⼝的信号电平值较⾼,达到⼗⼏ V,使⽤不当容易损坏接⼝芯⽚,电平标准也与TTL 电平不兼容。
传输速率有局限,不可以过⾼,⼀般到⼀两百千⽐特每秒(Kb/s)就到极限了。
接⼝使⽤信号线和 GND 与其它设备形成共地模式的通信,这种共地模式传输容易产⽣⼲扰,并且抗⼲扰性能也⽐较弱。
传输距离有限,最多只能通信⼏⼗⽶。
通信的时候只能两点之间进⾏通信,不能够实现多机联⽹通信。
针对 RS232 接⼝的不⾜,就不断出现了⼀些新的接⼝标准,RS485 就是其中之⼀,它具备以下的特点:采⽤差分信号。
我们在讲 A/D 的时候,讲过差分信号输⼊的概念,同时也介绍了差分输⼊的好处,最⼤的优势是可以抑制共模⼲扰。
尤其当⼯业现场环境⽐较复杂,⼲扰⽐较多时,采⽤差分⽅式可以有效的提⾼通信可靠性。
RS485 采⽤两根通信线,通常⽤ A 和 B 或者 D+和D-来表⽰。
逻辑“1”以两线之间的电压差为+(0.2~6)V 表⽰,逻辑“0”以两线间的电压差为-(0.2~6)V 来表⽰,是⼀种典型的差分通信。
RS485 通信速率快,最⼤传输速度可以达到 10Mb/s 以上。
RS485 内部的物理结构,采⽤的是平衡驱动器和差分接收器的组合,抗⼲扰能⼒也⼤⼤增加。
传输距离最远可以达到 1200 ⽶左右,但是它的传输速率和传输距离是成反⽐的,只有在 100Kb/s 以下的传输速度,才能达到最⼤的通信距离,如果需要传输更远距离可以使⽤中继。
可以在总线上进⾏联⽹实现多机通信,总线上允许挂多个收发器,从现有的 RS485芯⽚来看,有可以挂 32、64、128、256 等不同个设备的驱动器。
RS485 的接⼝⾮常简单,与 RS232 所使⽤的 MAX232 是类似的,只需要⼀个 RS485转换器,就可以直接与单⽚机的 UART 串⼝连接起来,并且使⽤完全相同的异步串⾏通信协议。
新华龙基于RS485的多机通信程序
![新华龙基于RS485的多机通信程序](https://img.taocdn.com/s3/m/ef6cb65ff5335a8102d22079.png)
//-----------------------函数声明,变量定义---------------------#include <reg51.h>sbit RE_DE=P1^0;#define COUNT 10 // 定义接收缓冲区大小#define Slaver_NUM 10unsigned char bdata flag; //在可位寻址去定义一个标志变量sbit time_over_flag =flag^0; //接收超时标志unsigned char buffer[COUNT]; //定义缓冲区unsigned char point; //定义缓冲区位置指示unsigned char Slave_AD[Slaver_NUM]; //定义有效地址存放区unsigned char ADD_num; //有效地址个数unsigned char idata count_10ms; //用于表示有多少次10ms中断unsigned char idata send_data[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //与定义发送数据,共7位void UART_init(); //串口初始化函数void COM_send(void); //串口接收函数unsigned char CLU_checkdata(void); //计算校验位函数//---------------------------------------------------------------// 函数名称: UART_init()串口初始化函数// 函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s // 串口接收中断允许,发送中断禁止,设定定时器中断允许//---------------------------------------------------------------void UART_init(){//初始化串行设置SCON =0x58; //选择串口工作方式为1,打开接收允许,TB8=1 TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1TR1 =1; //启动定时器T1ES=1; //允许串行口中断PS=1; //设计串行口中断优先级//初始化定时器1TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)ET1 =0; //定时器1中断禁止}//---------------------------------------------------------------// 函数名称: timer0_init()初始化定时器0// 函数功能:设置timer0工作模式//---------------------------------------------------------------void timer0_init(){time_over_flag=0;count_10ms=0;ADD_num=0;TL0=0x0F0; //T0用于产生10ms的中断TH0=0x0D8; //50次T0中断产生1次超时溢出ET0=1; //允许定时器0中断}//---------------------------------------------------------------// 函数名称: system_init()系统初始化// 函数功能:调用串口、定时器初始化函数,完成系统初始化//---------------------------------------------------------------void system_init(void){//系统总设置UART_init();timer0_init();EA =1; //单片机中断允许}//---------------------------------------------------------------// 函数名称: com_interrup()串口接收中断处理函数// 函数功能:接收包括起始位"S"在内的十位数据到数据缓冲区//---------------------------------------------------------------com_interrupt(void) interrupt 4 using 3{unsigned char RECEIVR_buffer;if(RI) //处理接收中断{RI=0; //清除中断标志位RECEIVR_buffer=SBUF; //接收串口数据if(point==0) //如果还没有接收到起始位{if(RECEIVR_buffer==0xFE) //判断是否起始标志位{buffer[point++]=RECEIVR_buffer;//把接收到的数据放入接收缓存区}elsepoint=0; //不是,继续等待起始位}else if(point>0&&point<10) //判断是否接收够十位数据buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区else if(point==10){if(RECEIVR_buffer==0xEF) //判断结束标志位是否正确{buffer[point]=RECEIVR_buffer; //把接收到的数据放入接收缓存区 Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存储器//表示该地址有有效设备}elsepoint=0; //不是,继续等待起始位}else point=0; //缓冲区已满,清除缓存区内数据重新接收}if(TI) //串口发送中断{TI=0; //清除发送中断}}//---------------------------------------------------------------// 函数名称: timer0_interrup()// 函数功能:定时器T0中断服务程序// 函数说明:T0枚10ms中断一次,连续中断50次置time_over_flag=1;timer0_interrupt(void) interrupt 1 using 2{count_10ms++;if(count_10ms==50){ET0=0; //关闭定时器T0中断TR0=0; //停止定时器T0time_over_flag=1;//设置接收超时标志count_10ms=0x00; //10ms计数器复位}else{TL0=0x0F0; //重装定时器初始值TH0=0x0D8;}}//---------------------------------------------------------------// 函数名称: COM_send()串口发送函数// 函数功能:把数据缓冲区的十位数据发送出去//---------------------------------------------------------------void COM_send(void){RE_DE=1; //设置MAX483进入发送状态for(point=0;point<=10,TI=1;point++) //连续发送十位数据 //把缓存区的数据都发送到串口{SBUF=buffer[point];TI=0;}RE_DE=0; //设置MAX483进入接收状态}//---------------------------------------------------------------// 函数名称: write_buffer()// 函数功能:写发送缓冲区十位数据void write_buffer(unsigned char slaver_add){unsigned char i;TB8=1; //打开多机通信方式buffer[0]=0xFE;buffer[1]=slaver_add;for(i=2;i<9;i++) //连续发送十位数据//把缓存区的数据都发送到串口{buffer[i]=send_data[i-2];}buffer[9]=0xEF;}//---------------------------------------------------------------// 函数名称:主函数// 函数功能:调度个子函数,完成通信过程//---------------------------------------------------------------void main(void){unsigned char i=0;system_init(); //系统初始化do{ //查旬0到10好地址有没有对应设备write_buffer(i++); //写查询第i号设备的发送信息COM_send(); //调用发送函数,完成发送timer0_init(); //完成一次查询,重新初始定时器0,准备下一次查询}while(time_over_flag&&i<10);}。
RS485主从式多机通讯协议
![RS485主从式多机通讯协议](https://img.taocdn.com/s3/m/b6f14f620b1c59eef8c7b4db.png)
RS485主从式多机通讯协议一、数据传输协议此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。
它制定了消息域格局和内容的公共格式。
此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。
如果需要回应,控制器将生成反馈信息按本协议发出。
1、数据在网络上转输控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。
其它设备(从设备)根据主设备查询提供的数据作出相应反应。
主设备可单独和从设备通信,也能以广播方式和所有从设备通信。
如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则从设备不作任何回应。
协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。
从设备回应消息也由协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。
如果在消息接收过程中发生一错误(无相应的功能码),或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。
2、在对等类型网络上转输在对等网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。
这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。
在消息位,本协议仍提供了主—从原则,尽管网络通信方法是“对等”。
如果一控制器发送一消息,它只是作为主设备,并期望从设备得到回应。
同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。
3、查询—回应周期1)查询查询消息中的功能代码告之被选中的从设备要执行何种功能。
数据段包含了从设备要执行功能的任何附加信息。
错误检测域为从设备提供了一种验证消息内容是否正确的方法。
(2)回应如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。
数据段包括了从设备收集的数据。
RS485总线实现多机通信
![RS485总线实现多机通信](https://img.taocdn.com/s3/m/14b02d0f03d8ce2f00662343.png)
图 $ 也涵盖了前两种方式的应用,在上层计算机上由网络 实现两台计算机的相互通信, 实行双机热备, 下层设备采用双机 切换模块。
!
双机切换的程序解决方式 当两台监控计算机不存在主辅机之分时,都可作为独立的
工作站对下层进行监控时, 以 上方式将不适用,必须寻求新 的解决方式。当 与 下 层 ,-.&/ 设备的 ) * + 驱动程序可由自己 开发时, 可采用程序解决方式。 它既可满足双机热备,也可满 足工作站独立监控。其原理如 图 !。
!
已有的解决方式 实 现 !"#$% 网 络 多 主 节 点 通 信 的 方 式 在 以 往 的 论 文 中 也
H 驱动程序都启动了,只是从机不从自身的 G F H 驱动程序采集
数据而 以 , 但 这 样 不 能 保 证 启 动 后 的 G F H 驱 动 程 序 不 对 !"#$% 总线进行通信访问。
图! 程序解决方式的应用
__B4K:J?KK9O? @@Y8ZCFD<8E6[ ZUAAFM
8JS1+JJSZ+=)‘a[
ZUAA[
895:‘4>-5EOV?+Tb?;:@OS<89:;<I3?E:[ )Z‘)Z)=IFM * * 重新启动事件 ,?K?:I3?E:@OS<89:;<I3?E:FM 6H=57?N5O5E P Q?:=5;L14RE:@FM c * * 如果超过一定时间没有接收到数据则认为主机故障 , 辅 机 转 换 为 主
(D* 增加一个 !"#$% 双机切换模块 为 了 解 决 !"#$% 多 主 通 信 问 题 还 可 以 增 加 一 个 硬 件 模 块
基于LabVIEW和AVR单片机的RS485通信系统设计与实现
![基于LabVIEW和AVR单片机的RS485通信系统设计与实现](https://img.taocdn.com/s3/m/5eaf7b3fb7360b4c2e3f647f.png)
基于LabVIEW和AVR单片机的RS485通信系统设计与实现作者:王彦林来源:《电子技术与软件工程》2015年第17期摘要在介绍工业应用常用串行通信接口的基础上,着重介绍了LabVIEW与Atmega128通过RS485通信的硬件及软件实现形式。
下位机串口通信通过双缓冲队列与单片机中断服务程序相结合的形式,可大大增强串口通信的可靠性和有效性。
实验证明该通信方式的有效性。
【关键词】RS485通信双缓冲 AVR单片机在工业应用领域,设备与设备之间经常需要通信,就如一座桥梁将两个设备进行连接,然而在此过程中,必需用到物理的传输通道和虚拟的通信协议,两者有效结果,才可让设备之间有效互连起来。
传输通道由通信介质和通信接口构成,前者完成数据传输,后者完成数据转换,而通信协议完成数据识别。
通信介质整体上可分为有线通信介质和无线通信介质两大类。
前者工业中常用的有双绞线、同轴电缆、玻璃纤维等;后者如无线网、蓝牙等。
工业中常用的串行通信接口主要是RS232接口和RS485接口。
RS232接口全名是“数据终端设备和数据通讯设备间的串行二进制数据交换接口技术标准”。
早期一般采用25个引脚的DB25接口,后伴随设备的不断改进,现多采用DB9接口,在实际应用中多采用引脚2(RXD)、3(TXD)和5(GND)。
RS232接口具有一定的缺点,主要表现在如下四个方面:第一,接口电路的易损性和不兼容性,即接口信号的电平信号较高,容易损坏电路,另外,RS232接口电平与TTL电平不兼容,需额外的的转换电路方可与TTL电路连接,增加了电路的复杂性;第二,传输的波特率最高20kps,传输速率较低;第三,采用分别使用信号线与信号反回线,易构成共模干扰,即RS232接口抗噪性较差;第四,传输距离有限,仅适合短距离传输,实际上一般50m以内。
针对上述四点不足,产生了其它的串口通信接口,其中以RS485最为典型。
RS485接口中,两线间电压差为+(2~6)V表示逻辑“1”,两线间电压差为-(2~6)V表示逻辑“0”,故RS485接口信号电平比RS232低,进而延长了接口电路使用寿命,并且该电平信号与TTL电平兼容,方便两电路的连接。
基于RS485的多主机对等通信系统的设计与实现
![基于RS485的多主机对等通信系统的设计与实现](https://img.taocdn.com/s3/m/588e78c4b8d528ea81c758f5f61fb7360a4c2b57.png)
软件优化:提高 通信效率,降低 资源消耗
主从机连接与通信流程实现
硬件连接:RS485 总线连接多个主机, 实现数据传输
通信协议:制定并 实现通信协议,保 证数据传输的准确 性和可靠性
数据传输:实现数 据的发送和接收, 保证数据的完整性 和实时性
错误处理:实现错 误检测和恢复机制 ,保证通信的可靠 性和稳定性
A
B
C、以太网等
降低功耗:优化硬件设 计,降低系统功耗,提
高能源利用率
增强安全性:采用加密 技术,提高通信数据的
安全性
提高兼容性:支持多种 硬件平台和操作系统,
提高系统的通用性
总结与展望
系统特点与优势总结
基于RS485的多主机对等通信系统,实 现了多主机之间的实时通信和数据共享。
03
测试方案:功能测试、性能测试、兼容性 测试等
02
软件环境:操作系统、测试软件、驱动程 序等
04
测试结果分析:测试数据、测试报告、问 题定位等
测试过程及结果分析
测试环境搭建:搭建 测试环境,包括硬件
和软件
测试方法:选择合适 的测试方法,如黑盒 测试、白盒测试等
测试数据准备:准备 测试数据,包括正常
度
增强系统稳定 性:优化系统 设计,提高系 统抗干扰能力
降低功耗:采 用低功耗器件, 降低系统能耗
扩展应用领域: 将RS485技术 应用于更多领 域,如工业自 动化、智能家
居等
THANK YOU
0 终端电阻:在总线两端添加终端 4 电阻,防止信号反射和干扰
0 硬件测试:通过测试验证硬件设 6 计的正确性和可靠性
通信软件设计
01
02
03
04
AVR单片机的通信--485专题
![AVR单片机的通信--485专题](https://img.taocdn.com/s3/m/b935fbcaaa00b52acec7ca0d.png)
了复杂度。
如何实现RS232到 RS485的智能转换
• 当RS232要发送数据的时候,485芯片自动 切换到发送状态,当发送完毕后,自动切 换会接受状态,不需要PC机软件控制??
• 方法就是用可重复触发的单稳态触发器 74HC123,当RS232发送数据的时候,会 产生一个下降沿,通过这个下降沿来触发 一个高电平的脉冲来控制485芯片的收发控 制端;
RS485隔离设计--光隔离
磁隔离技术
设计技巧
• 1、远距离通信,隔离是必须的!
• 2、增加防雷、浪涌、ESD防护电路等;
• 3、软件设计方面,例如收发数据之间间隔
3-10ms;
• 4、通信总线两端加终端电阻--120欧姆,
防止信号反射,形成浪涌;
RS232-RS485模块介绍
单片机一侧485转换电路
注意:数据寄存器空中断和发送完成中断的差别!!!
PC机一侧RS485电路
• PC机制有RS232,需要将RS232转换为RS485信
号。可以通过上位机软件中控制串口的一些握手 信号线(DTR、RTS)来控制485的收发控制端,
在发送数据的时候使收发控制端为高电平,平时
智能转换电路
智能转换电路
智能转换电路
TTL的TXD
TTL的RXD
简易电路
RS232转RS485电路总结
• 1:收发自动切换,但是不稳定不高。可能对 高速时不稳定;
• 2、采用74HC123实现一个字节长度的延时,这 个阶段产生并维持发送状态,其余时间维持接 收;缺点:不支持波特率自适应 • 3、采用一个小型的单片机,自动计算波特率 并给出一个字节时间的延时长度,见MAXIM的 应用文档;
RS-485多主机通信的组网方式
![RS-485多主机通信的组网方式](https://img.taocdn.com/s3/m/d5e45b0ee87101f69e3195ae.png)
RS-485多主机通信的组网方式________ 武汉波仕电子有限公司传统的RS-485组网方式只允许一个主机(上位机),但是在许多情况下要求有多台RS-485主机进行组网。
本文以波仕电子的产品为例介绍两种RS-485多主机通信产品及其组网方式----采用RS-485共享器和采用RS-485交换机。
采用共享器可以允许2台主机,而且可以对这2太主机的发送信号按照发送顺序进行优先排序,避免同时发送导致的系统瘫痪。
而采用交换机可以允许4台主机(上位机)控制下位机,而且光电隔离,但是不能够2个上位机同时发送。
1、采用共享器的RS-485多主机通信方式波仕电子的型号为HUB2485Z的RS-485智能共享器用于两个RS-485主机(上位机)共同控制一个RS-485下位机的通信连接。
HUB2485Z使RS-485总线从传统的允许一个主机扩展到允许2个主机。
HUB2485Z已经有2个上位机插座(DB-9针并且配接线端子)和1个下位机的接线端子,无需修改软件、5V供电。
HUB2485Z适用于两台上位机的RS-485口同时驱动一台下位机的RS-485口。
图1 RS-485的2对1智能共享器HUB2485Z的外型为DB-9(针)/ DB-9(针)转接盒大小,其中DB-9针的RS-485的引脚分配同波仕485A型号的转换器并且配接线端子。
两个DB-9针的上位机RS-485口,如图RS-485(1)和RS-485(2)是完全一样的,可以互换。
下位机RS-485为接线端子,位于如图产品的上侧面,与电源接线端子在一起。
HUB2485Z需要外接5V电源,配套提供。
波仕HUB2485Z智能RS-485集线器能够识别两个上位机RS-485(1)和RS-485(2)的发送顺序,避免同时发送导致的系统瘫痪。
也就是说,即使两个上位机正在同时发送,HUB2485Z会选取发送开始时间领先的上位机正确发送数据,而只有等到这一个上位机的数据发送完毕后,另外一个上位机才可以开始发送数据。
RS-485的多机通信方案
![RS-485的多机通信方案](https://img.taocdn.com/s3/m/1309398e50e79b89680203d8ce2f0066f53364c7.png)
76 Microcontrollers &Embedded Systems 2012年第10期www.mesnet.com.cn RS 485的多机通信方案探究魏金文,马维华,吴侨(南京航空航天大学计算机科学与技术学院,南京210016)引 言在嵌入式系统中,多个孤立节点之间的通信越来越重要,尤其是物联网时代的到来,多节点间通信已经成为必不可少的功能。
由此出现了许多通信手段,如RS 232、RS 485、CAN总线、ZigBee等,综合考虑性能和成本,RS485通信无疑是性价比最高的通信方式。
因此探究高效、实用的多机通信方案具有重大的意义。
1 系统框图RS 485多机通信结构图如图1所示。
若干个RS485节点通过总线连接,由网关节点轮询访问索要数据,每个网关节点可以动态地配置IP地址,以便上位机可以通过以太网控制网关节点,从而获得每个RS 485终端节点的数据。
图1中C节点为控制节点,具有RS 485通信功能,T节点为网关节点,除了RS 485功能外,还具有以太网功能,其作用就是将C节点的数据通过以太网功能传送给上位机。
图1 RS 485多机通信结构图2 硬件设计本文采用新唐科技公司的Cortex M054探究RS485多机通信协议。
Cortex M054有两个UART,均可以配置成RS 485模式,此时Cortex M054通过RTSX引脚自动控制RS 485通信方向。
RS 485通过差分传输,A和B两根信号线铰链在一起来抵消各自的干扰。
当A、B信号的电压差大于200mV时,视为逻辑1;当B、A信号的电压差大于200mV时,视为逻辑0。
RS 485硬件原理图如图2所示。
整套RS 485电路独立供电,通过光电耦合器TLP781B+,与系统其他部件分开,以此来隔离干扰。
和CAN总线相同,在机群的两端(第一个节点和最后一个节点),必须加上匹配电阻,吸收反射信号,大小为75Ω左右。
中间节点则不需要如此,因此留出了R1的位置,当节点位于机群两端的时候,则焊接上R1,这种方式大大地增强了电路的灵活性。
单片机RS-485多机通讯的实现
![单片机RS-485多机通讯的实现](https://img.taocdn.com/s3/m/d5ca0f3643323968011c9241.png)
单片机RS-485多机通讯的实现尹红唐煜摘要本文介绍一种能利用RS-485电气特性和简单的结构方式,采用自定义串行通信协议,实现单片机RS-485多机通讯的方法和技巧。
关键词单片机,RS-485总线,总线冲突,串行通信1简介RS-485串行总线接口标准以差分平衡方式传输信号,具有很强的抗共模干扰的能力,允许一对双绞线上一个发送器驱动多个负载设备。
工业现场控制系统中一般都采用该总线标准进行数据传输,而且一般采用RS-485串行总线接口标准的系统都使用8044芯片作为通信控制器或各分机的CPU。
8044芯片内部集成了SDLC,HDLC等通信协议,并且集成了相应的硬件电路,通过硬件电路和标准协议的配合,使系统的通讯准确、可靠、快速。
8044在市场上日渐稀少,虽然有8344可替代,但几百元的价位与普通单片机几元至几十元的价位相差甚远,用户在开发一般的单片机应用系统时,都希望能用简单的电路和简单的通信协议完成数据交换。
譬如:利用单片机本身所提供的简单串行接口,加上总线驱动器如SN75176等组合成简单的RS-485通讯网络。
本文所述的方法已成功地应用于工程项目,一台主机与60台从机通讯,通讯波特率达64KBPS。
2 总线驱动器芯片SN75176常用的RS-485总线驱动芯片有SN75174,SN75175,SN75176。
SN75176芯片有一个发送器和一个接收器,非常适合作为RS-485总线驱动芯片。
SN75176及其逻辑如图1所示。
图1 SN75176芯片及其逻辑关系3 RS-485方式构成的多机通信原理在由单片机构成的多机串行通信系统中,一般采用主从式结构:从机不主动发送命令或数据,一切都由主机控制。
并且在一个多机通信系统中,只有一台单机作为主机,各台从机之间不能相互通讯,即使有信息交换也必须通过主机转发。
采用RS-485构成的多机通讯原理框图,如图2所示。
图2 采用RS-485构成的多机通讯原理框图在总线末端接一个匹配电阻,吸收总线上的反射信号,保证正常传输信号干净、无毛刺。
[毕业设计精品]rs485的单片机多机通信模型[管理资料]
![[毕业设计精品]rs485的单片机多机通信模型[管理资料]](https://img.taocdn.com/s3/m/4664552c5022aaea988f0fc1.png)
毕业论文题目基于RS485的单片机多机通信模型专业电气自动化技术班级06151学生姓名指导教师答辩日期在多机通信领域.由于单片机具有灵活高效的多机通信功能和价格优势,应用越来越广泛,但由于单片机的收发信号都是TTI 电平,驱动能力和抗干扰性有限,实用中常配合其它总线实现互联,RS485总线就是其中之一。
RS485总线是平衡差分传输,抗干扰性好,最远可传输4000 m,可互联多达128个单片机,非常适台组成多机通信系统。
在多机通信中,最重要的是保证通信有条不紊地进行,因此需要严格的通信协议和完善的通信软件,本文将重点介绍应用于某大型工程的单片机多机通信协议和通信软件的设计方法。
本文介绍一种利用单片机本身所提供的串行通讯口,采用自定义串行通信协议,加上总线驱动器如MAX481、MAX483、MAX485、MAX487等组合成简单的RS-485通讯网络,完成单片机间的多机通讯。
关键词: 单片机;串行通信;RS-485总线:多机通信协议第1章绪论...................................................第2章总体介绍总体说..............................................第3章硬件设计及原理.......................................80C51单片机硬件结构.....................................最小应用系统设计........................................ 总线驱动芯片............................................第4章系统问题及其解决.......................................通信规则................................................可靠性及常见故障 .......................................总线匹配................................................RO及DI端配置上拉电阻 .................................总线隔离 ..............................................失效保护 ...............................................地线与接地 ............................................电磁干扰(EMI)问题....................................瞬态保护...............................................第5章软件设计................................................系统结构................................................通信协议................................................通信软件设计.............................................第6章程序设计.................................................第7章系统仿真................................................第1章绪论RS-485采用平衡发送和差分接收方式来实现通信:在发送端TXD将串行口的TTL电平信号转换成差分信号A、B两路输出,经传输后在接收端将差分信号还原成TTL电平信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//功能:延时程序
//QQQQQQQQQQQQQQQQQQQ
void Delay(int t)
{
while(t--);
}
void LDelay(int t) //延时程序(时间较长)
{
for(;t>0;t--)
{
Delay(4000);
}
}
//AD转换
#define ADC_REF_AVCC 0x40
#define MUX_ADC0 0x00
unsigned char ADC_Value;
void AD_Init(void)
{
//CLI();
ACSR |= (1< ADCSRA &=~(1< ADMUX &= 0x20;//清参考电压, ADCn输入端
{
while(t--);
}
void LDelay(int t)//延时程序(时间较长)
{
for(;t>0;t--)
{
Delay(4000);
}
}
//*************************************
//名称:LCDCOM()与LCDTATA()LCDinit()
Delay(100);
PORTD&=~0x80;
}
void LCDTATA(unsigned char tata)
{
unsigned char temptata;
temptata = tata;
DDRC |=0X3F;
DDRD |=0X80;//pd7 output
PORTD&=~0x80;
}
void LCDinit()
{
LCDCOM(0X28);
Delay(3000);
LCDCOM(0X28);
Delay(3000);
LCDCOM(0X28);
Delay(3000);
LCDCOM(0X28);
Delay(3000); //while(t--) Delay(3000)以上
PORTD&=~0x80;
//LLLLLLLLLLL
tata = temptata&0x0f;
PORTC &=0XF0; //清零
Delay(100);
PORTC |=tata;//写指令
Delay(100);
PORTD|=0x80; //EN
Delay(100);
PORTD|=0x80; //EN
Delay(100);
PORTD&=~0x80;
//LLLLLLLLLLL
com = tempcom&0x0f;
PORTC &=0XF0; //清零
Delay(100);
PORTC |=com;//写指令
Delay(200);
PORTD|=0x80; //EN
unsigned char temp; //接收临时变量
unsigned char adr; //从机地址及标志位
const unsigned char LCD[]="IP01 IP02 IP03";
const unsigned char LCDASC[]={0X30,0X31,0X32,0X33,0X34,0X35,0x36,0x37,0x38,0x39};
{
LDelay(2);
//RRRRRRRRRRRRRRRRRRRRRRRR读数据
for(adr=1;adr<4;adr++)
{
SEND(adr); //发送地址寻找从机,地址ADR从01-03
LDelay(20); //延时
}
//RRRRRRRRRRRRRRRRRRRRRRRR读数据
{
unsigned char ADC_dat;
ADCSRA |= (1< while(ADCSR&(1< ADC_dat = ADCH;
LCDCOM(0X08);
Delay(3000);
LCDCOM(0X01);
Delay(3000);
LCDCOM(0X06);
Delay(3000);
LCDCOM(0X0c);
Delay(3000);
LCDCOM(0x01);//清屏
}
//============2 找2号从机,重复步骤1。完了再发03。这样轮换的通信。
程序在实际硬件上已经调试成功,验证了正确性,下面把程序贴出来供大家参考。
采用9位数据帧
下面是程序,使用ICCAVR软件编写
主机程序:
#include
#include
#pragma interrupt_handler uartrupt:12
UCSRA=0X0;
UCSRB=0X0;
//UCSRA=RXC|TXC|UDRE|FE|DOR|PE|U2X|MPCM(10100001)
UCSRA=0X0;//接收数据
//UCSRC=URSEL|UMSEL|UPM1|UPM0|USBS|UCSZ1|UCSZ0|UCPOL
UCSRC|=0x86 ; //设置数据位
if(adr==2){LCDCOM(0xc0+5);TOLCD(temp);}
if(adr==3){LCDCOM(0xc0+10);TOLCD(temp);}
}
//======================
//名称:主函数
//======================
void main()
unsigned char LCDA=0;
unsigned char LCDB=0;
unsigned char LCDC=0;
//QQQQQQQQQQQQQQQQQQQ
//名称:Delay()
//功能:延时程序
//QQQQQQQQQQQQQQQQQQQ
void Delay(int t)
主机:
MAX487的RE和DE连在一起,并接到PD3
PC0-PC3接1602液晶的D4-D7 (只用4条数据线)
PD7接LCD E
PC4接LCD RW
PC5接LCD RS
工作过程:
从机等间隔进行进行AD采样
1. 主机发送地址(adr):01 寻找01从机 ,01号从机收到后,把AD采回来的数据发给主机,主机把数
{unsigned char str;
DDRD|=0X08; //MAX485允许输出
PORTD|=0X08;
USARTinit();
LCDinit();
DDRB |= 0X03; //PORTB OUT
Delay(4000);
Delay(4000);
//液晶第一行:IP1 IP2 IP3
{
DDRD|=0X08; //MAX485允许输出
PORTD|=0X08;
UCSRB|=0x01; //TXB8=0发地址
Delay(1000);
while(!UDRE);
UDR=mydata;
Delay(1000); //必有
PORTD&=~0X08; //发送后立即转为接收等从机发来数据
DDRD |=0X80;//pd7 output
PORTC &=~0x20; //RS = 0
com = com>>4;
com =com&0x0f;
PORTC &=0XF0; //低4位清零
Delay(100);
PORTC |=com;//写指令
Delay(100);
ADMUX |=0X40|MUX_ADC0|(1< ADCSRA |= (1< ADCSRA |= (1< ADCSRA |=0x01;//2分频
SFIOR = 0X00;
ADCSRA |= (1< ADCSRA |= (1< }
unsigned char Read_ADC(void)
LCDCOM(0x80); //第一行
while(LCD[str]!='\0') //字符串是否完成
{
LCDTATA(LCD[str]);
str++;//
}
str=0; //跳出来之后清空str=0切记!切记!
//液晶第一行
while(1)
//名称:USARTinit()
//功能:串行通信初始化,设置引脚功能,波特率,通信方式
//波特率=fosc/16(ubrr+1)
//======================
void USARTinit()
{
UBRRL=25; //波特率2400 //UCSRA 正常波特率
//UBRRH=0x00;
PORTC|=0x20; //RS = 1
tata= tata>>4;
tata &= 0x0f;
PORTC &=0XF0; //清零
Delay(100);
PORTC |=tata;//写指令
Delay(100);
PORTD|=0x80; //EN
Delay(100);