基于51单片机的无线通信
基于 51 单片机的无线数据收发系统设计

基于 51 单片机的无线数据收发系统设计摘要:系统使用 51 单片机通过NRF24L01 模块远程传输数据,接收端通过NRF24L01 模块接收无线数据。
处理后由液晶进行数据显示,可根据需要设置声音提示。
系统接收与发送端模块均单片机、无线发送模块/ 接收、显示、声音提示模块。
关键词:51 单片机;NRF24L01;液晶显示;无线通讯1硬件设计1.1系统组成该系统将数据经过控制器由无线发送模块进行远距离发送,再通过接收端进行无线数据接收。
接收的数据经控制器处理后由液晶显示器显示,并根据需要可以实现一定的声音提示。
1.2无线收发模块本设计使用无线通讯技术实现数据的传送,能够实现此功能的硬件电路模块总类较多。
为符合设计需求,采用以NRF24L01 为核心的无线通讯模块。
该方案可以使系统具有低成本,低功耗,体积小等特点。
NRF24L01 无线模块出至 NORDIC 公司。
其工作频段在 2.4G— 5GHz,该模块正常工作电压为 1.9V—3.6V,内部具有 FSK 调制功能,集成了 NORDIC 公司自创的增强短脉冲协议。
该模块最多可实现 1 对 6 的数据发送与接收。
其每秒最高可传输两兆比特,能够实现地址检验及循环冗余检验。
若使用 SPI 接口,其每秒最高可传输八兆比特,多达 128 个可选工作频道,将该芯片的最小系统集成后,构成NRF24L01 无线通信模块。
1、引脚功能此模块有 6 个数据传输和控制引脚,采用 SPI 传输方式,实现全双工串口通讯,其中 CE脚为芯片模式控制线,工作情况下,CE 端协配合寄存器来决定模块的工作状态。
当4 脚电平为低时,模块开始工作。
数据写入的控制时钟由第 5 脚输入,数据写入与输出分别为 6、7 脚,中断信号放在了第 8 脚。
2、电器特性NRF24L01 采用全球广泛使用的 2.4Ghz 频率,传输速率可达 2Mbps,一次数据传输宽度可达 32 字节,其传输距离空旷地带可达2000M 此模块增强版空旷地带传输距离可达 5000M—6000M, 因内部具有 6 个数据通道,可实现 1 对 6 数据发送,还可实现 6 对 1 数据接收,其工作电压为 1.9V-3.6V,当没有数据传输时可进入低功耗模式运行,微控制器对其控制时可对数据控制引脚输入 5V 电平信号,可实现 GFSK 调制。
基于51单片机的毕业设计

基于51单片机的毕业设计一、选题背景二、设计目标三、硬件设计1.系统框图设计2.电路原理图设计3.电路元器件选择与参数计算四、软件设计1.程序流程设计2.程序模块设计与编写五、测试与调试六、总结与展望一、选题背景毕业设计是大学生在校期间的一项重要任务,是对所学知识的综合运用和实践能力的考验。
本文将以基于51单片机的毕业设计为例,介绍其选题背景、设计目标、硬件设计、软件设计及测试与调试等方面。
51单片机是一种广泛应用于嵌入式系统中的微控制器,其具有性价比高、易于编程等特点,因此被广泛应用于各种嵌入式系统中。
在毕业设计中使用51单片机进行开发,既可以锻炼学生的嵌入式系统开发能力,又可以提高学生对单片机原理和应用的理解。
二、设计目标本次毕业设计旨在开发一款基于51单片机的智能家居控制系统。
该系统能够通过手机APP或者语音识别等方式控制家居设备的开关,实现智能化控制。
具体的设计目标如下:1.设计一款基于51单片机的硬件系统,包括电路原理图、电路元器件选择与参数计算等。
2.设计一款基于51单片机的软件系统,包括程序流程设计、程序模块设计与编写等。
3.实现手机APP或者语音识别等方式控制家居设备的开关。
4.保证系统的可靠性和稳定性,确保系统能够长时间稳定运行。
三、硬件设计1.系统框图设计本次毕业设计中,我们需要开发一款智能家居控制系统。
该系统主要由以下几个部分组成:51单片机、无线通信模块、继电器模块、传感器模块以及电源模块。
其中,51单片机作为整个系统的核心控制器,负责接收外部信号并进行处理;无线通信模块用于实现与手机APP或者语音识别设备之间的通信;继电器模块用于控制家居设备的开关;传感器模块用于采集环境数据,并将数据传输给51单片机;电源模块则提供稳定可靠的供电支持。
2.电路原理图设计根据上述系统框图,我们可以设计出相应的电路原理图。
具体而言,我们需要设计51单片机的电路、无线通信模块的电路、继电器模块的电路、传感器模块的电路以及电源模块的电路。
《单片机应用设计-基于单片机的433M无线通信系统》廖永斌

