基于STM32温控风扇设计(共29页)

上传人:wz****p 文档编号:61205926 上传时间:2022-03-10 格式:DOC 页数:30 大小:2.76MB
返回 下载 相关 举报
基于STM32温控风扇设计(共29页)_第1页
第1页 / 共30页
基于STM32温控风扇设计(共29页)_第2页
第2页 / 共30页
基于STM32温控风扇设计(共29页)_第3页
第3页 / 共30页
点击查看更多>>
资源描述
精选优质文档-倾情为你奉上齐 齐 哈 尔 大 学 综合实践(论文)题 目 基于STM32的温控风扇学 院 通信与电子工程学院 专业班级 学生姓名 学生学号 指导教师 朱磊 专心-专注-专业摘要:随着科技的日新月异,智能家居逐渐走入普通家庭,风扇作为基本的家用电器也将成为智能家居的一部分。这里介绍的是以STM32单片机为控制单元并结合嵌入式技术设计的一款具有温控调速、液晶显示温度等信息的智能电风扇。经过前期设计、制作和最终的测试得出,该风扇电源稳定性好,操作方便,运行可靠,功能强大,价格低廉,节约能耗,能够满足用户多元化的需求。该风扇具有的人性化设计和低廉的价格很适合普通用户家庭使用。 关键词:STM32单片机电风扇温控调速目 录 0111 4565第1章 绪论1.1概述传统电风扇多采用机械控制,功能单一,噪声大,定时时间短,摇头模式固定,变档风速变化较大。针对这些缺点,本文采用了一款性价比高、功耗低的基于ARM CortexM3内核的STM32单片机作为控制单元制作了一台智能电风扇,该风扇巧妙地运用温度传感技术、液晶显示技术等,把智能控制技术应用到家用电器的控制中,可以根据环境温度的采样实现风速的自动调整,并根据采集到的温度显示到液晶屏上。采用的芯片功能强大,方便进行功能扩展。 1.2设计目的及意义春夏(夏秋)交替时节,白天温度依旧很高,电风扇应高转速、大风量,使人感到清凉;到了晚上,气温降低,当人入睡后,应该逐步减小转速,以免使人感冒。虽然电风扇都有调节不同档位的功能,但必须要人手动换档,睡着了就无能为力了,而普遍采用的定时器关闭的做法,一方面是定时时间长短有限制,一般是一两个小时;另一方面可能在一两个小时后气温依旧没有降低很多,而风扇就关闭了,使人在睡梦中热醒而不得不起床重新打开风扇,增加定时器时间,非常麻烦,而且可能多次定时后最后一次定时时间太长,在温度降低以后风扇依旧继续吹风,使人感冒;第三方面是只有简单的到了定时时间就关闭风扇电源的单一功能,不能满足气温变化对风扇风速大小的不同要求。又比如在较大功率的电子产品散热方面,现在绝大多数都采用了风冷系统,利用风扇引起空气流动,带走热量,使电子产品不至于发热烧坏。要使电子产品保持较低的温度,必须用大功率、高转速、大风量的风扇,而风扇的噪音与其功率成正比。如果要低噪音,则要减小风扇转速,又会引起电子设备温度上升,不能两全其美。为解决上述问题,我们设计了这套温控自动风扇系统。本系统采用高精度集成温度传感器,用单片机控制,能显示实时温度,并根据使用者设定的温度自动在相应温度时作出小风、大风、停机动作,精确度高,动作准确。 第2章 温控电风扇方案论证2.1温度传感器的选择温度传感器可由以下几种方案可供选择:方案一:选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转换芯片ADC0809将模拟信号转化为数字信号输入单片机处理。方案二:采用热电偶作为感测温度的核心元件,配合桥式电路,运算放大电路和AD转换电路,将温度变化信号送入单片机处理。方案三:采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号供单片机处理。对于方案一,采用热敏电阻有价格便宜、元件易购的优点,但热敏电阻对温度的细微变化不敏感,在信号采集、放大、转换过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其本身电阻对温度的变化存在较大误差,虽然可以通过一定电路予以纠正,但不仅将使电路复杂稳定性降低,而且在人体所处温度环境温度变化中难以检测到小的温度变化。故该方案不适合本系统。对于方案二,采用热电偶和桥式测量电路相对于热敏电阻其对温度的敏感性和器件的非线性误差都有较大提高,其测温范围也非常宽,从-50摄氏度到1600摄氏度均可测量。但是依然存在电路复杂,对温度敏感性达不到本系统要求的标准,故不采用该方案。对于方案三,由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转换等电路的误差因素,温度误差很小,并且由于其感测温度的原理与上述两种方案的原理有着本质的不同,使得其温度分辨力极高。温度值在器件内部转换成数字量直接输出,简化了系统程序设计,又由于该传感器采用先进的单总线技术(1-WRIE),与单片机的接口变的非常简洁,抗干扰能力强。关于DS18B20的详细参数参看下面“硬件设计”中的器件介绍。22控制核心的选择方案一:采用电压比较电路作为控制部件。温度传感器采用热敏电阻或热电偶等,温度信号转为电信号并放大,由集成运放组成的比较电路判决控制风扇转速,当高于或低于某值时将风扇切换到相应档位。方案二:采用STM32单片机作为控制核心。以软件编程的方法进行温度判断,并在端口输出控制信号。对于方案一,采用电压比较电路具有电路简单、易于实现,以及无需编写软件程序的特点,但控制方式过于单一,不能自由设置上下限动作温度,无法满足不同用户以及不同环境下的多种动作温度要求,故不在本系统中采用。对于方案二,以STM32单片机作为控制器,通过编写程序不但能将传感器感测到的温度通过显示电路显示出来,而且用户能通过键盘接口,自由设置上下限动作温度值,满足全方位的需求。并且通过程序判断温度具有极高的精准度,能精确把握环境温度的微小变化。故本系统采用方案二。23显示电路的选择方案一:采用五位共阳数码管显示温度,动态扫描显示方式。方案二:采用液晶显示屏LCD显示温度对于方案一,该方案成本低廉,显示温度明确醒目,在夜间也能看见,功耗极低,显示驱动程序的编写也相对简单,这种显示方式得到广泛应用。不足的地方是扫描显示方式是使五个LED逐个点亮,因此会有闪烁,但是人眼的视觉暂留时间为20MS,当数码管扫描周期小于这个时间时人眼将感觉不到闪烁,因此可以通过增大扫描频率来消除闪烁感。对于方案二,液晶体显示屏具有显示字符优美,不但能显示数字还能显示字符甚至图形的优点,这是LED数码管无法比拟的。而且硬件连接简单,因此本系统采用方案二。24调速方式的选择方案一:采用数模转化芯片DAC0832来控制,由单片机根据当前环境温度值输出相应数字量到DAC0832中,再由DAC0832产生相应模拟信号控制晶闸管的导通角,从而通过无级调速电路实现风扇电机转速的自动调节。方案二:采用单片机软件编程实现PWM(脉冲宽度调制)调速的方案。PWM为英文Pulse Width Modulation的缩写,它为按一定的规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调节方式,在PWM驱动控制的调节系统中,最常用的为矩形波PWM信号,在控制时需要调节PWM波得占空比。占空比为指高电平持续时间在一个周期时间内的百分比。在控制电机的转速时,占空比越大,转速就越快,若全为高电平,占空比为100%时,转速达到最大。用单片机I/O口输出PWM信号时,有如下两种方案:(1) 利用软件延时。当高电平延时时间到时,对I/O口电平取反,使其变成低电平,然后再延时一定时间;当低电平延时时间到时,再对该I/O口电平取反,如此循环即可得到PWM信号。在本设计中应用了此方案。(2) 利用定时器。控制方案与(1)相同,只为在该方案中利用单片机的定时器来定时进行高低电平的转变,而不为用软件延时。应用此方案时编程相对复杂。对于方案一,该方案能够实现对直流风扇电机的无级调速,速率变化灵敏,但为D/A转化芯片的价格较高,与其温控状态下无级调速性能相比性价比不高。对于方案二,相对于其他用硬件或者软硬件相结合的方案实现对电机进行调速而言,采用PWM 用纯软件的方案来实现调速过程,具有更大的灵活性,并可大大降低成本,能够充分发挥单片机的性能,对于简单速率控制系统的实现提供了一种有效的途径。综合考虑选用方案二。第3章 温控电风扇硬件设计3.1硬件系统总体设计本次设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在 LCD1602上。根据温度的不同,利用STM32对风扇进行调速,总体硬件设计如图1所示:图1 系统总体结构框图3.2本系统各器件简介 3.2.1 DS18B20简介DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源,因而使用DS18B20可使系统结构更趋简单可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。 DS18B20简介:(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。(2)在使用中不需要任何外围元件。(3)可用数据线供电,电压范围:+3.0 +5.5 V。(4)测温范围:-55 +125 。固有测温分辨率为0.5 。(5)通过编程可实现912位的数字读数方式。(6)用户可自设定非易失性的报警上下限值。(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。单线(1wire)技术:该技术采用单根信号线,既可传输时钟,也能传输数据,而且是双向传输。适用于单主机系统,主机能够控制一个或多个从机设备,通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能释放该线,而让其他设备使用。单线通常要求外接一个5K的上拉电阻,这样当该线空闲时,其状态为高电平。主机和从机之间的通讯分成三个步骤:初始化单线器件、识别单线器件和单线数据传输。单线1wire协议由复位脉冲、应答脉冲、写0、写1、读0、读1,这几种信号类型实现,这些信号中除了应答脉冲其他都由主机发起,并且所有指令和数据字节都是低位在前。DS18B20直接将测量温度值转化为数字量提交给单片机,工作时必须严格遵守单总线器件的工作时序。DS18B20 内部结构及管脚如图2,图3所示:图2 DS18B20内部结构图图3 DS18B20外形及管脚图3.2.2 STM32简介STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,其中STM32F1系列有:STM32F103“增强型”系列,STM32F101“基本型”系列,STM32F105、STM32F107“互联型”系列。 增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。 内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振。低功耗:3种低功耗模式:休眠,停止,待机模式。为RTC和备份寄存器供电的VBAT。调试模式:串行调试(SWD)和JTAG接口。DMA:12通道DMA控制器。支持的外设:定时器,ADC,DAC,SPI,IIC和UART。3个12位的us级的A/D转换器(16通道):A/D测量范围:0-3.6 V。双采样和保持能力。片上集成一个温度传感器。2通道12位D/A转换器:STM32F103xC,STM32F103xD,STM32F103xE独有。最多高达112个的快速I/O端口:根据型号的不同,有26,37,51,80,和112的I/O端口,所有的端口都可以映射到16个外部中断向量。除了模拟输入,所有的都可以接受5V以内的输入。最多多达11个定时器:4个16位定时器,每个定时器有4个IC/OC/PWM或者脉冲计数器。2个16位的6通道高级控制定时器:最多6个通道可用于PWM输出。2个看门狗定时器(独立看门狗和窗口看门狗)。Systick定时器:24位倒计数器。2个16位基本定时器用于驱动DAC。最多多达13个通信接口:2个IIC接口(SMBus/PMBus)。5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。3个SPI接口(18 Mbit/s),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。ECOPACK封装:STM32F103xx系列微控制器采用ECOPACK封装形式。3.2.3LCD1602液晶屏简介1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。其实物图如图4所示:图4 LCD1602实物图1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块。1602采用标准的16脚接口,其中:第1脚:GND为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。3.3 各部分电路设计3.3.1 温度传感器电路本模块用更为优秀的DS18B20作为温度传感器,STM32单片机作为处理器,配以温度显示作为温度控制输出单元。整个系统力求结构简单,功能完善。电路图如图2所示。系统工作原理如下:DS18B20数字温度传感器采集现场温度,将测量到的数据送入STM32单片机的GPIO口,经过单片机处理后显示当前温度值,并与设定温度值的上下限值作比较,若高于设定上限值或低于设定下限值则控制电机转速进行自动调整。图5DS18B20温度计原理图3.3.2 LCD1602液晶屏显示电路本模块采用LCD1602对温度进行显示,液晶体显示屏具有显示字符优美,不但能显示数字还能显示字符甚至图形的优点,其电路设计如下图:图6液晶显示电路第4章 温控电风扇软件设计4.软件系统总体设计本次设计控制系统软件使用C语言编程。使用模块化设计,除主程序外,还有各功能子程序,分别执行直流电机驱动调速及温度采集、显示等功能,编辑环境采用集成开发环环境Keil。程序总体运行流程图如下:图7 程序运行流程图4.2 系统初始化程序设计系统初始化包括STM32系统定时器初始化,GPIO口初始化以及LCD1602初始化等,具体设计流程图如图8:图8 初始化程序流程图4.3温度采集与显示程序设计 DS18B20温度传感器进行温度采集时,要依次进行初始化,ROM操作指令,存储器操作指令,数据传输等操作,具体程序设计流程如图9:图9 温度采集与显示流程图结论 本次设计的系统以STM32单片机为控制核心,以温度传感器DS18B20检测环境温度,实现了根据环境温度变化调节不同的风扇电机转速,在一定范围能能实现转速的连续调节,LCD1602能连续稳定的显示环境温度,实现了基于单片机的温控风扇的设计。本系统设计可推广到各种电动机的控制系统中,实现电动机的转速调节。在生产生活中,本系统可用于简单的日常风扇的智能控制,为生活带来便利;在工业生产中,可以改变不同的输入信号,实现对不同信号输入控制电机的转速,进而实现生产自动化,如在电力系统中可以根据不同的负荷达到不同的电压信号,再由电压信号调节不同的发电机转速,进而调节发电量,实现电力系统的自动化调节。综上所述,该系统的设计和研究在社会生产和生活中具有重要地位。参考文献1 曹巧媛.单片机原理及应用.北京:电子工业出版社,2002.22 王伦.电风扇原理与维修技术.北京:新时代出版社,19993 张毅刚.新编MCS-51单片机应用设计.哈尔滨工业大学出版社,2006.104 梁廷贵,王裕琛.可控硅触发电路语音电路分册.北京:科学技术文献出版社,2003附录程序1. 主函数#include stm32f10x.h#include bsp_SysTick.h#include #include bsp_ds18b20.hint main() int PWM,low,zhouqi; float wendu; int wendu1; zhouqi=500; low=zhouqi-PWM; SysTick_Init(); init1602(); lcdpos(1,0); writestring(TEM: 00.0); GPIO_SetBits(GPIOB,GPIO_Pin_0); while( DS18B20_Init() lcdpos(0,0); writestring( no ds18b20 exit); lcdpos(0,0); writestring(ds18b20 exit); for(;) DS18B20_Get_Temp(wendu); if (wendu30) low=500; GPIO_SetBits(GPIOB,GPIO_Pin_0); Delay_ms(PWM); if(wendu1=15&wendu1=20&wendu1=25&wendu130) low=300; GPIO_SetBits(GPIOB,GPIO_Pin_0); Delay_ms(PWM); GPIO_ResetBits(GPIOB,GPIO_Pin_0); Delay_ms(low); 2. DS18B20子程序#include bsp_ds18b20.h/* * 函数名:DS18B20_GPIO_Config * 描述 :配置DS18B20用到的I/O口 * 输入 :无 * 输出 :无 */static void DS18B20_GPIO_Config(void) /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启DS18B20_PORT的外设时钟*/ RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); /*选择要控制的DS18B20_PORT引脚*/ GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化DS18B20_PORT*/ GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); /* * 函数名:DS18B20_Mode_IPU * 描述 :使DS18B20-DATA引脚变为输入模式 * 输入 :无 * 输出 :无 */static void DS18B20_Mode_IPU(void) GPIO_InitTypeDef GPIO_InitStructure; /*选择要控制的DS18B20_PORT引脚*/ GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; /*设置引脚模式为浮空输入模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*调用库函数,初始化DS18B20_PORT*/ GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);/* * 函数名:DS18B20_Mode_Out_PP * 描述 :使DS18B20-DATA引脚变为输出模式 * 输入 :无 * 输出 :无 */static void DS18B20_Mode_Out_PP(void) GPIO_InitTypeDef GPIO_InitStructure; /*选择要控制的DS18B20_PORT引脚*/ GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化DS18B20_PORT*/ GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);/* *主机给从机发送复位脉冲 */static void DS18B20_Rst(void) /* 主机设置为推挽输出 */ DS18B20_Mode_Out_PP(); DS18B20_DATA_OUT(LOW); /* 主机至少产生480us的低电平复位信号 */ Delay_us(750); /* 主机在产生复位信号后,需将总线拉高 */ DS18B20_DATA_OUT(HIGH); Delay_us(15);/* * 检测从机给主机返回的存在脉冲 * 0:成功 * 1:失败 */static uint8_t DS18B20_Presence(void) uint8_t pulse_time = 0; /* 主机设置为上拉输入 */ DS18B20_Mode_IPU(); while( DS18B20_DATA_IN() & pulse_time=100 ) return 1; else pulse_time = 0; /* 存在脉冲到来,且存在的时间不能超过240us */ while( !DS18B20_DATA_IN() & pulse_time=240 ) return 1; else return 0;/* * 从DS18B20读取一个bit */static uint8_t DS18B20_Read_Bit(void) uint8_t dat; /* 读0和读1的时间至少要大于60us */ DS18B20_Mode_Out_PP(); /* 读时间的起始:必须由主机产生 1us 15us 的低电平信号 */ DS18B20_DATA_OUT(LOW); Delay_us(10); / * 设置成输入,释放总线,由外部上拉电阻将总线拉高 */ DS18B20_Mode_IPU(); /Delay_us(2); if( DS18B20_DATA_IN() = SET ) dat = 1; else dat = 0; /* 这个延时参数请参考时序图 */ Delay_us(45); return dat;/* * 从DS18B20读一个字节,低位先行 */uint8_t DS18B20_Read_Byte(void) uint8_t i, j, dat = 0; for(i=0; i8; i+) j = DS18B20_Read_Bit(); dat = (dat) | (ji); return dat;/* * 写一个字节到DS18B20,低位先行 */void DS18B20_Write_Byte(uint8_t dat)uint8_t i, testb;DS18B20_Mode_Out_PP();for( i=0; i1;/* 写0和写1的时间至少要大于60us */ if (testb) DS18B20_DATA_OUT(LOW); /* 1us 这个延时 15us */ Delay_us(8); DS18B20_DATA_OUT(HIGH); Delay_us(58); else DS18B20_DATA_OUT(LOW); /* 60us Tx 0 120us */ Delay_us(70); DS18B20_DATA_OUT(HIGH); /* 1us Trec(恢复时间) 无穷大*/ Delay_us(2); void DS18B20_Start(void) DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC);/* 跳过 ROM */ DS18B20_Write_Byte(0X44);/* 开始转换 */uint8_t DS18B20_Init(void) DS18B20_GPIO_Config(); DS18B20_Rst(); return DS18B20_Presence();float DS18B20_Get_Temp(float f_tem) uint8_t tpmsb, tplsb; short s_tem;DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC);/* 跳过 ROM */DS18B20_Write_Byte(0X44);/* 开始转换 */DS18B20_Rst();DS18B20_Presence(); DS18B20_Write_Byte(0XCC);/* 跳过 ROM */ DS18B20_Write_Byte(0XBE);/* 读温度值 */ tplsb = DS18B20_Read_Byte(); tpmsb = DS18B20_Read_Byte(); s_tem = tpmsb8; s_tem = s_tem | tplsb; I f( s_tem 0 )/* 负温度 */ f_tem = (s_tem+1) * 0.0625; else f_tem = s_tem * 0.0625; return f_tem; 3. LCD1602子程序#include#include bsp_SysTick.hvoid LCD_GPIO_init()GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_0|GPIO_Pin_11;GPIO_Init(GPIOB, &GPIO_InitStructure);void RS(u8 a) if(a=0)GPIO_ResetBits(GPIOB,GPIO_Pin_5); if(a=1)GPIO_SetBits(GPIOB,GPIO_Pin_5);void WR(u8 a) if(a=0)GPIO_ResetBits(GPIOB,GPIO_Pin_1); if(a=1)GPIO_SetBits(GPIOB,GPIO_Pin_1);void EN(u8 a) if(a=0)GPIO_ResetBits(GPIOB,GPIO_Pin_6); if(a=1)GPIO_SetBits(GPIOB,GPIO_Pin_6);void dat(u8 dat) u16 a; a=GPIO_ReadOutputData(GPIOA); a=a&0xff00; a=a|dat; GPIO_Write(GPIOA,a);void write_cmd(u8 cmd) RS(0); WR(0); dat(cmd); Delay_us(500); EN(1); Delay_us(500); EN(0);void write_dat(u8 date) RS(1); WR(0); dat(date); Delay_us(500); EN(1); Delay_us(500); EN(0);void lcdpos(u8 X,u8 Y) u8 cmd; if(X=0)cmd=0x80+Y; if(X=1)cmd=0x80+0x40+Y; write_cmd(cmd);void writestring(char *s) while(*s) write_dat(*s); s+; void init1602(void) LCD_GPIO_init(); Delay_us(1000); EN(0); write_cmd(0x38); write_cmd(0x0c); write_cmd(0x06); write_cmd(0x01); write_cmd(0x80);附录2实物图
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!