基于51单片机多功能太阳能充电器设计

1 绪论
1.1 本课题研究背景及现状

当代社会随着一些不可再生资源如煤炭,石油等日益减少,使得各国社会经济越来越受能源问题的约制,因此许多国家开始逐渐的实行“阳光计划”,开发洁净的能源如太阳能,用以成为本国经济发展的新动力。

首先让我们想到的是太阳能电池,因为它不会消耗水,燃料等物质,并且不会释放任何对环境有污染的气体,是直接通过太阳光与材料的相互作用释放出电能,这种无污染资源对环境的保护有着相当重要的意义[1]。由于无公害的作用,目前世界太阳能电池产业已经出具规模,1995 年到 2004 年的十年内平均年增长率达到 30%以上。随着新型太阳能电池的涌现,以及传统硅电池的不断革新,新的概念已经开始在太阳能电池技术中显现,从某种意义上讲,预示着太阳能电池技术的发展趋势[2]。世界各国对光伏发电也越来越重视,目前全世界已超过一百个国家使用光伏发电系统,其中以欧洲为代表的发达国家为主,占总市场的 80.1%,早在 09 年的时候,世界各国总的光伏新加装机容量接近 800 万千瓦,截至当年低,世界光伏装机容量总共接近 2700 万千瓦[3]。随着并网光伏发电市场的迅速发展,让它受到了世界各地的关注。

目前,太阳能电池的应用已经逐渐广泛得到推广,众所周知,沙漠地区由于气温特别高,因此最具有大规模开发太阳能的潜力,这使得沙漠等偏远地区对其的使用更加方便,并且能减低甚至节省昂贵的输电线路,从长远发展状况来看,随着改善太阳能电池制造技术和新的光 - 电转换装置发明,国家环保和清洁能源,光伏发电系统和太阳能发电的巨大需求恢复将继续利用太阳辐射能比较实用方法,这可以为人类以后能使用太阳能提供了广阔的开辟前景[4]。

当代社会太阳能手机充电器得到了一定的使用,它具有运用方便,环保,节能,

格外使用于应急场合,高效率充电,性价比较高,让大家无论身处何处,都不会受到手机没电的困扰[5]。借此太阳能手机充电器的众多优点,因此提出本课题。

1.2 课题设计思想

基于单片机的太阳能充电器的设计是本次探导的课题。首先,由于太阳能电池板的电压会随太阳光的强度波动,强烈的太阳光的太阳能电池板的电压是高的数,当太阳光弱的强度,所述太阳能电池板的输出电压低时,从太阳能电池板的输出到稳定的电压[6]。本设计采用了稳压器 LM7805 , LM7805 输出端口可以输出稳定的5V 电压,因为电力可以用于单芯片和其它芯片,其次,作为下一个电源电压转换电路。第二,考虑到电池的充电过程的电压要求各不相同,不能简单稳定的直流输出,因此提出了利用DC / DC转换器电路的,通过控制关断时间的占空比,以调节输出电压。 SCM 是控制中心,在控制信号产生电路是由充电过程的一个外部状态产生的,外部充电电压的比较信号和充电电流与理想充电过程中,占空比调节。单个微控制器设计用于该目的,所述电压检测电路和一个电流检测电路,并且为了方便用户知道系统的状态,设计设置在显示模块和指标。

1.3 论文结构

本论文第一部分介绍了当前的形势和太阳能电池和太阳能光伏发电系统,本研究的背景,并提出了设计思路的发展前景;第二部分论述整个系统的设计方案;第三部分介绍了系统的硬件电路设计;第四部分进行了系统软件设计;第五部分进行了系统仿真分析;第六部分分析了该设计的成果和前景。

2 基于单片机的太阳能充电器系统总体方案设计2.1 设计方案一

该程序使用的 DC / DC 转换电路,将太阳能电池板输出的电压变换为需要的电压值给手机电池充电,同时单片机可以控制电路变换,还可采用按键设定某些值,有显示部分,可以设定为显示电路状态。可以从该图中的框图中可以看出,该程序能够控制 DC / DC 变换器电路,显示模块,但该程序是没有实时检测的外部电路,而不是用 DC / DC 实时控制根据外部电路的条件转换电路。

2.2 设计方案二

借于方案一存在的缺点,所以在此提出第二种方案,方案二方框图如下图 2.2。

如从图2可以看出,以弥补设计用于检测电路的状态的方案的缺点,并通过模拟转换到数字的转换模块的信号到微控制器。 PWM 控制芯片微控制器可以产生施加 PWM波转换电路的控制主要模块和显示模块,但此次方案是将生成 PWM 部分用芯片替换,这使得电路复杂硬件部分的设计,它是更好地使用软件允许硬件电路简单,而且还能充分利用单片机的功能。

2.3 基于单片机的太阳能充电器的设计的总体设计方案

综合以上两种方案提出本次设计的整体设计框图如下图 2.3 所示。

