?? shiyan5.c
字號:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <inttypes.h>
#include <pgmspace.h>
char global_uart1_data=0;
char command_send[17]=":0E0300050001A2\r\n";
char data_receive[20];
int ii=0;
// ":" 地址 命令 寄存器地址 寄存器數(shù)量 校驗 回車 換行
//******************************延時子程序*****************************************
void delay_us(uint16_t u) //延時2us左右,delay(240)=100us;
{
while(u)
{
u--;
}
}
// 延時nms
void delay_ms(uint16_t m)
{
uint16_t i;
for(i=0;i<m;i++)
{
delay_us(2400); //延時1ms
}
}
//延時ns
void delay_s(uint16_t n)
{
uint16_t j;
for(j=0;j<n;j++)
{
delay_ms(1000); //延時1s
}
}
void usart1_init(void)
{
UBRR1H=0x00;
UBRR1L=0x19;//設(shè)置波特率為2400bit/s,當晶振頻率為7.3728M時
UCSR1A=0X00;
UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);//接收允許,發(fā)送允許,接收中斷使能
UCSR1C=(1<<UPM11)|(0<<UPM10)|(1<<UCSZ11);//異步傳輸,7個數(shù)據(jù)位,1個停止位,偶校驗(根據(jù)MODBUS ASCII協(xié)議)
sbi(DDRD,PD4);//CS485為輸出,控制max485的發(fā)送和接收
cbi(PORTD,PD4);//max485接收使能
}
void sendchar(char data)//發(fā)送
{
sbi(PORTD,PD4);//控制max485的發(fā)送
if(!(UCSR1A&(1<<UDRE1)))//等待UDRE被置位,否則對數(shù)據(jù)寄存器UDR的寫操作將被忽略
{
UCSR1A|=(1<<UDRE1);
}
while(!(UCSR1A&(1<<UDRE1)))//等待發(fā)送緩沖器空
{;}
UDR1=data;//發(fā)送數(shù)據(jù)
while(!(UCSR1A&(1<<TXC1))){;}
//loop_until_bit_is_set(UCSR1A,TXC1);//查詢發(fā)送是否結(jié)束
UCSR1A=UCSR1A|(1<<TXC1);//因為沒有使用發(fā)送結(jié)束中斷,所以通過置數(shù)將TXC清零
cbi(PORTD,PD4);//改為接收狀態(tài)
return;
}
SIGNAL(SIG_UART1_RECV)//當RXCIE1=1,SREG=0X80,接收結(jié)束時有RXC1也為1
{
cli();
global_uart1_data=UDR1;
data_receive[ii]=global_uart1_data;
ii++;
if(ii>14)
{
ii=0;
}
sei();
}
int lrc_check(char *p,int length)
{
int lrc=0;
int i=0;
for(i=1;i<=length;i++)
lrc=lrc+*(p+i);
lrc=lrc%256;
lrc=0xff-lrc;
lrc++;
return lrc;
}
int main()
{ char *pointer;
int i;
char n;
pointer=command_send;
int lrc_check_value;
sbi(DDRD,PD4);//配置CS485為輸出
cbi(PORTD,PD4);//控制max485為接收
sei();
usart1_init();
delay_ms(5);
lrc_check_value=lrc_check(command_send,12);
for(i=0;i<=16;i++)
{sendchar(*pointer);
n=*pointer;
pointer++;}
while(1)
{;}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -