基于GPRS的单片机程序远程升级方案设计与实现

4星 · 超过85%的资源 需积分: 10 30 下载量 12 浏览量 更新于2024-09-15 2 收藏 287KB PDF 举报
本文主要探讨了如何利用GPRS(通用无线分组业务)技术实现单片机程序的远程升级,特别是在恶劣环境下工作的数据采集终端的维护问题。GPRS因其低成本、广域覆盖和无线传输特性,被选为本设计中数据通信的理想选择。文章的核心焦点是Atmel AVR28单片机和西门子MC37I GPRS模块的应用。 Atmel AVR28系列单片机具有自编程功能,这是其一个关键特性。它允许开发者在不依赖外部设备如ISP编程工具或JTAG仿真器的情况下,直接在单片机上对程序进行更新。传统的程序下载方式是通过串口连接至上位机,但在本文的设计中,这一过程被扩展到了远程通信,通过GPRS模块接入互联网,实现了与远程服务器的通信,客户端能够通过服务器对终端进行远程程序升级。 系统原理部分详细介绍了硬件设计和软件流程。首先,程序编译后生成的十六进制文件需要下载到单片机的Flash存储器中。在这个设计中,使用AVR单片机的Boot区引导程序作为自编程的入口,将通过GPRS模块接收的十六进制文件从串口传输到单片机,并通过引导程序写入到应用区的Flash中。这种方法大大简化了升级过程,减少了现场维护的复杂性和难度。 通过实际验证,该方案有效且稳定,使得数据采集终端在面对恶劣环境时,能够便捷地进行远程升级和维护,提高了系统的可靠性和实用性。本文的关键词包括远程升级、GPRS、数据采集终端、Atmel AVR28和MC37I GPRS模块,突出了研究的重点和实际应用价值。 本文提供了一种创新的方法,解决了单片机数据采集终端远程升级的难题,为嵌入式系统的远程维护和升级提供了新的解决方案,具有重要的工程实践意义。
2012-05-06 上传
部分源程序如下: #define TARGET_GLOBAL 1 #include "target.h" /***************************************************************************************** *函数名称:usart0_Initial(void) *函数功能:初始化串口 *入口函数:无 *出口函数:无 *****************************************************************************************/ void usart0_Initial(void) { /************TH1=256-(K*oscFreq)/384*BaudRate************/ SCON=0x50; //SM0=0;SM1=1;REN=1; TI=0; //数据发送状态清零 RI=0; //数据接收状态清零 PCON=0; //不加倍 TH1=0xF3; //bode=2400 TL1=0XF3; TMOD=0X20; //TIMER1 MODER2; ET1=0; //屏蔽timer1溢出中断 TR1=1; //启动timer1 ES=0; //屏蔽串口中断 } /***************************************************************************************** *函数名称:send_char(uchar txd) *函数功能:串口发送一个字符 *入口函数:要发送的一个字符txd *出口函数:无 *****************************************************************************************/ void send_char(uchar txd) { TI=0; SBUF=txd; while(!TI); // 等特数据传送 TI=0; // 清除数据传送标志 } /***************************************************************************************** *函数名称:send_str(uchar *str,uchar len) *函数功能:串口发送一行字符串 *函数入口:字符串指针*str,字符串长度len *函数出口:无 *****************************************************************************************/ void send_str(uchar *str,uchar len) { uchar i; for(i=0;i<len;i++) send_char(str[i]); } /***************************************************************************************** *函数名称:get_char(void) *函数功能:串口接收一个字符 *函数入口:串口发送的字符rxd *函数出口:无 *****************************************************************************************/ uchar get_char(void) { uchar temp; RI=0; while(!RI); // 等特数据传送 temp=SBUF; RI=0; // 清除数据传送标志 return temp; }