图 2.3 整体设计框图

相对于前两种方案,此整体方案显示的优点,不仅能对充电电路进行检测,单片机还可以根据充电电路的关键电路的信号处理后的分析来检测的情况进行控制可以选择系统可以实现功能。显示电路可以显示用于实现本方案的电路中,PWM控制信号的工作状态,从而使硬件电路非常简单,节省资源,提高系统的性能。

3 基于单片机的太阳能充电器系统的硬件设计
3.1 太阳能电池板的选用

太阳能电池板是通过吸收太阳光,将太阳辐射能通过光电效应或者光化学效应直接或间接转换成电能的装置,大部分太阳能电池板的主要材料为“硅”,但因制作成本很大,以致于它还不能被大量广泛和普遍地使用。硅太阳能电池分为晶体硅电池板, 非晶硅电池板等几种。单晶硅太阳能电池的光电转换效率为 15%左右,最高通常可以达到 24%,它是所有种类的太阳能电池中光电转换效率最高的,但制作成本很大,以致于它还不能被普遍地使用,因为单晶硅通常会用钢化玻璃和防水树脂包装起来,所以会十分耐用,通常能用十几年,最长可以用 25年。多晶硅太阳电池的制作过程与单晶的差不多,可相对而言起光电转换效率要比单晶降低很多,其效率大概在 12% 左右 (其中世界上最高的多晶硅转换效率为 14.8%)[7]。但如果我们从制作费用上来讲,多晶硅的由于制造简单,节能节电,因此其生产费用就会降低不少,从而得到了一定的发展。另外,其使用年限没有单晶硅太阳能电池那么长。如果从性价比来说,自然是单晶硅太阳能电池还略好。接下来我们说下非晶硅太阳电池,它是 1976 年出现的新型薄膜式太阳电池,其制造过程得到了很多简化,对硅材料的使用很少,电耗也更低,它突出的优点是在很多情况下都能发电包括弱光时候。但它也有一定的问题,就是光电转换效率相对而言偏低,就算国际上的先进水平也只大约在10%,不够稳定,时间越久,其转换效率会衰减。

根据所需要的不同数目的太阳能电池,其转换效率是通过光,温度和结晶型太阳能电池的制造工艺和其他因素的影响,2010 年中国平均效率接近为 18%,一般的太阳能电池电压有很多种,其主要用于太阳能发电。

太阳能电池板的太阳能发电系统是其工作的基础,是充电器的第一部分,其功能是将太阳光转为电能,如今更多种类型的便携式数字设备,电压和电流范围所需的输入功率较大的器件,面积较大,必须使用太阳能电池板,这给了携带不便。因此,模块化设计的组合,可根据不同的负载充电需求,太阳能电池板组合起来以实现一组光伏电池在某个期望的输出功率和输出电压。本文通过一些常用的小功率设备例如手机,来讲解太阳能充电器设计的过程。

3.2 LM7805 稳压电路

由于太阳能电池板的电压会随太阳光的强度波动,强烈的太阳光会使太阳能电池板的电压变高,当太阳光强度变弱时,自然会使电池板输出电压变低。为了获得到稳定的输出,本设计应用稳压管 LM7805,其输出口能输出稳定的所需要电压(5V),以便能保持稳定的输出电压。典型 LM7805 的应用电路图如图 3.1 所示。

图中 C4、C7 的是用于清除因长期连接时由于电感效应产生的自激振荡,降低了纹波电压,在其输出端接上电容 C6、C5 的作用是清除电路高频产生的噪声,以便提高所用负载的瞬态响应。一般来说电容的耐压性都会比电源输入、输出电压要强。此外,在稳压器输入、输出端之间加上二极管,可以避免对稳压器的破坏,从而实现对 LM7805 的保护。

LM7805 输入电压在 7V 至 37V 之间,其最大工作电流可达 1.5A,且拥有电路精简,电流输出高,运行工作稳定,即使电压不稳定,也能使太阳能电池拥有不变的输出电压(5V),最后能让单片机控制的电路正常稳定的运行,并且性价比高,不需要消耗多余的材料。

3.3 充电主电路的设计

充电主电路图如图 3.2 所示。

图 3.2 电池充电电路图

DC/DC 变换是将直流电能(DC)转换成另一种固定电压或电压可调的直流电能,又可称成直流斩波[8]。若其输出电压较输入之电源电压低,则称为降压式(Buck ) 直流斩波器即频率调制(1)Buck 电路,若其输出电压较输入之电源电压高,则称为升压式(Boost)直流斩波器。主电路核心由图可以看出,主要由三部分组成即电感 L1,三极管区和续流二极管 D1,其也就形成了一个完整的 BUCK 降压DC/DC 转换电路;上图 Q2是具有将 PWM 信号打开变大,从而到达驱动 Q1开关管的功能。

3.4 信号采集处理电路

为了使锂电池能完成安全充电,本设计的电流取样处理电路图如下图 3.3 所示