学号:课程设计题目基于单片机的433M无线通信系统学院专业班级姓名指导教师2018年 1月 13日《单片机应用设计》任务书学生姓名:专业班级:指导教师:工作单位:题目: 基于单片机的433M无线通信系统课程设计目的:1、熟悉单片机应用系统的硬件设计及软件设计的基本方法;2、将《单片机原理与应用》理论课的理论知识应用于实际的应用系统中;3、训练单片机应用技术,锻炼实际动手能力4、提高正确地撰写论文的基本能力。
课程设计内容和要求1、完成硬件电路的设计,其中包括单片机和CC1101模块的设计;2、完成无线通信模块的程序设计与实现,上机运行调试程序,记录实验结果(如图表等),并对实验结果进行分析和总结;3、课程设计报告书按学校统一规范来撰写,报告主要包括以下内容:目录、摘要、关键词、基本原理、方案论证、硬件设计、软件设计(带流程图、程序清单)、仿真结果、实物运行结果照片、结论献等;4、查阅不少于6篇参考文献。
初始条件:1、STC89C52和CC1100H模块;2、先修课程:单片机原理与应用。
时间安排:第19周,安排设计任务,完成硬件设计;第20周,完成软件设计、撰写报告,答辩。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (Ⅰ)Abstract (Ⅱ)1基本原理 (1)1.1无线通信系统 (1)1.2芯片简介 (1)1.2.1单片机STC89C52 (1)1.2.2 无线通信CC1101芯片 (3)2方案论证与设计 (5)2.1无线通信模块选择 (5)2.2 单片机最小系统选择 (5)2.3整体方案设计 (6)3 硬件电路设计 (6)4软件程序设计 (8)4.1发送端编程 (8)4.2接收端编程 (9)4.3程序调试与下载 (10)5硬件仿真 (12)6实物制作与调试 (12)6.1 STC89C52单片机最小系统 (12)6.2无线通信模块CC1101 (13)6.3稳压电路模块 (13)7心得体会 (15)8参考文献 (16)附录 (17)摘要随着通信系统信息容量的不断提高,射频技术在无线通信中占据着举足轻重的位置。
基于51单片机315MHz无线收发模块调试程序

315Mhz 无线通信程序原理:第一块单片机p1.0 口输出脉冲方波提供给无线发射模块,无线发射模块将信号以电磁波的形式传到无线接收模块。
无线接收模块会根据这个电磁波还原出脉冲方波提供给第二块单片机,第二块单片机进行进一步的解算处理。
通信协议:根据这个原理和315模块的特性。
我决定以900us 高电平和2000us 底电平表示1;450us 高电平和2000us 低电平表示0。
而8个1或0组成一个字节。
为了防止误码,所以在每个字节的前面加一个2ms 高电平和2ms 低电平的起始码。
每个5S 发送一个字符,一个字符发送20 遍*******************************//****************************315Mhz 无线通信程序发送程序11.0592M 晶振 1 机器周期=1.0851us定时器产生2MS 定时TH0=0XF8;TL0=0XCD;900us 定时TH0=0XFC;TL0=0XC3;450us 定时TH0=0XFE;TL0=0X61;*******************************/#include<reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned charsbit WXSEND=P1^0;uchar timedata[8]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd,0xea,0x66};// 450us, 900us,2MS,6ms/*************************************11.0592MHZ 下500 毫秒延时,还准***************************************/void delay500ms(uint i)uint j;uchar k;while(i--){for(j=0;j<750;j++)for(k=0;k<200;k++);}}void time0init(){TMOD=0x01;//}void sendset(uchar senddata);// 发送数据程序void sendstartbit();// 数据发送起始信号2ms 高电平和2ms 低电平的起始码void sendlowbit();// 发送低电平void sendhighbit();// 发送高电平void main(){uchar senddata,i;time0init();// 定时器初始化senddata=0x55;while(1) {for(i=0;i<20;i++){sendset(senddata);// 发送数据程序}delay500ms(10);senddata++;}}// 发送数据程序void sendset(uchar senddata){uchar i,sendbit;sendstartbit();// 发送开始信号for(i=0;i<8;i++){sendbit=senddata&0x80;if(sendbit==0)sendlowbit(); // 发送低电平else sendhighbit();// 发送高电平senddata=senddata<<1;}// 数据发送起始信号6ms 高电平和2ms 低电平的起始码void sendstartbit(){WXSEND=1;TH0=timedata[4];TL0=timedata[5];TR0=1;while(TF0==0);TR0=0;TF0=0;TH0=timedata[4];TL0=timedata[5];WXSEND=0;TR0=1;while(TF0==0);TR0=0;TF0=0;}void sendlowbit() // 发送低电平{WXSEND=1;TH0=timedata[0];TL0=timedata[1];TR0=1;while(TF0==0);TR0=0;TF0=0;TH0=timedata[4];TL0=timedata[5];WXSEND=0;TR0=1;while(TF0==0);TR0=0;TF0=0;}void发送高电平sendhighbit()//{WXSEND=1;TH0=timedata[2];TL0=timedata[3];TR0=1;while(TF0==0);TR0=0;TF0=0;TH0=timedata[4];TL0=timedata[5];WXSEND=0;TR0=1;while(TF0==0);TR0=0;TF0=0;}/****************************315Mhz 无线通信程序接收程序11.0592M 晶振 1 机器周期=1.0851us用中断0 边沿触发中断,开启接收程序由于接收模块平时大部分时间是低电平,有信号时是高电平,而中断以,0 是负边沿触发,所硬件电路中接收模块的信号输出端经过非门后接到单片机P3.2接收到数据,用串口传到上位机的串口调试软件显示*******************************/#include<reg52.h>#include "intrins.h" #define uint unsigned int#define uchar unsigned char sbit WXrecep=P3^2;//uchar code timedata[6]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd};// 450us,900us,2MS uchar wxrecepda;void time0init(){TMOD=0x21;// 定时器0TH0=0;TL0=0;//TMOD=0x20;/*TMOD:timer1,mode2,8-bitreload*/TH1=0xFD;/*TH1 11.0592MHz*/TL1=0XFD;EA=1;EX0=1;ET0=1;IE0=0;}void uartinit(){SCON=0x50;/*SCON: 模式1,8-bitUART, 使能接收*/ TR1=1;/*TR1:timer1run*/void receivewx();// 接收子程序void main(){time0init();// 定时器初始化uartinit();while(1) ;}void receivewx()// 接收子程序{uint i;uchar j,recedata;while(WXrecep==0);TR0=0;i=TH0*256+TL0;TH0=0;TL0=0;if((i>=1800)&&(i<=1890)){ recedata=0;for(j=0;j<8;j++){while(WXrecep==1);TR0=1;while(WXrecep==0);TR0=0;i=TH0*256+TL0;if((i>=390)&&(i<=450)) recedata=recedata&0xfe;else if((i>=800)&&(i<=860)) recedata=recedata|0x01;recedata=recedata<<1;TH0=0;TL0=0;}wxrecepda=recedata>>1 ;SBUF=wxrecepda;while(TI==0);TI=0;}}void wxrecint() interrupt 0{TH0=0;TL0=0;TR0=1;EX0=0;receivewx();EX0=1;}。
基于单片机无线通信网络的实现毕业论文

