《2022年通信系统设计 .pdf》由会员分享,可在线阅读,更多相关《2022年通信系统设计 .pdf(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、附录:校园网布线图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 26 页 - - - - - - - - - 基于单片机的多机通信系统设计张胜杰 31202064 通信 1202 【摘要】随着单片机技术的不断发展, 单片机的应用已经从单机向多机互联化方向发展。单片机在实时数据采集和数据处理方面,有着成本低、能满足一般要求、开发周期短等优点, 其在智能家居、 计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。 单片机又以其极高的性价比越来越多的在智能式仪表和
2、工业过程控制中也得到广泛的应用。但由于其本身资源有限, 在一些复杂过程或功能较多的控制中就难以满足要求,需要将单片机的数据送到上一级的微机进行处理。因此实现上位机(PC 机) 与下位机 ( 单片机 )之间的数据可靠通信是必须解决的主要问题之一。 本系统能够实现单片机之间的串口通信及无线通信。在多机通信系统中, 要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51 单片机串行口控制寄存器SCON 中的控制位 SM2正是为了满足这一要求而设置的。1、系统总体方案设计系统的组成图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
3、- 名师精心整理 - - - - - - - 第 2 页,共 26 页 - - - - - - - - - 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,单时钟 / 机器周期,指令代码完全兼容传统8051 2)工作电压
4、:STC12C5A60S2 系列工作电压: 5.5V - 3.5V(5V单片机)STC12LE5A60S2 系列工作电压: 3.6V - 2.2V(3V单片机)3)工作频率范围: 035MHz ,相当于普通 8051的 0 420MHz 4)有 EEPROM功能(STC12C5A62S2/AD/PWM无内部 EEPROM) 5)内部集成 MAX810 专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)6)外部掉电检测电路 : 在 P4.6 口有一个低压门槛比较器5V单片机为 1.33V,误差为 5%,3.3V 单片机为 1.31V,误差为 3% 7)时钟源:外部高精度晶体 / 时钟
5、,内部 R/C振荡器 ( 温漂为 5% 到10% 以内) 用户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体 / 时钟常温下内部 R/C振荡器频率为: 5.0V 单片机为: 11 MHz 17MHz 3.3V 单片机为: 8MHz 12MHz 精度要求不高时, 可选择使用内部时钟, 但因为有制造误差和温漂, 以实际测试为准8)共 4 个 16位定时器两个与传统 8051兼容的定时器 / 计数器 ,16 位定时器 T0和 T1, 没有定时器 2,但有独立波特率发生器做串行通讯的波特率发生器, 再加上 2 路 PCA模块可再实现 2 个 16 位定时器9)3 个时钟输出口,可由T0
6、的溢出在 P3.4/T0 输出时钟,可由T1 的溢出在P3.5/T1 输出时钟 , 独立波特率发生器可以在P1.0 口输出时钟名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 26 页 - - - - - - - - - 10) 外部中断 I/O7 路, 传统的下降沿中断或低电平触发中断, 并新增支持上升沿中 断 的PCA 模 块 , Power Down 模 式 可 由 外 部 中 断 唤 醒 ,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5,
7、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) STC12C5A60
8、S2 系列有双串口, 后缀有 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(U
9、niversal Asychronous Receiver/Transmitter) 工作方式的全双工串行通信接口( 串口 1 和串口 2)。每个串行口由 2 个数据缓冲器、一个移位寄存器、 一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2 个互相独立的接收、 发送缓冲器构成, 可以同时发送和接收数据。发送缓冲器只能写入而不能读出, 接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。串行口1 的两个缓冲器共用的地址码是99H ;串行口 2 的两个缓冲器共用的地址码是9BH 。串行口 1 的两个缓冲器统称串行通信特殊功能寄存器SBUF ;串行口 2 的两个缓冲
10、器统称串行通信特殊功能寄存器 S2BUFSTC12C5A60S2系列单片机的两个串行口都有4 种工作方式,其中两种方式的波特率是变的, 另两种是固定的, 以供不同应用场合选用。 用户可用软件设置不同的波特率和选择不同的工作方式。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 26 页 - - - - - - - - - STC12C5A60S2 单片机引脚图1.2 LCD1602 1602液晶也叫 1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块
11、。它由若干个5X7或者 5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符, 每位之间有一个点距的间隔, 每行之间也有间隔, 起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形. 1602采用标准的 16 脚接口,其中:第 1 脚:VSS为电源地第 2 脚:VCC 接 5V电源正极第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第 4 脚:RS为寄存器选择,高电平1 时选择数据寄存器、低电平0 时选择指令寄存器。名师资料总结 - - -精品资料欢迎下载 - -
12、 - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 26 页 - - - - - - - - - 第 5 脚:RW 为读写信号线,高电平 (1) 时进行读操作,低电平 (0) 时进行写操作。第 6 脚:E(或 EN)端为使能 (enable) 端, 高电平( 1)时读取信息,负跳变时执行指令。第 714 脚:D0D7为 8 位双向数据端。第 1516 脚:空脚或背灯电源。 15 脚背光正极, 16 脚背光负极。引脚图3、2.4G:(1) 2.4Ghz 全球开放 ISM 频段免许可证使用(2) 最高工作速率 2Mbps ,高
13、效 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 Shock
14、Burst 具 有Automatic packethandling, Auto packet transaction handling, 具有可选的内置包应答机制, 极大的降低丢包率。(11) 与 51 系列单片机 P0口连接时候,需要加10K的上拉电阻 , 与其余口连接不需要。(12) 其他系列的单片机,如果是 5V的, 请参考该系列单片机IO 口输出电流大小,如果超过 10mA ,需要串联电阻分压,否则容易烧毁模块! 如果是 3.3V 的,可以名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
15、- - 第 6 页,共 26 页 - - - - - - - - - 直接和 RF24l01 模块的 IO 口线连接。比如AVR系列单片机;如果是5V 的,一般串接 2K 的电阻引脚定义图1.3 串口通信串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少, 在远距离通信中可以节约通信成本, 但其传输速度比并行传输低。最重要的参数是波特率、 数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。1.4 5V转 3.3V 用电阻分压的方式使5V转为 3.3V 名师资料总结 - - -精品资料欢迎下载 - - - -
16、- - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 26 页 - - - - - - - - - 3 硬件设计4 软件设计源代码中,对应代码要改成sbit CE =P11; /双路电流检测板sbit CS =P14; sbit IRQ =P32; sbit MOSI =P15; /双路电流检测板sbit MISO =P16; sbit SCK=P17; sbit LCD1602_RS=P23; /双路电流检测板sbit LCD1602_RW=P22; sbit LCD1602_EN=P21; 名师资料总结 - - -精品资料欢迎下载
17、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 26 页 - - - - - - - - - 附录A 系统原理图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 26 页 - - - - - - - - - B 系统实物图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共
18、 26 页 - - - - - - - - - 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); LCD16
19、02_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_ 名师资料总结 - - -精品
20、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 26 页 - - - - - - - - - #include .Timertimer.h static data BYTE gBa_TmrBufMAX_TMR; / Timer array static data BYTE gB_Count1ms; / 1ms counter static data BYTE gB_Count10ms; / 10ms counter static data BYTE gB_Count; /* * * 函数名称: T
21、imerInit * * 功能描述:复用定时器初始化操作,注意全局中断(EA )在函数中并未打开,使用中在合* 适的地方需要添加EA=1语句* * 输入参数:无* * 输出参数:无* */ void TimerInit(void) BYTE B_Index; for (B_Index=0; B_IndexMAX_TMR; B_Index+) gBa_TmrBufB_Index = 0 xFF; / Initialize timer values gB_Count=0; gB_Count1ms=0; gB_Count10ms=0; /Init the timer value,using time
22、r0 ET0 = 0; / Timer 0 Interrupt disabled TH0 = 56; /24M,timeout=100us TMOD= TMOD&0 xF0; TMOD= TMOD|0 x02; / 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
23、 - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 26 页 - - - - - - - - - * * 功能描述:定时器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!=0 xFF) gBa_TmrBufi-; if(gB_Count1ms=11) gB_Count1ms=1; gB_Count1
24、0ms+; for(i=NUM_1ms_TMR;i0&gBa_TmrBufi!=0 xFF) gBa_TmrBufi-; if(gB_Count10ms=12) gB_Count10ms=2; for(i=NUM_1ms_TMR+NUM_10ms_TMR;i0&gBa_TmrBufi!=0 xFF) gBa_TmrBufi-; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 26 页 - - - - - - - - - /* * * 函数名称: TimerStart *
25、 * 功能描述:启动指定的复用定时器* * 输入参数: 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) / Wit
26、hin buffer size return; / No, exit if (B_value = 0 xFF) / 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 * * 功能描述:停止指定的复用
27、定时器* * 输入参数:复用的定时器号,例如USER_1ms_TMR等, DELAY_xms_TMR 为系统使用,不能作为输入参数* 输出参数:无* */ void TimerStop(BYTE B_Timer) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 26 页 - - - - - - - - - / Error checking if (B_Timer = MAX_TMR) / Within buffer size return; / No, exit / S
28、et timer value into buffer to indicate STOP DISABLETIMER; / Disable timer 1 interrupt gBa_TmrBufB_Timer = 0 xFF; / Load value into timer ENABLETIMER; / Enable timer 1 interrupt /* * * 函数名称: TimerCheck * * 功能描述:检查指定的复用定时器时间有没有到* * 输入参数:复用的定时器号,例如USER_1ms_TMR等, DELAY_xms_TMR 为系统使用,不能作* 为输入参数* * 输出参数:
29、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_T
30、mrBufB_Timer = 0 xFF; / 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 26
31、 页 - - - - - - - - - /* * * 函数名称: 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
32、的整数倍* * 输入参数:延时的倍数,范围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 名师资料
33、总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 26 页 - - - - - - - - - * * 输出参数:无* */ 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
34、 .LCD1602lcd1602.h static 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=10 static void Delay() Delay_us(10
35、); /*/ / 初始化设置/*/ void LCD1602_init(void) LCD1602_IO=0 xFF; Delay(); LCD1602_IO=0; Delay(); LCD1602_command(0 x38,0); /三次显示模式设置,不检测忙信号 ,8 位数据, 2 行显示, 5x7 点阵 Delay(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 26 页 - - - - - - - - - LCD1602_command(0 x38,0)
36、; Delay(); LCD1602_command(0 x38,0); Delay(); LCD1602_command(0 x38,1); /8bit数据传送, 2 行显示, 5*7 字型,检测忙信号 LCD1602_command(0 x08,1); /关闭显示,检测忙信号 LCD1602_command(0 x01,1); /清屏,检测忙信号 LCD1602_command(0 x06,1); /显示光标右移设置,检测忙信号 LCD1602_command(0 x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号 /*/ / 等待 LCD忙状态结束/*/ void LCD160
37、2_wait(void) LCD1602_IO=0 xFF; LCD1602_EN=1; LCD1602_RS=0; LCD1602_RW=1; Delay(); while(LCD1602_IO&0 x80) 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; / 选中指令寄存器
38、 LCD1602_RW=0; / 写模式 LCD1602_EN=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 26 页 - - - - - - - - - Delay(); LCD1602_EN=0; /*/ / 写 LCD数据/*/ void LCD1602_data(BYTE dat) LCD1602_wait( ); /检测忙信号LCD1602_IO=dat; LCD1602_RS=1; / 选中数据寄存器 LCD1602_RW=0; / 写模式 LCD1
39、602_EN=1; Delay(); LCD1602_EN=0; /*/ / 指令位置(列、行)显示一个字符/*/ void LCD1602_char(BYTE X,BYTE Y,BYTE c) Y&=0 x01; X&=0 x0F; if(Y) X|=0 x40; / 若 y 为 1(显示第二行),地址码+0X40 X|=0 x80; /指令码为地址码+0X80 LCD1602_command(X,1); LCD1602_data(c); /*/ / 指令位置(列、行)显示一个字符串/*/ void LCD1602_string(BYTE X,BYTE Y,BYTE *s) Y&=0 x01
40、; X&=0 x0F; while(*s) LCD1602_char(X,Y,*s); s+; X+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 26 页 - - - - - - - - - if(X=16) Y=(Y+1)&0 x01; X&=0 x0F; 无线模块调试/* * * 文件名称: main_LCD1602.c * * 功能描述:实现对LCD1602的控制及字符串的显示* * 开发环境: IDE 为 Keil uVision2 v7.20。MCU 为
41、 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;
42、 /SCK 置 0,禁止读写寄存器IRQ=1; /IRQ 置 1,中断复位,等待产生中断信号Status=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 26 页 - - - - - - - - - Config=0; / InitSerial(); / TimerInit(); LCD1602_init(); EA=1; LCD1602_string(0,0,Status:); LCD1602_string(0,1,Config:); Status=NRF24L
43、01_ReadByte(0 x07);/读取 STATUS 寄存器并显示LCD1602_DispDigit2(7,0,Status); Config=NRF24L01_ReadByte(0 x00);/读取 CONFIG寄存器并显示LCD1602_DispDigit2(7,1,Config); while(1); #define _LCD1602_C_ #include .LCD1602lcd1602.h static void Delay_us(WORD us) WORD i; for(i=0;ius;i+) _nop_(); _nop_(); _nop_(); _nop_(); _nop_
44、(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /24M 单周期, us=10 static void Delay() Delay_us(10); /*/ / 初始化设置名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 26 页 - - - -
45、- - - - - /*/ void LCD1602_init(void) LCD1602_IO=0 xFF; Delay(); LCD1602_IO=0; Delay(); LCD1602_command(0 x38,0); /三次显示模式设置,不检测忙信号 ,8 位数据, 2 行显示, 5x7 点阵 Delay(); LCD1602_command(0 x38,0); Delay(); LCD1602_command(0 x38,0); Delay(); LCD1602_command(0 x38,1); /8bit数据传送, 2 行显示, 5*7 字型,检测忙信号 LCD1602_com
46、mand(0 x08,1); /关闭显示,检测忙信号 LCD1602_command(0 x01,1); /清屏,检测忙信号 LCD1602_command(0 x06,1); /显示光标右移设置,检测忙信号 LCD1602_command(0 x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号 /*/ / 等待 LCD忙状态结束/*/ void LCD1602_wait(void) LCD1602_IO=0 xFF; LCD1602_EN=1; LCD1602_RS=0; LCD1602_RW=1; Delay(); while(LCD1602_IO&0 x80) LCD1602_
47、EN=0; Delay(); LCD1602_EN=1; Delay(); LCD1602_EN=0; /*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 26 页 - - - - - - - - - / 写 LCD控制命令/*/ void LCD1602_command(BYTE command,BYTE BusyC) if(BusyC) LCD1602_wait(); LCD1602_IO=command; LCD1602_RS=0; / 选中指令寄存器 LCD
48、1602_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&=0 x01; X&=0 x
49、0F; if(Y) X|=0 x40; / 若 y 为 1(显示第二行),地址码+0X40 X|=0 x80; /指令码为地址码+0X80 LCD1602_command(X,1); LCD1602_data(c); /*/ / 指令位置(列、行)显示四位数字名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 26 页 - - - - - - - - - /*/ void LCD1602_DispDigit4 (BYTE X,BYTE Y,WORD DData) BYTE
50、tmp; tmp = DData / 1000; LCD1602_char(X+, Y, tmp + 0 x30); DData %= 1000; tmp = DData / 100; LCD1602_char(X+, Y, tmp + 0 x30); DData %= 100; tmp = DData / 10; LCD1602_char(X+, Y, tmp + 0 x30); DData %= 10; tmp = DData; LCD1602_char(X+, Y, tmp + 0 x30); /*/ / 指令位置(列、行)显示两位数字/*/ void LCD1602_DispDigit