电池电压与单片机 A/D 接口相连,通过 A/D 转换和微控制器即单片机,以获得测量的电压值得到计算处理。此次充电电流通过0.1Ω的取样电阻,产生的电压再使用 LM358,将电流取样电压放大相应的倍数后输到单片机 A/D 接口进行采集。电压检测输出电压直接进行模数转换之后被发送到 A/D 输入接口的单片机进行处理。

3.5 单片机选型

单片机型号众多,但大家熟悉了解的就那么几种类型。我们在学校接触到的也就是 C51 系列,C51 是 51 单片机 C 语言程序设计的简称,由于接触到的单片机以型号为 AT 开头的为多,所以选用了型号是 AT89C51 为此次设计的单片机。

3.6 单片机 AT89C51 介绍3.7.3 单片机 A/D 转换电路

ADC0809 是 8 位的采样分辨率,以模拟数字转换的逐次逼近原理。ADC0809 由一个 8 通道模拟开关,地址锁存器,解码器, A/D转换器。内部有一个 8 通道多路复用器,它能根据信号的地址锁存译码后,门控 8 模拟输入信号的 A/D 转换。多路开关可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用 A/D 转换器转换。数字锁存器的 A/D 转换完成三态输出锁存器,当 OE 端为高电平,可以从三态输出锁存器的数据转换。A/D 转换的数据要发送数据后,应该传给单片机进行处理。关键的问题是如何确定数据的 A/D 转换完成转移,因为只有确认完成后,可以发送。A/D 转换电路图如图 3.7 所示

ADC0809 的引脚功能及作用

IN0~IN7:8 路模拟量输入端。

2-1~2-8:8 位数字量输出端。

ADDA、ADDB、ADDC:3 位地址输入线,用于选通 8 路模拟输入中的一

路。

ALE:地址锁存允许信号,输入端,高电平有效。

START: A/D 转换启动脉冲输入端,输入一个正脉冲(至少 100ns 宽)使其启动(脉冲上升沿使 0809 复位,下降沿启动 A/D 转换)。

EOC: A/D 转换结束信号,输出端,当 A/D 转换结束时,此端输出一个高电平(转换期间一直为低电平)。

OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

CLK:时钟脉冲输入端。要求时钟频率不高于 640KHz。

REF(+)、REF(-):基准电压。

Vcc:电源(+5V)。

GND:接地。

3.7.4 按键电路

按照键盘与单片机的连接方式分为独立式键盘和矩阵式键盘[11]。独立式键盘相互独立,每个按键占用一根 I/O 口线,每根 I/O 口线上的按键工作状态对其他按键的工作状态不会产生不好作用。这种按键软件程序简单,但占用 I/O 口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。矩阵式键盘又称行列式键盘,与独立式键盘对比,单片机口线资源利用率提高了一倍。

按键接线图如图 3.8 所示。

图 3.8 按键电路图

键盘抖动的时间一般为 5~10ms,抖动现象会引起 CPU 对一次键操作进行多

次处理,从而可能产生错误,因而必须设法消除抖动的不良后果。通过去抖动处理,可以得到按键闭合与断开的稳定状态。为了准确判断闭合键的位置,要对每个按键进行编码。根据矩阵式键盘的结构,采用行扫描的键位识别方法。使某条列线为低电平,如果这条列线上没有闭合键,则各行线的状态都为高电平;如果列线上有键闭合,则相应的那条行线即变为低电平。于是就可以根据行线号与列线号计算出闭合键的键码。扫描时由第一列开始,即由 PA 口先输出 0FEH,然后由 PC 口输入行线状态,判断哪一行有键闭合,若无键闭合,再输出 0FDH 检测下一列各行键闭合状态,由此一直扫描下去。

在这个设计中,按键的数量设置为3,它们中的一个作为一个复位按钮;另一个作为电压按键,这样的设计提供3V,3.5V,4.0V,4.5V为周期的四个电压值,可以 “电压选择”键选择一个电压输出;另一个开始充电,装上一个电池为电池充电,当按下“开始充电”按钮,系统开始为锂电池充电。因此,使用一个独立的密钥的方法,它可以减少编程的难度。

3.7.5 数码管显示电路

LED 数码管组成的多个发光二极管打包在一起,以形成“8”字状的装置中,连接导线已在内部做好,只要能导致它们导出各自的笔划,公共电极。

数码管显示电路图如图 3.9 所示


 

本设计使用四位 LED 数码管数码管段加小数点为 7 或 8 个数码管,数码管有两种阴阳,本设计采用共阴极数码管,8 段 LED 阴极接地连接在一起,阳极当某一高电平时,二极管被点亮而发光,设计时允许数码管阳极的某一组合被设置高。

3.8 锂电池充电原理