(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便。
(8) 内置专门稳压电路,使用各种电源包括DC/DC 开关电源均有很好的通信效果。
(9)与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要上拉电阻。
关于nRF2401的内部模块结构图参照下图2-1:
图2-1 nRF2401的内部模块结构图
2.1.3 单片机与无线模块的接口—SPI总线
SPI就是串行外围设备接口,是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便。该接口一般使用4 条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI 接口芯片带有中断信号线INT 或INT、有的SPI 接口芯片没有主机输出/从机输入数据线MOSI)。SPI 的工作模式有两种:主模式和从模式,无论那种模式,都支持3Mbit/s的速率,并且还具有传输完成标志和写冲突保护标志。
尽量节能;低的系统费用(低速微处理器也能进行高速射频发射);数据在空中停留时间短,抗干扰性高。Enhanced ShockBurstTM技术同时也减小了整个系统的平均工作电流。
Enhanced ShockBurstTM发射流程:
(1).把接收机的地址和要发送的数据按时序送入nRF24L01。
(2).配置CONFIG寄存器,使之进入发送模式。
Enhanced ShockBurstTM接收流程:
(1).配置本机地址和要接收的数据包大小;
51单片机无线课程设计

51单片机无线课程设计一、课程目标知识目标:1. 学生能够理解51单片机的基本原理,掌握无线通信技术的基本概念;2. 学生能够掌握51单片机编程的基础知识,包括指令系统、寄存器配置等;3. 学生能够了解无线模块的工作原理,并掌握相关调试方法;4. 学生能够运用51单片机及无线模块实现简单的数据传输和控制功能。
技能目标:1. 学生能够独立完成51单片机的编程与调试;2. 学生能够独立搭建无线通信系统,实现数据收发;3. 学生能够运用所学的知识解决实际问题,具备一定的课程设计能力;4. 学生能够通过课程实践,提升动手能力、团队协作能力和创新能力。
情感态度价值观目标:1. 学生能够认识到单片机及无线通信技术在日常生活中的应用,激发学习兴趣;2. 学生能够通过课程学习,培养严谨的科学态度和良好的学习习惯;3. 学生能够树立团队协作意识,学会与他人分享成果,培养合作精神;4. 学生能够关注单片机及无线通信领域的发展动态,培养持续学习的意识。
课程性质:本课程为实践性较强的课程设计,旨在让学生在掌握51单片机及无线通信技术基础知识的基础上,通过实际操作,提高解决实际问题的能力。
学生特点:学生具备一定的单片机基础和编程能力,对无线通信技术有一定了解,但实践能力有待提高。
教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,培养学生独立思考和解决问题的能力。
将课程目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容1. 51单片机原理及编程基础:- 单片机结构及工作原理- 51单片机指令系统与寄存器- C语言编程基础与Keil开发环境使用2. 无线通信技术原理与模块:- 无线通信基本原理- 常用无线模块介绍(如NRF24L01)- 无线模块的配置与调试方法3. 51单片机与无线模块的接口技术:- 单片机与无线模块的硬件连接- 单片机与无线模块的软件编程- 数据发送与接收处理4. 课程设计实践:- 简单无线数据传输系统设计- 实现无线控制功能(如远程开关、温度监测等)- 课程设计报告撰写与展示教学内容安排与进度:第一周:51单片机原理及编程基础第二周:无线通信技术原理与模块第三周:51单片机与无线模块的接口技术第四周:课程设计实践与成果展示教材章节:《单片机原理与应用》第三章:51单片机结构与工作原理;第四章:51单片机指令系统与编程;第七章:无线通信技术及其应用。
单片机和单片机通信

