ATmega128_串口引用 ATmega128学习(MOdbus串口通信) 引用 ATmega128学习(MOdbus串口通信) ATmega128 2010-09-03 18:25:55 阅读81 评论0 字号:大中小 订阅 引用 轩辕 的 (原)ATmega128学习(MOdbus串口通信) 软件资料包,软件部分原创,部分来源于网络,用于学习交流之用。所有程序均通过硬件测试完好,有好的建议请留言,给修改意见,以后更好 。 //ATmega128 AU USART1,波特率9600,modbus协议,单速,1停止位,CRC校验 //编...
引用 ATmega128学习(MOdbus串口通信) 引用 ATmega128学习(MOdbus串口通信) ATmega128 2010-09-03 18:25:55 阅读81 评论0 字号:大中小 订阅 引用 轩辕 的 (原)ATmega128学习(MOdbus串口通信) 软件资料包,软件部分原创,部分来源于网络,用于学习交流之用。所有程序均通过硬件测试完好,有好的建议请留言,给修改意见,以后更好 。 //ATmega128 AU USART1,波特率9600,modbus
,单速,1停止位,CRC校验 //编译器 :ICC7.22 //晶振:11.0592MHZ,,外部高频石英震荡器,启动时间4.1ms //熔丝:扩展位:0xff, 0x19af,加密位:0xff //作者:张奇 //创建时间:2010.07.16 //编写时间: 2010.7.16 //修改时间:2010-7-21 //*********************************************************************** // 初始化去,参数定义区 //*********************************************************************** #include
#include #include #include #define F_CPU 11059200 // 外部晶振11.0592MHz #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define baud 9600 //波特率 #define baud_setting (uint)((ulong)F_CPU/(16*(ulong)baud)-1) //设置波特率 #define baud_h (uchar)(baud_setting>>8) //设置波特率高位 #define baud_l (uchar)(baud_setting) //设置波特率地位 #define send_485 PORTE|=(1<>1; CRC_word^=0xa001; } else { CRC_word>>=1; } } } return CRC_word; } /******************************************************************************* * 函数名称: USART_Flush( void ) * 函数功能: 刷新通信数据寄存器 * 参数变量: dummy * 全局变量: * 调用函数: * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void USART_Flush( void ) { unsigned char dummy; while ( UCSR1A & (1<10进制处理 ,五位 * 参数变量: A1,A2,A3,A4,A5[uchar],temp(uint) * 全局变量: * 调用函数: * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void data_do(uint temp_d)// { A1=temp_d%10;//? A2=(temp_d/10)%10;// A3=(temp_d/100)%10; A4=(temp_d/1000)%10; A5=temp_d/10000;// } /******************************************************************************* * 函数名称: uart1_rx_isr(void) * 函数功能:中断接收多数据 * 参数变量: * 全局变量:usart_rx_data[rx_count], rx_count++; RX_bit; * 调用函数:USART_Flush() * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ #pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC void uart1_rx_isr(void) { usart_rx_data[rx_count]=UDR1;//接收数据 USART_Flush();//刷新寄存器 rx_count++;//累计接收数据个数 RX_bit=1;//接收中断置位 } /******************************************************************************* * 函数名称: funtion_03() * 函数功能: modbus通信读操作(从机) * 参数变量: * 全局变量: * 调用函数: * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void funtion_03() { ; } /******************************************************************************* * 函数名称: funtion_04() * 函数功能: * 参数变量: * 全局变量: * 调用函数:TX_data_set[i] * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void funtion_04()// { ; } /******************************************************************************* * 函数名称: funtion_06() * 函数功能: modbus通信写操作(从机) * 参数变量: * 全局变量: work_data_do_Tx() * 调用函数:TX_data_set[i] * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void funtion_06()//??? { ;//EEPROM?????? } /******************************************************************************* * 函数名称: funtion_06() * 函数功能:读故障详细参数 * 参数变量: * 全局变量: * 调用函数: * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void funtion_07() { ; } /******************************************************************************* * 函数名称: send_code_fun() * 函数功能: modbus发送读数据命令函数 * 参数变量:uchar addrs,uchar funtion,uint data_addr,uint data_length * 全局变量: * 调用函数: * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void send_code_fun(uchar addrs,uchar funtion,uint data_addr,uint data_length) { char i=0;// data_buf[0]=addrs;//从机地址 data_buf[1]=funtion;//功能码 data_buf[2]=data_addr/256; data_buf[3]=data_addr%256;//数据地址 data_buf[4]=data_length/256;// data_buf[5]=data_length%256;//数据长度 CRC_word=get_crc(6);//CRC_word 计算 data_buf[6]=CRC_word%256;//CRC_word 低位 data_buf[7]=CRC_word/256;//CRC_word 高位 for(i=0;i<6+2;i++) { usart_tx_data[i]=data_buf[i];//数据放入发送缓存器 USART_Transmit(usart_tx_data[i]);//发送数据 } } /******************************************************************************* * 函数名称: receive_main() * 函数功能: 接收主函数 * 参数变量: * 全局变量: * 调用函数: * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void receive_main() { delay_nms(300); CLI(); //全局中断不使能 rx_count=0;//中断计数器清零 send_485;//485处于发送状态 UCSR1B=0x08; //串口初始化 delay_nms(15);//485响应时间 RX_length=data_buf[2]*256+data_buf[3];//取数据长度数据 RX_CRC_word=data_buf[RX_length+1]*256+data_buf[RX_length];//取CRC校验码 CRC_word=get_crc(RX_length);//计算接收数据校验码 if(CRC_word==RX_CRC_word)//校验数据比较 { if(data_buf[0]==address||data_buf[0]==televise_add)//地址比较 { send_code_fun(1,3,0,1);//发送数据 UCSR1B=0x00; //通信不使能 switch(usart_rx_data[1])//接收数据处理 { case 0x03:funtion_03();break;//??? case 0x04:funtion_04();break;// case 0x06:funtion_06();break;//??? case 0x07:funtion_07();break;//??? default: break; } } else ; } else ; receive_485;//485处于接收状态 UCSR1B=0x90; //通信寄存器设置 delay_nms(15);//485响应时间 SEI(); //全局中断使能 } /******************************************************************************* * 函数名称: send_data_do(uint do_length) * 函数功能: 发送数据 * 参数变量: * 全局变量: * 调用函数:get_crc(uchar n) , * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void send_data_do(uint do_length) { // // // // // CRC_word=get_crc(do_length);//CRC_word计算 data_buf[do_length]=CRC_word%256;//CRC_word 低位 data_buf[do_length+1]=CRC_word/256;//CRC_word 高位 } /******************************************************************************* * 函数名称: send_main(uint length) * 函数功能: * 参数变量: * 全局变量: send_data_do(length); * 调用函数:TX_data_set[i] * 作者: 张奇 * 编写时间:10-06-03 * 修改时间: 10—07-20 * 版本:V1.0 *******************************************************************************/ void send_main(uint length) { uint i_tx=0; send_485;//487处于发送状态 UCSR1B=0x08; //串行口处于发送 delay_nms(15);//485响应时间 send_data_do(length);//发送数据处理 for(i_tx=0;i_tx
本文档为【ATmega128_串口】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。