锂电池充电的工作原理就是指其充放电原理。充电时锂离子由正极向负极运动而嵌入石墨层中。放电时,锂离子从石墨晶体内负极表面脱离移向正极。所以,在该电池充放电过程中锂总是以锂离子形态出现,而不是以金属锂的形态出现。一般而言电池容量指的就是放电容量。可以看到,锂电池在充放电的过程中,锂离子是存在于正极 → 负极 → 正极的运动状态。如果我们把锂电池形象地比喻为一把摇椅,摇椅的两端为电池的两极,而锂离子就象优秀的运动健将,在摇椅的两端来回奔跑。

锂蓄电池的充电特性曲线图如图 3.10 所示:

图 3.10 锂电池充电特性曲线图

为保证安全充电,对锂离子电池充电要求首先是在充电时保持电流不变,电池电压会在充电过程中渐渐升高,当电池端电压达到4.2V(4.1V),会改变充电状态,即变化为电压不变的恒压充电。电流会依照电芯的饱和程度,随着充电过程的渐渐降低,当降低到0.01CA 时,认为充电终止。大家注意,其中 C 是以电池标称容量对照电流的一种表示方法,如电池是 1000mAh 的容量,1C 就是充电电流 1000mA,注意是mA而不是mAh,0.01CA 就是 10mA。当然,规范的表示方式是 0.01C5A。

4 基于单片机的太阳能充电器系统的软件设计4.1 设计思想

首先主程序由初始化段和循环主体段两部分组成,在执行循环体时,需要一个个的调用所需的任务模块,不会直接去执行程序,其中每一个任务为一个子函数,这种机制也叫称为轮询机制。举个例子说明:就是当一个正在被主程序执行的子函数,它会自动确认其执行条件有无可行性,如果可以就执行,反之,就会返回。按键处理是以 10ms 为周期的选择一次。PWM 的控制调节不能过快,最好以 200ms 为周期,如果太快,会影响到数码管刷屏,A/D 采样速度也是一样。

子程序主要由 4 部分组成,包括初始化程序,PWM 波程序,按键采集程序,信号采集与转换程序;如果从系统表现出的功能来看,又可以分成充电子程序、电源子程序,这两程序都会用到子程序的 4 个程序。

本次设计使用的 PWM 波是可以掌控开关管的占空比,它的生成是运用了输出在低电平和高电平的转换、延时。即当输出为低电平时,将输出信号放大驱动开关管断开,反之,如果其为高电平时,开关管则会打开。开关管的占空比是通过低电平和高电平的时间的比值(即PWM 波的占空比)来控制。

本设计单片机采用 AT89C51 芯片,由于其内部没有 AD 转换模块,单片机需外接转换模块,本设计采用 ADC0809,模拟信号输入有两路,一路是电压信号,一路是电流信号。ADC0809 在对多路输入的模拟量进行模数转换时采用分时复用的方法,即 AD 转换器对两路信号轮换采集转换。轮换周期根据模数转换时间和控制的情况设定。

4.2 基于单片机的太阳能充电器系统的整体程序设计

本设计由单片机程序控制来实现整体工作,其工作过程主要为:电路启动初始化,

电路功能的选择,输出选择及确定输出,单片机集合计算输出 PWM 信号,定时采集数据及处理调节 PWM 信号占空比等,程序整体框架图如下图 4.1 所示。

图 4.1 程序整体框架流程图

4.3 基于单片机的太阳能充电器系统的子程序的设计4.3.1 电路启动初始化

初始化设置初始运行环境为单片机运行,主要完成以下任务:清理片内 RAM,

每一个微控制器上电,上电复位将导致单片机操作。在复位操作完成后,单芯片寄存器将被设置为不同的值,该值的一个相当大的部分是未知的。在微控制器的复位完成这些未知的值,正式工作后,会产生不能让程序员掌握的后果,甚至会损坏系统。因此,微控制器运行后,先设置为 0,这样的初始参数设置,方便编程人员掌握,以方便系统的工作。设置系统运行所需的参数,设置定时器和中断设置。初始化程序流程图如下图 4.2 所示。

图 4.2 初始化程序流程图

4.3.2 按键采集程序

键盘子程序用于检测开关,是否在有效的开关状态来决定是否启动系统运行。读线、读取、连接到该端口,它的值存储处理后确定相关的缓存。看完端口在其中做了一定的延迟,以排除引起的误动作键晃动。按键子程序结构流程图如图 4.3 所示。

图 4.3 按键子程序结构流程图

4.3.3 数据采集及模数转换程序

数据收集主要是由单片机控制 ADC0809 来完成,该方案分为数据初始化,发送一个命令到开始转换,等待转换结束,接收数据,处理且存储在缓存中,程序流程如图 4.4 所示。

图 4.4 数据采集子程序结构流程图

4.3.4 数码管显示子程序

开机时,先让数码管初始化,通过串口为“0”字形码输出使数码管显示“O”。然后来确认按键是否被按下,如果没有键被按下继续确认。

