RS485多机通信程序终结版AVRWord文档下载推荐.docx
- 文档编号:20923215
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:8
- 大小:17.12KB
RS485多机通信程序终结版AVRWord文档下载推荐.docx
《RS485多机通信程序终结版AVRWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《RS485多机通信程序终结版AVRWord文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
完了再发03。
这样轮换的通信。
程序在实际硬件上已经调试成功,验证了正确性,下面把程序贴出来供大家参考。
采用9位数据帧
下面是程序,使用ICCAVR软件编写
主机程序:
#include
#pragmainterrupt_handleruartrupt:
12
unsignedchartemp;
//接收临时变量
unsignedcharadr;
//从机地址及标志位
constunsignedcharLCD[]="
IP01IP02IP03"
;
constunsignedcharLCDASC[]={0X30,0X31,0X32,0X33,0X34,0X35,0x36,0x37,0x38,0x39};
unsignedcharLCDA=0;
unsignedcharLCDB=0;
unsignedcharLCDC=0;
//QQQQQQQQQQQQQQQQQQQ
//名称:
Delay()
//功能:
延时程序
voidDelay(intt)
{
while(t--);
}
voidLDelay(intt)//延时程序(时间较长)
{
for(;
t>
0;
t--)
Delay(4000);
//*************************************
//名称:
LCDCOM()与LCDTATA()LCDinit()
1602液晶显示
voidLCDCOM(unsignedcharcom)
unsignedchartempcom;
tempcom=com;
DDRC|=0X3F;
//PORTC0-5OUTPUT
DDRD|=0X80;
//pd7output
PORTC&
=~0x20;
//RS=0
com=com>
>
4;
com=com&
0x0f;
=0XF0;
//低4位清零
Delay(100);
PORTC|=com;
//写指令
PORTD|=0x80;
//EN
PORTD&
=~0x80;
//LLLLLLLLLLL
com=tempcom&
//清零
Delay(200);
voidLCDTATA(unsignedchartata)
unsignedchartemptata;
temptata=tata;
PORTC|=0x20;
//RS=1
tata=tata>
tata&
=0x0f;
PORTC|=tata;
tata=temptata&
voidLCDinit()
LCDCOM(0X28);
Delay(3000);
//while(t--)Delay(3000)以上
LCDCOM(0X08);
LCDCOM(0X01);
LCDCOM(0X06);
LCDCOM(0X0c);
LCDCOM(0x01);
//清屏
//======================
USARTinit()
串行通信初始化,设置引脚功能,波特率,通信方式
//波特率=fosc/16(ubrr+1)
voidUSARTinit()
UBRRL=25;
//波特率2400//UCSRA正常波特率
//UBRRH=0x00;
UCSRA=0X0;
UCSRB=0X0;
//UCSRA=RXC|TXC|UDRE|FE|DOR|PE|U2X|MPCM(10100001)
//接收数据
//UCSRC=URSEL|UMSEL|UPM1|UPM0|USBS|UCSZ1|UCSZ0|UCPOL
UCSRC|=0x86;
//设置数据位
//UCSRB=RXCIE|TXCIE\UDRIE|RXEN|TXEN|UCSZ2|RXB8|TXB8(10011000)
UCSRB=0X9c;
//引脚功能设为TXD与RXD,发送地址//UCSZ2=1即9位数据
MCUCR|=0x00;
//开中断(MCU控制寄存器)
GICR=0x00;
////通用中断控制器
TIMSK=0x00;
//定时计数据中断屏蔽寄存器
//总中断必须是最后使能
SREG|=0x80;
//开中断
//========================
发送地址函数
//功能:
寻找从机
voidSEND(unsignedcharmydata)
DDRD|=0X08;
//MAX485允许输出
PORTD|=0X08;
UCSRB|=0x01;
//TXB8=0发地址
Delay(1000);
while(!
UDRE);
UDR=mydata;
//必有
=~0X08;
//发送后立即转为接收等从机发来数据
//==分解数
voidTOLCD(unsignedcharLCDP)//发送变量数据给LCD
LCDA=LCDP/100;
LCDA=(int)LCDA;
LCDB=(LCDP%100)/10;
LCDB=(int)LCDB;
LCDC=(LCDP%100)%10;
LCDC=(int)LCDC;
LCDTATA(LCDASC[LCDA]);
LCDTATA(LCDASC[LCDB]);
LCDTATA(LCDASC[LCDC]);
接收中断
接收数据
voiduartrupt()
temp=UDR;
//读数据
//第一行显示:
IP01IP02IP03
//各从机数据在LCD的第二行,不同位置显示
//IP01IP02IP03
//1.2V2.3V3.6V
//显示如上,控制显示位置是下面这几句:
if(adr==1){LCDCOM(0xc0);
TOLCD(temp);
}
if(adr==2){LCDCOM(0xc0+5);
if(adr==3){LCDCOM(0xc0+10);
主函数
voidmain()
{unsignedcharstr;
USARTinit();
LCDinit();
DDRB|=0X03;
//PORTBOUT
//液晶第一行:
IP1IP2IP3
LCDCOM(0x80);
//第一行
while(LCD[str]!
='
\0'
)//字符串是否完成
LCDTATA(LCD[str]);
str++;
//
str=0;
//跳出来之后清空str=0切记!
切记!
//液晶第一行
while
(1)
LDelay
(2);
//RRRRRRRRRRRRRRRRRRRRRRRR读数据
for(adr=1;
adr<
adr++)
SEND(adr);
//发送地址寻找从机,地址ADR从01-03
LDelay(20);
//延时
}
从机程序:
unsignedcharsendtata=123;
voidLDelay(intt)//延时程序(时间较长)
//AD转换
#defineADC_REF_AVCC0x40
#defineMUX_ADC00x00
unsignedcharADC_Value;
voidAD_Init(void)
//CLI();
ACSR|=(1<
ADCSRA&
=~(1<
ADMUX&
=0x20;
//清参考电压,ADCn输入端
ADMUX|=0X40|MUX_ADC0|(1<
ADCSRA|=(1<
ADCSRA|=0x01;
//2分频
SFIOR=0X00;
ADCSRA|=(1<
}
unsignedcharRead_ADC(void)
unsignedcharADC_dat;
while(ADCSR&
(1<
ADC_dat=ADCH;
return(ADC_dat);
//波特率2400
UCSRA|=0X01;
//只接收地址,从机CPCM=1
//UCSRC=URSEL|UMSEL|UPM1|UPM0|USBS|UCSZ1|UCSZ0|UCPOL(10000110)
UCSRC|=0x86;
UCSRB|=0x9c;
//引脚功能设为TXD与RXD
//最后才开总中断
SREG=0x80;
//开中断
//
//未收到主机命令禁止MAX485输出
发送数据函数
给主机发数据
//while(!
//Delay(100)可发s
//发送后立即转为接收
接收地址
//接收地址
if(temp==0x02)
//sendtata=Read_ADC();
DDRB|=0x01;
PORTB|=0X01;
//LED
SEND(sendtata);
//发送数据
//PORTBOUT
AD_Init();
LDelay(100);
sendtata=Read_ADC();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RS485 通信 程序 终结 AVR