单片机和单片机之间的通信主要有以下几种方式:
1. 采用硬件UART进行异步串行通信。
这是一种占用口线少,有效、可靠的通信方式。
但遗憾的是许多小型单片机没有硬件UART,有些也只有1个UART,如果系统还要与上位机通信的话,硬件资源可能是不够的。
这种方法一般用于单片机有硬件UART且不需与外界进行串行通信或采用双UART单片机的场合。
2. 采用片内SPI接口或I2C总线模块串行通信形式。
SPI/I2C接口具有硬件简单、软件编程容易等特点,但目前大多数单片机不具备硬件SPI/I2C模块。
3. 利用软件模拟SPI/I2C模式通信,这种方式很难模拟从机模式,通信双方对每一位要做出响应,通信速率与软件资源的开销会形成一个很大的矛盾,处理不好会导致系统整体性能急剧下降。
这种方法只能用于通信量极少的场合。
4. 通过单片机之间的双机通信设计,进一步学习定时器的功能和编程使用,理解穿行通信与并行通信两种通信方式的异同,掌握串行通信的重要指标:字符帧和波特率,初步了解MCS-51系列单片机串行口的使用方法。
5. 单片机通信的方式分有线通信和无线通信,有线通信主要是通过串行或并行接口进行数据传输,无线通信则是通过无线电波进行数据传输。
nrf24l01无线温度传输—51单片机