显示子程序时要先初始化串口,以致串口工作会显示在方式 0,以便读取显示缓冲区的数据(其用来存储数据也就是将被显示出来的数据),然后找到通过字形码查表相应的方式,再将字形码写入串口寄存器 SBUF 通过串口方式 0 发送出去显示。子程序是如何显示在缓冲区中的数据转换成相应的字形码呢?具体方法是,从小型字形码到每一位十六进制数到大的顺序固定区域,以便存储在表单中显示出来码表的记忆。当要显示的字符,该表的起始地址到数据指针 DPTR 寄存器为基地,在显示缓冲区中的数据作为偏移到索引寄存器 A,查表“MOVCA,@ A + DPTR“,在取出相应数字的字形码其是通过累加器 A 得到的结果。

4.3.5 充电子程序的设计

充电过程分两阶段进行,第一阶段为预充电,充电电流以0.01CA的小电流进行充电;第二阶段,当充电电压达到3V时转入第二阶段(一般认为三分钟后电池电压大于 3V),以0.5CA的电流进行恒流充电方式,。电流降到小于0.01CA时,表明电池已充到额定容量,如果继续充下去,充电电流会慢慢降低到零,电池完全充满[4]。充电过程中,“充电”指示灯亮;充满时,“充饱”指示灯亮,“充电”指示灯灭,通过按键设置可控制充电时间。充电子程序流程图如图 4. 5 所示。


4.3.6 电源子程序的设计

与传统的手机充电器相比,本次设计的太阳能手机充电器最大的优点是不仅能够为电池直接充电,也可用作一般直流电源。该系统存在并且可以有3V,3.5V,4V,

4.5V 四种电压输出,这可以用来选择一个按钮作为输出电压。直流输出可直接给手机充电,或作为电源等小型电子设备,如 MP4。输出电压可以是一个数字显示,以及完善一个过流保护作用,以确保能安全使用的电子产品。

电源程序流程图如图 4.6 所示。

图 4.6 电源子程序结构流程图

5 仿真与调试5.1 充电电路仿真

总所周知 buck 斩波电路中调整输出电压值的变化是由控制开关管开通与关断时间控制, multisim 仿真电路如下图 5.1 所示

图 5.1 电压检测仿真图

5.2 电流采样处理电路仿真

上面提出将电流采样电压是采用 LM358 电路让其放大到相应倍后再输送到单片机的 A/D 接口,输入的电压是 5V 时,输出时的电压则为 125V,这样就能看出其电路所具有放大多少倍(计算可得 21 倍)的功能。如下图 5.2 所示

图 5.2 电流采样处理电路仿真图

5.3 系统做直流电源使用时电路仿真图

Protues 软件因为不存在太阳能电池模拟模块,所以在仿真时我们把稳压输出电压值用直流电源电压为 5V 的来更换,当数字到达3时,表示充电已经完成。按复位键会显示0,点开始键表示开始充电。整体电路仿真图如下图 5.4 所示

图 5.3 整体电路仿真图

5.4 系统做充电器使用时仿真结果

充电器在运行过程中它会随着充电的进行,充电电压会渐渐升高,指示灯会从0

逐渐变成3,此过程可表示充电从开始到结束。仿真结果如下图 5.4、5.5、5.6 所示。

图 5.4 充电过程仿真

图 5.5 充电过程仿真

图 5.6 充电过程仿真

总结与展望

时光飞逝,离开大学的日子也渐渐向我们走来,随之而来的毕业设计也即将完成。通过一段时间的努力,我的毕业设计的任务终于结束了。毕业设计是对我们整个大学期间学习的一次总结性的检验,通过设计的过程能检验我们大学期间的基础理论学习是否扎实,各种知识间的结合是否灵活,能否严格,全面,系统的结合所学的知识解决实际的问题。经过此次毕业设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。根据本次设计方案,我设计了一个由单片机控制的充电器,在充电过程中我们会看到方形波带宽会逐渐变宽,并且会显示出“1”,“2”,“3”数字,在充电完成后波形消失,显示成一条直线,我设置了一个复位键,当我按下键时,它会重新充电。

本次设计能初步完成以上功能,但设计不足之处很多。主要表现在以下几点:第一、本此设计显示模块采用了数码管,不如采用液晶显示,硬件电路简单,能省去一些 I/O 口来实现更多的功能。第二,没有采用温度检测,一般快速充电电流会比较大,在不超过允许充电电流的情况下,电池温度也会升高,若能加温度监测模块,当温度超过允许值时,终止充电会减少因温度过高给电池带来的危害。第三、没有采用电能存储装置,不能存储电能备天气状况不好并且没有市电的情况使用,若有电能存储功能,可以将系统闲置时太阳能电池板转化的电能存储起来,作为电源给别的用电设备使用,这样可以即方便又节能环保。能源的日益紧张,太阳能电池板、充放电控制器、蓄电池等构成的产品都有了相对成熟的发展,相信不久之后太阳能手机充电器的应用将会变得普遍[9]。


