基于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. }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++多态总结与原理、菱形继承问题

文章目录 多态什么是多态 多态的定义及实现多态的构成条件虚函数 虚函数的重写虚函数重写的两个例外协变 重写C11 override 和 final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承小结 多态的原理虚函数表多态的原理动态绑定与静态绑定 单继承和多继承关…

数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记…

IC解析之TPS1HB08-Q1

目录 1.主要参数2. 接口定义3. 工作原理分析高低边驱动的作用TPS1HB08-Q1架构TPS1HB08-Q1典型应用电路参数设置 4.总结 1.主要参数 2. 接口定义 其中&#xff0c;不同的IC版本在故障反馈引脚有所差异&#xff0c;A/B版本则为ILIM功能&#xff0c;F版本则为FLT功能&#xff0c;两…

GpuMall智算云:QwenLM/Qwen1.5/Qwen1.5-7B-Chat

Qwen 是阿里巴巴集团 Qwen 团队的大型语言模型和大型多模态模型系列&#xff0c;现在大型语言模型已经升级到 Qwen1.5 版本。 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 无论是语言模型还是多模态模型&#xff0c;都在大规模的多语言和多模…

【Python】 从Python列表中获取唯一值

基本原理 在Python中&#xff0c;列表是一种非常灵活的数据结构&#xff0c;它允许存储不同类型的元素。然而&#xff0c;有时我们可能需要从列表中提取唯一的值&#xff0c;即去除重复的元素。这在处理数据集或进行数据分析时尤其有用。Python提供了几种方法来实现这一目标。…

甘肃省大学生志愿服务西部计划报名流程及免冠证件照处理

在甘肃省&#xff0c;大学生志愿服务西部计划是一项旨在鼓励和引导大学生参与西部地区社会服务与发展的重要项目。随着2024年报名季的到来&#xff0c;许多有志青年正准备投身这一有意义的事业。本文将详细介绍报名流程&#xff0c;并提供免冠证件照的处理技巧&#xff0c;帮助…

人工智能——什么是摩尔定律以及它如何影响人工智能?

1. 概述 摩尔定律是现代技术发展中一个至关重要的基石。它预言了微芯片上晶体管的数量大约每两年翻一番&#xff0c;这一现象导致了计算能力的指数级增长。在过去的50多年里&#xff0c;这一定律一直是推动技术进步的强大动力&#xff0c;并且对人工智能领域产生了深远的影响。…

市面上前 11 名的 Android 数据恢复软件

Android数据恢复软件是恢复无意中删除的文件或文件夹的必要工具。该软件还将帮助您恢复丢失或损坏的信息。本文介绍提供数据备份和磁盘克隆选项的程序&#xff0c;这些选项有助于在Android设备上恢复文件的过程。 如果您正在寻找一种有效的方法来恢复图像&#xff0c;文档&…

宝塔Nginx设置图片访问跨域

宝塔Nginx设置图片访问跨域 针对某一个站点设置 找到对应的站点点击 “设置” 增加对应header设置 代码&#xff1a; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${#允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requeste…

解密MySQL中的临时表:探究临时表的神奇用途

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解密MySQL中的临时表&#xff1a;探究临时表的神奇用途 前言临时表的定义与分类创建与使用临时表临时表的操作与管理优化与性能提升注意事项与最佳实践 前言 在数据库管理中&#xff0c;临时表是一个…

Kali的基本扫描命令

nmap -sP 192.168.10.0/24 //扫描10网段存活的主机 nmap -P 192.168.10.142 //扫描主机开放的端口 nmap -sS 192.168.10.142 //TCP半开扫描 nmap -sT 192.168.10.142 //TCP全开扫描 nmap -O 192.168.10.142 //扫描靶机的操作系统类型 nmap -sV 192.168.10.142 //扫描开放端口对…

记一次绕过宝塔防火墙的BC站渗透

0x00 信息收集 由于主站存在云waf 一测就封 且初步测试不存在能用得上的洞 所以转战分站 希望能通过分站获得有价值的信息 这是一个查询代理帐号的站 url输入admin 自动跳转至后台 看这个参数 猜测可能是thinkCMF 0x01 getshell thinkcmf正好有一个RCE 可以尝试一下 ?afetc…

和可被k整除的子数组 ---- 前缀和

题目链接 题目: 分析: 补充知识 1. 同余定理: (a-b) % p 0即a-b能被p整除, > a % p b % p 2. c, java中 [负数 % 正数] 的结果是负数, 想要得到正确结果 > (a%pp)%p这道题和<和为k的子数组>类似, 利用前缀和的思想, 计算以i结尾的所有子数组, 前缀和为sum[i] …

React项目知识积累(四)

1.useMemo( ) 在 React 中&#xff0c;useMemo 是一个 Hook&#xff0c;用于记忆计算结果&#xff0c;只有当依赖项之一发生变化时&#xff0c;才会重新计算。这有助于避免不必要的计算和渲染&#xff0c;从而提高应用程序的性能。 基本语法如下&#xff1a; const memoized…

【ai】pycharm安装langchain 相关module

pycharm module install 【Python学习 】一篇文章教你PyCharm如何快速安装module 【python】pycharm如何安装python的模块包版本 2024.1.2 RC2 找到当前的虚拟项目 找到解释器 我现在配置为专门为openai-start 准备的3.10 版本+ 号可以找到模块

linux经典定时任务

在使用时记得替换为自己的脚本路径。请在相应的脚本第一行加上#!/bin/bash&#xff0c;否则脚本在定时任务中无法执行。 1、在每天凌晨2点执行 0 2 * * * /bin/sh bashup.sh 2、每天执行两次 下面的示例命令将在每天上午5点和下午5点执行。您可以通过逗号分隔指定多个时间戳…

基于双差分值和RR间隔处理的心电信号R峰检测算法(MATLAB R2018A)

心电信号中的R峰是确定心率和节律、以及检测其它波形特征点&#xff08;图1A&#xff09;的基础。R峰的准确检测是心率变异性分析、心拍分割和心律失常识别重要的处理步骤。 现有的心电信号R峰检测方法主要为基于规则的决策法和基于深度学习的检测方法。基于规则的决策法通常对…

全域运营平台的优缺点各有哪些?听听使用者怎么说!

作为多个创业者交流群内的热点话题&#xff0c;关于全域运营平台优缺点的分析和点评不断涌现&#xff0c;为许多创业者更多信息的同时&#xff0c;也让他们的选择过程变得非常艰难。而在众多的全域运营平台中&#xff0c;被分析和点评次数最多的&#xff0c;当属全域运营平台。…

Excel分类汇总,5个做法,提高数据处理效率!

在日常的工作中&#xff0c;我们经常需要使用Excel中的各种功能&#xff0c;Excel分类汇总功能无疑是数据分析和报告制作中的一把利器&#xff0c;它极大地提高了数据处理的效率和准确性。在现代商业环境中&#xff0c;数据无处不在&#xff0c;而如何从这些数据中提取有效信息…

勇于创新,勤于探索 —— 我的创作纪念日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…