通信系统设计.doc_第1页
通信系统设计.doc_第2页
通信系统设计.doc_第3页
通信系统设计.doc_第4页
通信系统设计.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附录:校园网布线图基于单片机的多机通信系统设计 张胜杰 31202064 通信1202 【摘要】 随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。单片机在实时数据采集和数据处理方面,有着成本低、能满足一般要求、开发周期短等优点,其在智能家居、计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。单片机又以其极高的性价比越来越多的在智能式仪表和工业过程控制中也得到广泛的应用。但由于其本身资源有限,在一些复杂过程或功能较多的控制中就难以满足要求,需要将单片机的数据送到上一级的微机进行处理。因此实现上位机(PC机)与下位机(单片机)之间的数据可靠通信是必须解决的主要问题之一。本系统能够实现单片机之间的串口通信及无线通信。在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正是为了满足这一要求而设置的。 1、系统总体方案设计 系统的组成图 1.1 单片机STC12C5A60S2/AD/PWM 系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12 倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S,即25万次/秒),针对电机控制,强干扰场合。1) 增强型 8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512) 工作电压:STC12C5A60S2 系列工作电压: 5.5V - 3.5V(5V单片机)STC12LE5A60S2 系列工作电压: 3.6V - 2.2V(3V单片机)3) 工作频率范围:035MHz,相当于普通8051的 0420MHz4) 有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)5) 内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)6) 外部掉电检测电路: 在P4.6口有一个低压门槛比较器5V单片机为1.33V,误差为5%,3.3V 单片机为1.31V,误差为3%7) 时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为5% 到10% 以内)用户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体/ 时钟常温下内部R/C振荡器频率为:5.0V 单片机为: 11 MHz 17MHz3.3V 单片机为: 8MHz 12MHz精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准8) 共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器9) 3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟10) 外部中断I/O7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2), CCP1/P1.4(也可通过寄存器设置到P4.3)11) PWM(2路)/ PCA(可编程计数器阵列,2路)- 也可用来当2路D/A使用- 也可用来再实现2个定时器- 也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)12) A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)13) 通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口14) STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)15) 工作温度范围:-40 +85(工业级) / 0 75(商业级)16) 封装:LQFP-48, LQFP-44, PDIP-40, PLCC-44, QFN-40I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。STC12C5A60S2系列单片机具有2个采用UART(Universal Asychronous Receiver/Transmitter)工作方式的全双工串行通信接口(串口1和串口2)。每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。串行口1的两个缓冲器共用的地址码是99H;串行口2的两个缓冲器共用的地址码是9BH。串行口1的两个缓冲器统称串行通信特殊功能寄存器SBUF;串行口2的两个缓冲器统称串行通信特殊功能寄存器S2BUFSTC12C5A60S2系列单片机的两个串行口都有4种工作方式,其中两种方式的波特率是变的,另两种是固定的,以供不同应用场合选用。用户可用软件设置不同的波特率和选择不同的工作方式。 STC12C5A60S2单片机引脚图1.2 LCD16021602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形. 1602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 引脚图3、2.4G:(1) 2.4Ghz 全球开放ISM 频段免许可证使用(2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合(3) 126 频道,满足多点通信和跳频通信需要(4) 内置硬件CRC 检错和点对多点通信地址控制(5) 低功耗1.9 - 3.6V 工作,待机模式下状态为22uA;掉电模式下为900nA(6) 内置2.4Ghz 天线,体积小巧15mm X29mm(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便(8) 内置专门稳压电路,使用各种电源包括DC/DC 开关电源均有很好通信效果(9) 2.54MM间距接口,DIP封装(10)工作于Enhanced ShockBurst 具有Automatic packethandling, Auto packet transaction handling,具有可选的内置包应答机制,极大的降低丢包率。(11)与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。(12)其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块! 如果是3.3V的,可以直接和RF24l01模块的IO口线连接。比如AVR系列单片机;如果是5V 的,一般串接2K 的电阻引脚定义图1.3 串口通信 串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。 1.4 5V转3.3V用电阻分压的方式使5V转为3.3V3 硬件设计 4 软件设计源代码中,对应代码要改成sbitCE =P11; /双路电流检测板sbitCS=P14; sbitIRQ=P32;sbit MOSI =P15; /双路电流检测板sbit MISO =P16;sbit SCK=P17;sbit LCD1602_RS=P23; /双路电流检测板sbit LCD1602_RW=P22;sbit LCD1602_EN=P21;附录A 系统原理图B 系统实物图C 源代码HELLOWOLD #include Timertimer.h#include LCD1602lcd1602.h BYTE code str0=-Hello World!-;BYTE code str1=-Hello LCD1602-;BYTE code str2=-Welcome to 51 MCU WORLD!-;void main(void)/InitSerial();TimerInit();LCD1602_init();EA=1;while(1)LCD1602_string(0,0,str0);LCD1602_string(0,1,str1);Delay100ms(10);LCD1602_string(0,0,str2);Delay100ms(10);文件名称:timer.c* 功能描述:timer0设置为自动重装工作模式,每100us产生一次中断,复用为多个定时器* 开发环境:IDE为Keil uVision2 v7.20。MCU为STC89C516RD+,晶振频率24M* 程序作者:张懿* 文件版本:v0.9* 创建时间:2008/11/1 * 修改记录:无*/#define _TIMER_C_#include .Timertimer.hstatic data BYTE gBa_TmrBufMAX_TMR; / Timer arraystatic data BYTE gB_Count1ms; / 1ms counterstatic data BYTE gB_Count10ms; / 10ms counterstatic data BYTE gB_Count;/* 函数名称:TimerInit* 功能描述:复用定时器初始化操作,注意全局中断(EA)在函数中并未打开,使用中在合* 适的地方需要添加EA=1语句* 输入参数:无* 输出参数:无*/void TimerInit(void) BYTE B_Index; for (B_Index=0; B_IndexMAX_TMR; B_Index+) gBa_TmrBufB_Index = 0xFF; / Initialize timer values gB_Count=0; gB_Count1ms=0; gB_Count10ms=0; /Init the timer value,using timer0 ET0 = 0; / Timer 0 Interrupt disabled TH0 = 56; /24M,timeout=100us TMOD= TMOD&0xF0; TMOD= TMOD|0x02; / Gate1 = 0, C/T1 = 0, Mode1 = 2 TR0 = 1; / Enable Timer 0 PT0 = 0; / Timer 0 Interrupt ET0 = 1; / Timer 0 Interrupt Enabled /EA = 1; /* 函数名称:timer0* 功能描述:定时器0中断函数* 输入参数:无* 输出参数:无*/void timer0(void) interrupt 1 using 3 BYTE i; gB_Count+; if(gB_Count=10) gB_Count=0; gB_Count1ms+; for(i=0;i0&gBa_TmrBufi!=0xFF) gBa_TmrBufi-; if(gB_Count1ms=11) gB_Count1ms=1; gB_Count10ms+; for(i=NUM_1ms_TMR;i0&gBa_TmrBufi!=0xFF) gBa_TmrBufi-; if(gB_Count10ms=12) gB_Count10ms=2; for(i=NUM_1ms_TMR+NUM_10ms_TMR;i0&gBa_TmrBufi!=0xFF) gBa_TmrBufi-; /* 函数名称:TimerStart* 功能描述:启动指定的复用定时器* 输入参数:B_Timer=复用的定时器号,例如USER_1ms_TMR等,DELAY_xms_TMR为系统使用,* 不能作为输入参数* B_value=定时的时间,范围0255(指定255时实际定时为254),* 延时时间=B_value*定时器的延时时间,例如使用USER_1ms_TMR时,* 延时时间=B_value*1ms* 输出参数:无*/void TimerStart(BYTE B_Timer, BYTE B_value) / Error checking if (B_Timer = MAX_TMR) / Within buffer size return; / No, exit if (B_value = 0xFF) / Over limit B_value-; / Take the max / Reload timer value into buffer DISABLETIMER; / Disable timer 1 interrupt gBa_TmrBufB_Timer = B_value;/ Load value into timer ENABLETIMER; / Enable timer 1 interrupt/* 函数名称:TimerStop* 功能描述:停止指定的复用定时器* 输入参数:复用的定时器号,例如USER_1ms_TMR等,DELAY_xms_TMR为系统使用,不能作为输入参数* 输出参数:无*/void TimerStop(BYTE B_Timer) / Error checking if (B_Timer = MAX_TMR) / Within buffer size return; / No, exit / Set timer value into buffer to indicate STOP DISABLETIMER; / Disable timer 1 interrupt gBa_TmrBufB_Timer = 0xFF; / Load value into timer ENABLETIMER; / Enable timer 1 interrupt/* 函数名称:TimerCheck* 功能描述:检查指定的复用定时器时间有没有到* 输入参数:复用的定时器号,例如USER_1ms_TMR等,DELAY_xms_TMR为系统使用,不能作* 为输入参数* 输出参数:TIMER_TMO=定时到,TIMER_OK=定时未到*/BYTE TimerCheck(BYTE B_Timer) / Error checking if (B_Timer = MAX_TMR) / Within buffer size return (TIMER_OK); / No, exit / Set timer value into buffer to indicate STOP DISABLETIMER; / Disable timer 1 interrupt if (gBa_TmrBufB_Timer = 0) / Timer expired ? / Yes gBa_TmrBufB_Timer = 0xFF; / Auto clear the flag ENABLETIMER; / Enable timer 1 interrupt return (TIMER_TMO); / Timer expired else ENABLETIMER; / Enable timer 1 interrupt return (TIMER_OK); / Timer running or aborted /* 函数名称:Delay1ms* 功能描述:延时1ms的整数倍* 输入参数:延时的倍数,范围0255,延时的时间=B_Value*1ms* 输出参数:无*/void Delay1ms(BYTE B_Value) TimerStart(DELAY_1ms_TMR, B_Value); / Start timer while (TimerCheck(DELAY_1ms_TMR)=TIMER_OK); / Wait till it expired/* 函数名称:Delay10ms* 功能描述:延时10ms的整数倍* 输入参数:延时的倍数,范围0255,延时的时间=B_Value*10ms* 输出参数:无*/void Delay10ms(BYTE B_Value) TimerStart(DELAY_10ms_TMR, B_Value); / Start timer while (TimerCheck(DELAY_10ms_TMR)=TIMER_OK); / Wait till it expired/* 函数名称:Delay100ms* 功能描述:延时100ms的整数倍* 输入参数:延时的倍数,范围0255,延时的时间=B_Value*100ms* 输出参数:无*/void Delay100ms(BYTE B_Value) TimerStart(DELAY_100ms_TMR, B_Value); / Start timer while (TimerCheck(DELAY_100ms_TMR)=TIMER_OK); / Wait till it expired#define _LCD1602_C_#include .LCD1602lcd1602.hstatic void Delay_us(WORD us)WORD i;for(i=0;ius;i+)_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); /24M 单周期,us=10static void Delay()Delay_us(10);/*/ 初始化设置/*/void LCD1602_init(void) LCD1602_IO=0xFF;Delay();LCD1602_IO=0;Delay();LCD1602_command(0x38,0); /三次显示模式设置,不检测忙信号,8位数据,2行显示,5x7点阵 Delay(); LCD1602_command(0x38,0); Delay(); LCD1602_command(0x38,0); Delay(); LCD1602_command(0x38,1); /8bit数据传送,2行显示,5*7字型,检测忙信号 LCD1602_command(0x08,1); /关闭显示,检测忙信号 LCD1602_command(0x01,1); /清屏,检测忙信号 LCD1602_command(0x06,1); /显示光标右移设置,检测忙信号 LCD1602_command(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号/*/ 等待LCD忙状态结束/*/ void LCD1602_wait(void) LCD1602_IO=0xFF;LCD1602_EN=1; LCD1602_RS=0; LCD1602_RW=1; Delay(); while(LCD1602_IO&0x80) LCD1602_EN=0;Delay(); LCD1602_EN=1; Delay(); LCD1602_EN=0; /*/ 写LCD控制命令/*/void LCD1602_command(BYTE command,BYTE BusyC)if(BusyC)LCD1602_wait();LCD1602_IO=command; LCD1602_RS=0; / 选中指令寄存器 LCD1602_RW=0; / 写模式 LCD1602_EN=1;Delay(); LCD1602_EN=0;/*/ 写LCD数据/*/ void LCD1602_data(BYTE dat)LCD1602_wait( ); /检测忙信号LCD1602_IO=dat; LCD1602_RS=1; / 选中数据寄存器 LCD1602_RW=0; / 写模式 LCD1602_EN=1;Delay(); LCD1602_EN=0;/*/ 指令位置(列、行)显示一个字符/*/ void LCD1602_char(BYTE X,BYTE Y,BYTE c)Y&=0x01; X&=0x0F; if(Y) X|=0x40; /若y为1(显示第二行),地址码+0X40 X|=0x80; /指令码为地址码+0X80 LCD1602_command(X,1); LCD1602_data(c);/*/ 指令位置(列、行)显示一个字符串/*/ void LCD1602_string(BYTE X,BYTE Y,BYTE *s) Y&=0x01; X&=0x0F; while(*s) LCD1602_char(X,Y,*s); s+; X+; if(X=16) Y=(Y+1)&0x01; X&=0x0F; 无线模块调试/* 文件名称:main_LCD1602.c* 功能描述:实现对LCD1602的控制及字符串的显示* 开发环境:IDE为Keil uVision2 v7.20。MCU为STC89C516RD+,晶振频率24M* 程序作者:张懿* 文件版本:v0.9* 创建时间:2008/11/1 * 修改记录:无*/#include Timertimer.h#include LCD1602lcd1602.h#include NRF24L01NRF24L01.h#include SPIspi.h#include KBDkbd.h BYTE TxBuf2;BYTE Status;BYTE Config;void main(void)CE=0;/CE置0,射频电路停止工作CS=1;/CSN置1,禁止指令操作SCK=0;/SCK置0,禁止读写寄存器IRQ=1;/IRQ置1,中断复位,等待产生中断信号Status=0;Config=0;/InitSerial();/TimerInit();LCD1602_init();EA=1;LCD1602_string(0,0,Status:);LCD1602_string(0,1,Config:);Status=NRF24L01_ReadByte(0x07);/读取STATUS寄存器并显示LCD1602_DispDigit2(7,0,Status);Config=NRF24L01_ReadByte(0x00);/读取CONFIG寄存器并显示LCD1602_DispDigit2(7,1,Config);while(1);#define _LCD1602_C_#include .LCD1602lcd1602.hstatic void Delay_us(WORD us)WORD i;for(i=0;ius;i+)_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); /24M 单周期,us=10static void Delay()Delay_us(10);/*/ 初始化设置/*/void LCD1602_init(void) LCD1602_IO=0xFF;Delay();LCD1602_IO=0;Delay();LCD1602_command(0x38,0); /三次显示模式设置,不检测忙信号,8位数据,2行显示,5x7点阵 Delay(); LCD1602_command(0x38,0); Delay(); LCD1602_command(0x38,0); Delay(); LCD1602_command(0x38,1); /8bit数据传送,2行显示,5*7字型,检测忙信号 LCD1602_command(0x08,1); /关闭显示,检测忙信号 LCD1602_command(0x01,1); /清屏,检测忙信号 LCD1602_command(0x06,1); /显示光标右移设置,检测忙信号 LCD1602_command(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号/*/ 等待LCD忙状态结束/*/ void LCD1602_wait(void) LCD1602_IO=0xFF;LCD1602_EN=1; LCD1602_RS=0; LCD1602_RW=1; Delay(); while(LCD1602_IO&0x80) LCD1602_EN=0;Delay(); LCD1602_EN=1; Delay(); LCD1602_EN=0; /*/ 写LCD控制命令/*/void LCD1602_command(BYTE command,BYTE BusyC)if(BusyC)LCD1602_wait();LCD1602_IO=command; LCD1602_RS=0; / 选中指令寄存器 LCD1602_RW=0; / 写模式 LCD1602_EN=1;Delay(); LCD1602_EN=0;/*/ 写LCD数据/*/ void LCD1602_data(BYTE dat)LCD1602_wait( ); /检测忙信号LCD1602_IO=dat; LCD1602_RS=1; / 选中数据寄存器 LCD1602_RW=0; / 写模式 LCD1602_EN=1;Delay(); LCD1602_EN=0;/*/ 指令位置(列、行)显示一个字符/*/ void LC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论