附录A 整体电路图

单片机源程序如下:

  1. #include              <reg51.h>
  2. #define uchar unsigned char
  3. #define uint              unsigned int
  4. sbit              P3_3=P3^3;
  5. //开始充电
  6. sbit              P3_4=P3^4; sbit              PWM=P3^5;
  7. //电压切换
  8. sbit EOC=P3^1;
  9. //定义 ADC0808 的控制引脚/
  10. sbit OE=P3^0; sbit START=P3^2; sbit P3_6=P3^6; sbit P3_7=P3^7; sbit wela=P2^1; sbit dula=P2^0; uchar              time=0,time1=0; uchar              period=40; uchar              high=6,high1=12; uchar              th0=0; uchar              tl0=1; uchar              i=0,j=0;
  11. uint x,z,n; uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  12.               //uchar              n=0;
  13. //uchar flag1;
  14. //unsigned char volatile g_delay_count;
  15. uchar disp[4]={0,0,0,0};              //显示数据,保存段码,四位/ //================================/ void delay(uchar z)              //100us 延时子程序/
  16. {
  17. while(z--);
  18. }
  19. //==============================/
  20. void display()              //定义显示子函数/ 可以使用锁存器实现
  21. { for(n=0;n<4;n++) { P0=0x00; dula=1;
  22. P0 =disp[1];              //显示第一位小数
  23. dula=0; wela=1; P0=0xfb; wela=0; delay(2); P0=0x00; dula=1;
  24. P0=disp[2]; dula=0; wela=1; P0=0xfd; wela=0; delay(2); P0=0x00; dula=1;
  25. //显示第二位小数
  26. P0 =disp[3];              //显示第三位小数
  27. dula=0; wela=1; P0=0xfe; wela=0; delay(2); P0=0x00; dula=1; P0 =disp[0]+0x80; dula=0; wela=1; P0=0xf7; wela=0;
  28. delay(2);
  29. }
  30. }
  31. //===============================/
  32. uint ADC0808()              //定义 ADC0808 读入数据子函数,并通过函数返回/
  33. { uchar d ; uchar value;
  34. START=1;START=0;
  35. //启动 ADC0808,开始 A/D 转换/
  36. while(!EOC); OE=1;
  37. if(time1<high1)
  38. //等待 ADC0808,转换结束,即 EOC 为高电平/
  39. {d=P1;
  40. //读入数据/
  41. if(high1==16)
  42. { value=0.4*d;
  43. } else if(high1==20)
  44. { value=0.5*d;
  45. } else if(high1==24)
  46. { value=0.6*d; } else if(high1==28)
  47. { value=0.7*d;
  48. } else if(high1==32)
  49. { value=0.8*d;
  50. } else if(high1==36)
  51. { value=0.9*d;
  52. }
  53. }              //允许 ADC0808 输出数据 / if(time<high)
  54. {d=P1;              //读入数据/
  55. if(high==8)
  56. { value=0.2*d;
  57. } else if(high==10)
  58. { value=0.25*d;
  59. } else if(high==12)
  60. { value=0.3*d;
  61. } else if(high==14) { value=0.35*d; } else if(high==16)
  62. { value=0.4*d; } else if(high==18)
  63. { value=0.45*d; } else if(high==20)
  64. { value=0.5*d; } else if(high==22)
  65. { value=0.55*d; } else if(high==24)
  66. { value=0.6*d; } else if(high==26)
  67. { value=0.65*d; } else if(high==28)
  68. { value=0.7*d;
  69. }
  70. else if(high==30)
  71. { value=0.75*d;
  72. } else if(high==32)
  73. { value=0.75*d;
  74. } else if(high==34)
  75. { value=0.8*d;
  76. } else if(high==36)
  77. { value=0.85*d;
  78. }
  79. }
  80. OE=0;
  81. //禁止 ADC0808 数据输出/
  82. return value;
  83. //返回 A/D 转换数据/
  84. }
  85. //=================================/ void convert(uint x)              //定义显示码转换子函数/
  86. { uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 定 义
  87. 0~9 显示码/ x=x*1.0/255*5000;              // 处理数据使其在 0~5v 范围内/ disp[3]=dispcode[x%10];              //第三位小数,最低位/ disp[2]=dispcode[x/10%10]; //第二位小数/ disp[1]=dispcode[x/100%10];              //第一位小数/ disp[0]=dispcode[x/1000];              //整数部分/
  88. }
  89. void
  90. {
  91. timer0()              interrupt
  92.               1              using              1
  93. TH0=0xff; TL0=0xf6; time++;
  94. /*定时器初值重装载*/
  95. if(time==high)
  96. /*高电平持续时间结束,变低*/
  97. {              PWM=th0;
  98. /*经过反相器反相*/
  99. }
  100.               else              if(time==period)              /*周期时间到,变高*/
  101.               {              time=0;
  102.               PWM=tl0;              /*经过反相器反相*/
  103. }
  104. }
  105. void
  106. {
  107. timer1()              interrupt
  108.               3              using              3
  109. TH1=0xff; TL1=0xf6; time1++;
  110. /*定时器初值重装载*/
  111. if(time1==high1)
  112. /*高电平持续时间结束,变低*/
  113.               {              PWM=th0;
  114. /*经过反相器反相*/
  115. }
  116.               else              if(time1==period)              /*周期时间到,变高*/
  117.               {              time1=0;
  118.               PWM=tl0;              /*经过反相器反相*/
  119. }
  120. } void main()
  121. {
  122.               OE=0;              //ADC0808 初始化/
  123. START=0;
  124.               EOC=1;              //将单片机的引脚(EOC 输入端)置成输入状态/
  125. P3_3=0; P3_4=0;
  126. P3_6=1;
  127. P3_7=1;
  128.               TMOD=0x11;              /*定时器 0 方式 1*/
  129. TH0=0xff;
  130. TL0=0xf6;
  131. ET0=1;
  132. /*定时器装载初值,设置脉冲信号的占空比为 1/5*/
  133. //
  134. TR0=1;
  135. TH1=0xff;
  136. /*定时器装载初值,设置脉冲信号的占空比为 1/5*/
  137. TL1=0xf6;
  138. ET1=1;
  139. //              TR1=1;
  140. while(1)
  141. { if(P3_3==1)
  142. {
  143.               EA=1;              /*开 CPU 中断*/
  144. TR0=1;
  145. TR1=0;
  146. P3_4=0; du: for(i=0;i<14;i++)
  147. {
  148. P3_7=1; high1=0;
  149. high=high+2; for(j=0;j<5;j++)
  150.               {              P3_6=0;
  151.               convert(ADC0808());              //每 1s 启动 A/D 转换一次,把读入数据转换
  152. 为显示数据/
  153. display();
  154.               delay(10);              //              调用显示子函数/
  155. }
  156. } if(high==34)
  157. {
  158. P3_6=1;
  159. P3_7=0; delay(100);
  160. TR0=0;
  161. }
  162. }
  163. if(P3_4==1)
  164. { TR0=0;
  165. TR1=1;
  166. P3_6=1; EA=1; high1=high1+4; if(high1==40) high1=16; if(P3_3==1) {P3_7=1; goto du;
  167. } while(P3_4!=0)
  168. {};
  169.               convert(ADC0808());              //每 1s 启动 A/D 转换一次,把读入数据转换为显
  170. 示数据/ display();              // 调用显示子函数/
  171. }
  172.               convert(ADC0808());              //每 1s 启动 A/D 转换一次,把读入数据转换
  173. 为显示数据/
  174.               display();              // 调用显示子函数/
  175. }
  176. }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/332910.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaEE—图书管理系统(基础代码版)