无线温度传输系统学校:安徽工业大学学院:电气信息学院由于最近要毕业设计了,老师让我做无线通信,然后我上网找了很多资料,决定用24L01做,经过一段时间的摸索,终于实现了24L01的无线温度传输。
以下是我的程序,可供大家参考(当中在贴吧中学到了很多关于24l01的知识)。
发射端程序:#include <reg52.h>#include <intrins.h>//#include "api.h"#define uchar unsigned char#define TX_ADR_WIDTH 5 // 发射地址的字节个数#define TX_PLOAD_WIDTH 2 //发射字节uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};uchar rx_buf[TX_PLOAD_WIDTH];uchar tx_buf[TX_PLOAD_WIDTH];uchar distance_data[2];uchar flag;//标志sbit CE=P1^1; //发射高电平大于10MS 接收高电平sbit CSN=P1^2; //低电平ISP使能sbit SCK=P1^3; //下降沿sbit MOSI=P1^4; //MCU出sbit MISO=P1^5; //MCU入sbit IRQ=P1^6; //中断uchar bdata sta;sbit RX_DR =sta^6; //接收数据准备就绪sbit TX_DS =sta^5; //已发送数据sbit MAX_RT =sta^4;sbit DQ=P3^3;unsigned char time; //设置全局变量,专门用于严格延时//*********************************************NRF24L01*********************** **************//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置//***************************************************************************** *********void init_io(void){CE=0;CSN=1;SCK=0;}void delay_ms(unsigned int x){unsigned int i,j;for(i=0;i<x;i++){j=108;while(j--);}}uchar SPI_RW(uchar byte)//发送指令,接受状态,返回值为状态值{uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++){MOSI = (byte&0x80);byte = (byte<<1);SCK = 1;byte|=MISO;SCK=0;}return(byte);}uchar SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0;status = SPI_RW(reg);SPI_RW(value);CSN = 1;return(status);}uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0;SPI_RW(reg); //写指令reg_val = SPI_RW(0); //读reg的内容CSN = 1;return(reg_val);}uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes){uchar status,byte_ctr;CSN = 0;status = SPI_RW(reg);for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)pBuf[byte_ctr] = SPI_RW(0);CSN = 1;return(status);}uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes){uchar status,byte_ctr;CSN = 0;status = SPI_RW(reg);for(byte_ctr=0; byte_ctr<bytes; byte_ctr++)SPI_RW(*pBuf++);CSN = 1;return(status);}void TX_Mode(void){CE=0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS/*接收模块的地址*/, TX_ADR_WIDTH/*地址宽度5*/);SPI_Write_Buf(WRITE_REG + RX_ADDR_P0/*通道0 接收数据地址*/, TX_ADDRESS, TX_ADR_WIDTH);SPI_Write_Buf(WR_TX_PLOAD,/*写待发数据指令a0*/ tx_buf, TX_PLOAD_WIDTH/*20*/);SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //数据通道0应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //接收数据通道0允许SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);//等待500+86us 自动重发10次SPI_RW_Reg(WRITE_REG + RF_CH,40);SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //数据传输率1Mbps ,发射功率0dBm SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); //配置寄存器CE=1;}void checkflag(){ sta=SPI_Read(STA TUS);//读状态寄存器// if(RX_DR)// {// SPI_Read_Buf(RD_RX_PLOAD/*读取接收数据指令*/,rx_buf/*数组[20]*/,TX_PLOAD_WIDTH/*20*/);// flag=1;// }if(MAX_RT){SPI_RW_Reg(FLUSH_TX/*冲洗发送FIFO指令*/,0);}SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中断}//以下是DS18B20的操作程序//************************************************************************/ void delay1ms(){unsigned char i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:将DS18B20传感器初始化,读取应答信号出口参数:flag***************************************************/bit Init_DS18B20(void){bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ = 1; //先将数据线拉高for(time=0;time<2;time++) //略微延时约6微秒;DQ = 0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲DQ = 1; //释放数据线(将数据线拉高)for(time=0;time<10;time++); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕;return (flag); //返回检测成功标志}/*****************************************************函数功能:从DS18B20读取一个字节数据出口参数:dat***************************************************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat; //储存读出的一个字节数据for (i=0;i<8;i++){DQ =1; // 先将数据线拉高_nop_(); //等待一个机器周期DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_(); //等待一个机器周期DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time<2;time++); //延时约6us,使主机在15us内采样dat>>=1;if(DQ==1)dat|=0x80; //如果读到的数据是1,则将1存入datelsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号DQ存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期}return(dat); //返回读出的十六进制数据}/*****************************************************函数功能:向DS18B20写入一个字节数据入口参数:dat***************************************************/WriteOneChar(unsigned char dat){unsigned char i=0;for (i=0; i<8; i++){DQ =1; // 先将数据线拉高_nop_(); //等待一个机器周期DQ=0; //将数据线从高拉低时即启动写时序DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样DQ=1; //释放数据线for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位}for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间}/*****************************************************函数功能:做好读温度的准备***************************************************/void ReadyReadTemp(void){Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delaynms(150); //转换一次需要延时一段时间Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}void dwend(void){ uchar TL; //储存暂存器的温度低位uchar TH; //储存暂存器的温度高位TL=ReadOneChar(); //先读的是温度值低位TH=ReadOneChar(); //接着读的是温度值高位distance_data[0]=TH ; //测量结果的高8位distance_data[1]=TL; //放入16位的高8位}void main(void){uchar xx;init_io();while(1){ReadyReadTemp() ;dwend();checkflag();for(xx=0;xx<2;xx++){tx_buf[xx]= distance_data[xx];//发数据之前必须把要发送的数据装入它}TX_Mode(); //必须启动发送模块delay_ms(5);}}接收端程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned charuchar code digit[11]={"0123456789-"}; //定义字符数组显示数字uchar code Str[]={"RICHMCU DS18B20"}; //说明显示的是温度//unsigned char code Error[]={" DS18B20 ERROR"}; //说明没有检测到DS18B20 //unsigned char code Error1[]={" PLEASE CHECK"}; //说明没有检测到DS18B20 uchar code Temp[]={"WENDU:"}; //说明显示的是温度uchar code Cent[]={"Cent"}; //温度单位uchar tm[2];uchar flg=0; //负温度标志和临时暂存变量uchar tltemp;#define TX_ADR_WIDTH 5#define TX_PLOAD_WIDTH 2uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};uchar rx_buf[TX_PLOAD_WIDTH];uchar tx_buf[TX_PLOAD_WIDTH];uchar flag;//标志int cout;sbit CE=P1^1; //发射高电平大于10MS 接收高电平sbit CSN=P1^2; //低电平ISP使能sbit SCK=P1^3; //下降沿sbit MOSI=P1^4; //MCU出sbit MISO=P1^5; //MCU入sbit IRQ=P1^6; //中断uchar bdata sta;sbit RX_DR =sta^6; //接收数据准备就绪sbit TX_DS =sta^5; //已发送数据sbit MAX_RT =sta^4;sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置//***************************************************************************** *********void delay1ms(){unsigned char i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0; //将E恢复低电平return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void WriteInstruction (unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/void WriteAddress(unsigned char x){WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,// 就是让E从0到1发生正跳变,所以应先置"0"P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x38);delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x38); //连续三次,确保初始化成功delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delaynms(5); //延时5ms,给硬件一点反应时间WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除delaynms(5); //延时5ms,给硬件一点反应时间}/*****************************************************函数功能:显示说明信息***************************************************/void display_explain(void){unsigned char i;WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示i = 0; //从第一个字符开始显示while(Str[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Str[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(100); //延时100ms较长时间,以看清关于显示的说明}}/*****************************************************函数功能:显示温度符号***************************************************/void display_symbol(void){unsigned char i;WriteAddress(0x40); //写显示地址,将在第2行第1列开始显示i = 0; //从第一个字符开始显示while(Temp[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Temp[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}/*****************************************************函数功能:显示温度的小数点***************************************************/void display_dot(void){WriteAddress(0x49); //写显示地址,将在第2行第10列开始显示WriteData('.'); //将小数点的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示温度的单位(Cent)***************************************************/void display_cent(void){unsigned char i;WriteAddress(0x4c); //写显示地址,将在第2行第13列开始显示i = 0; //从第一个字符开始显示while(Cent[i] != '\0') //只要没有写到结束标志,就继续写{WriteData(Cent[i]); //将字符常量写入LCDi++; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}/*****************************************************函数功能:显示温度的整数部分入口参数:x***************************************************/void display_temp1(uchar x){uchar j,k,l; //j,k,l分别储存温度的百位、十位和个位j=x/100; //取百位k=(x%100)/10; //取十位l=x%10; //取个位WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示if(flg==1) //负温度时显示“—”{WriteData(digit[10]); //将百位数字的字符常量写入LCD}else{WriteData(digit[j]); //将十位数字的字符常量写入LCD}WriteData(digit[k]); //将十位数字的字符常量写入LCDWriteData(digit[l]); //将个位数字的字符常量写入LCDdelaynms(5); //延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示温度的小数数部分入口参数:x***************************************************/void display_temp2(uchar x){WriteAddress(0x4a); //写显示地址,将在第2行第11列开始显示WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD delaynms(5); //延时1ms给硬件一点反应时间}void init_io(void){CE=0;CSN=1;SCK=0;}void delay_ms(unsigned int x){unsigned int i,j;for(i=0;i<x;i++){j=108;while(j--);}}uchar SPI_RW(uchar byte){uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++){MOSI = (byte&0x80);byte = (byte<<1);SCK = 1;byte|=MISO;SCK=0;}return(byte);}uchar SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0;status = SPI_RW(reg);SPI_RW(value);CSN = 1;return(status);}uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0;SPI_RW(reg);reg_val = SPI_RW(0);CSN = 1;return(reg_val);}uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes) {uchar status,byte_ctr;CSN = 0;status = SPI_RW(reg);for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)pBuf[byte_ctr] = SPI_RW(0);CSN = 1;return(status);}uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) {uchar status,byte_ctr;CSN = 0;status = SPI_RW(reg);for(byte_ctr=0; byte_ctr<bytes; byte_ctr++)SPI_RW(*pBuf++);CSN = 1;return(status);}void RX_Mode(void){CE=0;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //数据通道0应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//接收数据通道0允许SPI_RW_Reg(WRITE_REG + RF_CH, 40);SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);// 接收频道0 接收数据长度设置SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //数据传输率1Mbps ,发射功率0dBm SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //配置寄存器CE = 1;}void checkflag(){sta=SPI_Read(STA TUS);if(RX_DR){SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);flag=1;}if(MAX_RT){SPI_RW_Reg(FLUSH_TX,0);}SPI_RW_Reg(WRITE_REG+STATUS,sta);}void yejinchu(void){LcdInitiate(); //将液晶初始化delaynms(5); //延时5ms给硬件一点反应时间display_explain();display_symbol(); //显示温度说明display_dot(); //显示温度的小数点display_cent(); //显示温度的单位}void xianshi(void){uchar TL; //储存暂存器的温度低位uchar TH; //储存暂存器的温度高位uchar TN; //储存温度的整数部分uchar TD; //储存温度的小数部分TH=tm[0] ;TL=tm[1];if((TH&0xf8)!=0x00)//判断高五位得到温度正负标志{flg=1;TL=~TL; //取反TH=~TH; //取反tltemp=TL+1; //低位加1TL=tltemp;if(tltemp>255) TH++; //如果低8位大于255,向高8位进1TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出的是温度的整数部分,小数部分被丢弃了TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,}TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出的是温度的整数部分,小数部分被丢弃了TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,//这样得到的是温度小数部分的第一位数字(保留1位小数)display_temp1(TN); //显示温度的整数部分display_temp2(TD); //显示温度的小数部分delaynms(5);}void main(void){uchar xx;yejinchu();init_io();RX_Mode();while(1){checkflag();if(flag){flag=0;for(xx=0;xx<2;xx++){tm[xx]=rx_buf[xx];delay_ms(1);}xianshi();}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖北民族学院信息工程学院课程设计报告书题目: 基于51单片机的无线通信课程:数字通信系统课程设计专业:电子班级: 0314411学号: *********学生姓名:***指导教师:***2017年 06月 18日摘要本文设计了一种以AT89S52单片机为控制核心的无线通信控制模块,详细说明了该系统的基本原理、主要电路、硬件框架以及软件框架。
整个系统采用模块化设计,主要包括单片机与下位机之间的无线通信控制电路,以及无线通信模块与51单片机之间通信接口电路。
该通信控制系统通过51单片机和nrf2401的spi通信,从而通过无线通信控制模块形成与下位机的联系,控制下位机运动控制器,并且将通信接收的数据保存到扩展的存储器内。
本模块的通信方法简便,除了可以进行远程实时控制外,还可广泛的应用于工业监控和数据采集系统。
本系统具有性能可靠、抗干扰能力强、功耗低、性价比高等优点,在无线通信领域具有重要的应用价值和良好的发展前景。
关键字:无线通信控制;AT89S52;nRF2401;串行通信目录1 绪论 (1)2 总体设计 (2)3 各个模块简介 (3)1.单片机STC89C52和nRF2401的接口电路 (3)3.1NRF24L01 无线模块简介 (4)3.2 1602简介 (4)4 各个模块设计 (10)4.1硬件电路板的设计 (10)4.2软件程序设计 (11)4.2.1主程序模块 (11)4.3 结果与分析 (13)总结 (14)参考文献 (15)1 绪论伴随着短距离低功率无线数据传输技术的成熟,无线数据传输被越来越多地应用到新的领域。
与有线通信方式相比,无线通信以其不需铺设明线,使用便捷等一系列优点,在现代通信领域占重要地位。
以往的无线产品存在范围和方向上的局限,例如,一些无线产品在使用时,无法将信息反馈给控制者;还有一些无线产品不能很好地显示参数或状态信息,如果能在系统中增加一块小型液晶显示电路,产品不仅能向用户显示其状态或状态的改变,而且可以大大降低成本。
正如人们所发现的,只要建立双向无线通信-双工通信并且选无线数据传输模块基于微功耗单片射频收发器NRF24L01设计,采用89C52单片机完成数据的处理和控制择成本低的收发芯片,就会出现许多新应用。
本次设计主要是利用无线收发电路,加上单片机控制与液晶显示制成一套完整的点对点数据收发系统。
考虑到目前市场上的一些需求,设计的主要要求是方案成本低,体积小,低功耗,集成度高,尽量无需调外部元件,传输时间短,接口简单。
2 总体设计本设计使用M3单片机和51单片机通过nRF24L01模块进行通信实现51单片机发送字符到M3单片机上显示。
系统原理框如图2.1所示.图 2.1系统原理框图当51单片机通过spi对2401进行数据读写完毕后,2401将储存的字符通过射频技术发送给等待的2401,这时M3对2401接受到的数据进行读写,然后再TFT屏上显示接收到的内容。
3 各个模块简介1.单片机STC89C52和nRF2401的接口电路STC89C52有UART和SPI接口,而nRF2401用的是DRI、CLK和DATA三线传输。
考虑到速率的因数, STC89C52和nRF2401的连接准备用SPI接口实现。
SPI(Serial PeriPheral Interface,串行外设接口)接口是一种同步串行外设接口,它可以使MCU和各种外围设备进行通信以交换信息。
外围设备包括Flash RAM,网络控制器,LCD显示驱动器,A/D转换器和MUC等。
图4说明了一个典型的SPI主从式总线结构。
它使用3根线连接了所有的设̅̅̅脚来选择从设备。
备。
主设备通过并行的4个管脚来控制各个从设备的SS图2典型的SPI主从式总线结构1、MOSI (Master Output Slave Input):这个1bit的信号直接连接主设备和从设备。
信号通过MOSI线从主设备串行传输到从设备。
因此,对主设备而言,MOSI是信号输出端口,对从设备而言,则是信号输入端口。
在这条线上,一个Byte的信号通过高位(MSB)到低位(LSB)的传输。
2、MISO (Master Input Slave Output):通过这个1bit的信号线,信号由从设备传输到主设备,因此它是主设备的信号输入端口,从设备的信号输出端口。
信号同样是从MBS到LBS的传输。
3、SCK (SPI Serial Clock):这个信号来同步所有设备的进出MOSI和MISO的数据。
它通过主设备的8个时钟周期来驱动,允许交换串行线上的1个Byte的信号。
̅̅̅ (Slave Select)4、SS̅̅̅管脚保持低电平来选择该从设备。
显然只有主设备通过使某个从设备的SS̅̅̅管脚保持高电平)才能驱动这个系统。
主设备通过软件,利用端口来选择(它的SS从设备。
通过阻止MISO线上的冲突,来保证主设备每次传输只选择一个从设̅̅̅管脚可以和SPI的状态寄存器SPSTA中的MODF一起工备。
在设置主设备时, SS作来阻止多个主设备一起驱动MOSI和SCK。
3.1NRF24L01 无线模块简介NRF24L01 无线模块,采用的芯片是 NRF24L01,该芯片的主要特点如下:1) 2.4G 全球开放的 ISM 频段,免许可证使用。
2)最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强。
3) 125 个可选的频道,满足多点通信和调频通信的需要。
4)内置 CRC 检错和点对多点的通信地址控制。
5)低工作电压(1.9~3.6V)。
6)可设置自动应答,确保数据可靠传输。
该芯片通过 SPI 与外部 MCU 通信,最大的 SPI 速度可以达到 10Mhz。
本章我们用到的模块是深圳云佳科技生产的 NRF24L01,该模块成熟度和稳定性都是相当不错的。
该模块的外形和引脚图如图 3.1 所示:图 3.1 NRF24L01 无线模块外形和引脚图模块 VCC 脚的电压范围为 1.9~3.6V,建议不要超过 3.6V,否则可能烧坏模块,一般用 3.3V电压比较合适。
除了 VCC 和 GND 脚,其他引脚都可以和 5V 单片机的IO 口直连,正是因为其兼容 5V 单片机的 IO,故使用上具有很大优势。
3.2 1602简介1.1602字符液晶显示模块,可显示数字和字母。
与数码管相比显示内容更丰富,而且编程简单。
它能够显示系统的当前工作时间、时间以及温度传感器检测到的温度。
为使用者观察提供了方便。
LCD1602的接口信号说明如表3表3 LCD1602的接口信号编号引脚符号功能说明编号引脚符号功能说明1 VSS 电源地9 D2 DATA I/O2 VDD 电源正极10 D3 DATA I/O3 VL 液晶显示偏压信号11 D4 DATA I/O12 D5 DATA I/O4 RS 数据/命令选择端(H/L)5 R/W 读/写选择端(H/L)13 D6 DATA I/O6 E 使能信号14 D7 DATA I/O7 D0 DATA I/O 15 BLA 背光正极8 D1 DATA I/O 16 BLK 背光负极2.基本操作时序如下:1)读状态:RS=L,RW=H,E=H2)写指令:RS=L,RW=L,D0~D7=指令码,E=高脉冲3)读数据:RS=H,RW=H,E=H4)写数据:RS=H,RW=L,D0~D7=数据,E=高脉冲3.初始化设置1)显示模式设置如表5表4 显示模式设置指令码功能0 0 1 1 1 0 0 0 设置16*2显示,5*7点阵,8位数据接口2)显示开/关及光标设置如表6:表7 显示开/关及光标设置指令码功能0 0 0 0 1 D C B D=1开显示;D=0关显示C=1显示光标;C=0不显示光标B=1光标闪烁;B=0光标不显示0 0 0 0 0 1 N S N=1当读或写一个字符后地址指针加一,且光标加一N=0当读或写一个字符后地址指针减一,且光标减一S=1当写一个字符,整屏显示左移(N=1)LCD1602与MCU的接口电路LCD的D0~D7分别接单片机的的P0口,作为数据线,因为P0口内部没有上拉电阻,所以外部另外加上4.7K的上拉电阻;P2.5—P2.7分别接LCD的RS、RW、E三个控制管脚;RV1用来调节LCD的显示灰度;BLK、BLA为背光的阴极和阳极,接上相应电平即点亮背光灯。
如图4图4 1602显示电路其中1602的第3脚接10K与1.5K的串联电阻起到分压作用,能够调节第一行与第二行亮度对比。
第16接个三极管的作用放大,是为了能够让液晶显示器的背光灯亮起,从而在夜间也能观看显示内容。
3.3 STC89C52单片机单片微型计算机是随着微型计算机的发展而产生和发展的。
自从1975 年美国德克萨斯仪器公司的第一台单片微型计算机(简称单片机)TMS-1000 问世以来,迄今为止,单片机技术已成为计算机技术的一个独特分支,单片机的应用领域也越来越广泛,特别是在工业控制中经常遇到对某些物理量进行定时采样与控制的问题,在仪器仪表智能化中也扮演着极其重要的角色。
如果将8位单片机的推出作为起点,那么单片机的发展历史大致可以分为以下几个阶段:第一阶段(1976—1978):单片机的探索阶段。
以Intel公司的MCS-48为代表。
MCS-48的推出是在工控领域的探索,参与这一探索的公司还有Motorola、Zilog等。
都取得了满意的效果。
这就是SCM的诞生年代,“单片机”一词即由此而来。
第二阶段(1978—1982):单片机的完善阶段。
Intel公司在MCS-48基础上推出了完善的、典型的单片机系列MCS-51。
它在以下几个方面奠定了典型的通用总线型单片机体系结构。
(1)完善的外部总线。
MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有多机通信功能的串行通信接口。
(2)CPU外围功能单元的集中管理模式。
(3)体现工控特性的地址空间及位操作方式。
(4)指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。
第三阶段(1982—1990):8位单片机的巩固发展及16位单片机的推出阶段,也是单片机向微控制器发展的阶段。
Intel公司推出的MCS-96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳入片中,体现了单片机的微控制器特征。
第四阶段(1990—):微控制器的全面发展阶段。
随着单片机在各个领域全面、深入地发展和应用,出现了高速、大寻址范围、强运算能力的8位/16位/32位通用型单片机,以及小型廉价的专用型单片机。
单片机是在集成电路芯片上集成了各种元件的微型计算机,这些元件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时/计数器、中断系统、时钟部件的集成和I/O接口电路。