前言&#xff1a; 本篇博客是集合了javaEE所学的知识构建的一个基础框架&#xff0c;讲述着面向对象的过程是如何做到多对象交互协作完成框架的构建的。利用了数组&#xff0c;接口&#xff0c;类和对象&#xff0c;抽象类&#xff0c;Object类等知识来完成。 后续会加入数据…

BGP选路实验

编写实验报告&#xff1a; 1、拓扑信息 2、要求及分析 3、配置命令 4、测试 1、拓扑信息 2、要求及分析 1、使用preval策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4…

嵌入式UI开发-lvgl+wsl2+vscode系列:1、资料收集以及Windows下WSL2模拟环境运行示例demo

文章目录 一、前言二、资料收集三、Windows下WSL2上编译运行lvgl的demo程序1、lvgl简介2、lvgl特性3、配置要求4、Windows下vscodewsl2模拟环境搭建4.1、安装vscodewsl24.2、下载获取项目&#xff1a;4.3、安装显卡驱动4.4、下载lvgl并编译运行示例demo 四、最后 一、前言 UI界…

leetcode437 路径总和III-哈希表+前缀和

题目 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节…

专为汽车内容打造的智能剪辑解决方案

汽车内容创作已成为越来越多车主和汽车爱好者热衷的活动。然而&#xff0c;如何高效、便捷地将行车途中的精彩瞬间转化为高质量的视频作品&#xff0c;一直是困扰着广大用户的一大难题。美摄科技凭借其深厚的视频处理技术和智能分析能力&#xff0c;推出了专为汽车内容记录而生…

探索python循环逻辑的魅力:从无限到有限

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;循环逻辑的初步认识 二、无限循环&#xff1a;持续运转的引擎 三、有…

JavaWeb-JS

目录 学习重点 什么是 JavaScript? Web标准 JS的引入方式 JS的基本语法 JS的函数 JS的对象 JS事件监听 学习重点 js 引入方式 js 基础语法 js 函数 js 对象 js 事件监听 什么是 JavaScript? Web标准 Web 标准也称为网页标准 &#xff0c;由一系列的标准组成&#xff0…

安泰电子:功率放大器的选择方法有哪些

选择适合的功率放大器是实现电子系统中的关键步骤之一。以下是一些选择功率放大器的常用方法和考虑因素&#xff1a; 功率需求&#xff1a;首先确定你的系统需要多大的功率输出。功率输出需求通常由被驱动设备的功率要求决定。计算出所需功率后&#xff0c;选择一个具有适当功率…

Java数组详解

Java数组详解 &#x1f4da; Java数组详解&#xff1a;一篇文章搞懂Java中的数组知识摘要引言1. 数组的定义与创建&#x1f4e6;1.1 数组的定义1.2 数组的创建及初始化数组不进行初始化时的默认值 2. 数组的遍历&#x1f50d;2.1 使用for循环2.2 使用增强for循环2.3 使用Arrays…

斐讯N1刷OpenWRT并安装内网穿透服务实现远程管理旁路由

文章目录 前言1. 制作刷机固件U盘1.1 制作刷机U盘需要准备以下软件&#xff1a;1.2 制作步骤 2. N1盒子降级与U盘启动2.1 N1盒子降级2.2 N1盒子U盘启动设置2.3 使用U盘刷入OpenWRT2.4 OpenWRT后台IP地址修改2.5 设置旁路由&无线上网 3. 安装cpolar内网穿透3.1 下载公钥3.2 …

wordpress主题给网站增加一个版权声明区块代码分享

在数字化时代&#xff0c;网络上的信息传播变得越来越便捷&#xff0c;给人们生活和工作带来了极大的便利。然而&#xff0c;在这个过程中也产生了很多版权问题。为了更好地保护自己的版权&#xff0c;许多网站开始在其网页上添加版权声明。本文将探讨在网站上添加版权声明的重…

scala完整笔记-5万字一周入门到精通系列(一)

scala完整笔记-5万字一周入门到精通写在开篇 1.scala学习前一定要具备了解一些java基本知识&#xff0c;无需精通&#xff1b;如果从未接触java&#xff0c;最好熟悉一门编程语言&#xff0c;否则相对还是学习起来相对吃力且很难学懂 2.本篇主要以代码示例为主&#xff0c;很多…

亲测使用frp获得访问者真实ip

怎么访问都只有127.0.0.1这个内网ip,获取不到访问者的真实ip 1.打开frp的配置文件(一般是frpc.toml&#xff0c;无需设置frps.toml) 在每一个tcp协议中添加 transport.proxyProtocolVersion "v2" 实例&#xff1a; # frpc.toml [[proxies]] name "web" …

1小时从0开始搭建自己的直播平台(详细步骤)

本文讲述了如何从0开始&#xff0c;利用腾讯云的平台&#xff0c;快速搭建一个直播平台的过程。 文章目录 效果图详细步骤准备工作第一步&#xff1a;添加域名并检验cname配置1.先填加一个推流域名2. 点击完下一步&#xff0c;得到一个cname地址3. 将cname地址&#xff0c;配置…

路径规划 | 图解粒子群(PSO)算法(附ROS C++仿真)

目录 0 专栏介绍1 从鸟群迁徙说起2 粒子群算法基本概念3 粒子群算法流程4 粒子群算法ROS实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#xff1b;局部规…

类和对象【六】友元和内部类

文章目录 友元友元的作用友元的缺点友元函数语法&#xff1a;特点&#xff1a; 友元类语法&#xff1a;特点&#xff1a; 内部类概念特点 友元 友元的作用 友元提供了一种打破封装的方式&#xff0c;有时提供了便利。 友元的主要作用就是打破封装 即可以让一个类的友元函数…

每日一题24:数据操作之第N高的薪水

一、每日一题 表: Employee ------------------- | Column Name | Type | ------------------- | id | int | | salary | int | ------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都包含有关员工工资的信息。查询 Employee 表中第 …

C#--SVG矢量图画法示例

1.代码示例 <Viewbox Grid.Column"1" Grid.ColumnSpan"1" Grid.RowSpan"1" ><Path Name"ValveShape" Stroke"Black" Data"M 50,0 L 150,200 L 50,200 L 150,0 Z" Width"200" Height"…

5、xss-labs之level6

一、level6-----大小写绕过 1、测试分析 测试了之前用过的payload&#xff0c;发现都不行&#xff0c;并且level4使用的Java伪协议也不行&#xff0c;可以得出<>、script、onclick都被过滤 2、构造payload 因为href被过滤&#xff0c;可以试一下大写HREF 初试payload…

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能

前端Vue自定义顶部搜索框&#xff1a;实现热门搜索与历史搜索功能 摘要&#xff1a; 随着前端开发复杂性的增加&#xff0c;组件化开发成为了提高效率和降低维护成本的有效手段。本文介绍了一个基于Vue的前端自定义顶部搜索框组件&#xff0c;该组件不仅具备基本的搜索功能&am…