文档说明本文档用at89s52单片机,通过c语言编程实现了

上传人:ldj****22 文档编号:31727005 上传时间:2018-02-09 格式:DOC 页数:37 大小:2.20MB
返回 下载 相关 举报
文档说明本文档用at89s52单片机,通过c语言编程实现了_第1页
第1页 / 共37页
文档说明本文档用at89s52单片机,通过c语言编程实现了_第2页
第2页 / 共37页
文档说明本文档用at89s52单片机,通过c语言编程实现了_第3页
第3页 / 共37页
文档说明本文档用at89s52单片机,通过c语言编程实现了_第4页
第4页 / 共37页
文档说明本文档用at89s52单片机,通过c语言编程实现了_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《文档说明本文档用at89s52单片机,通过c语言编程实现了》由会员分享,可在线阅读,更多相关《文档说明本文档用at89s52单片机,通过c语言编程实现了(37页珍藏版)》请在金锄头文库上搜索。

1、文档说明:本文档用 AT89S52 单片机,通过 C 语言编程实现了 PWM 脉宽调制的功能,用于给 DC-DC 电路实现稳定可调的电源。一程序结构说明:本程序是基于单片机 C 语言编写的,经过 uVision2 编译通过,主要实现单片机操作,运算和输出等方面的功能。整体框架图 7.4 所示:图 7.4 软件整体框架图共分为以下几个部分:(1) 主控制板块(2) 按键扫描与解释板块(3) 显示驱动板块(4) PWM 计算与输出板块(5) 手动修正模块(6) 反馈和自动修正模块1.1 软件各部分结构说明1.1.1 主控制模块Main 程序主要实现程序的初始化操作和总体控制,它的图 7.5 如下:

2、M a i n系统初始化数码管译码5 m s 中断( 三大作用 )P W M 输出中断图 7.5 Main 程序框架图系统初始化主要包括以下六部分:(1) 单片机系统初始化初始化 P1,P3 口,常将这两个口先置 oxff。(2) 中断工作寄存器初始化设置 IE,IP 等特殊寄存器,用于开启两个定时器。(3) 定时器工作寄存器初始化设置定时器定时长度。对于定时器 0 设置为 5ms,而对于定时器 1 先设置为1ms, 随后程序会自动根据占空比的改变而变化。(4) 开定时器,定时器中断允许(a) 定时器 0 用于 5ms 中断。 按键判断和解释 反馈采样和反馈控制 显示驱动(b)定时器 1 用于

3、输出 PWM 波形。5 m s 中断反馈采样和反馈控制按键判断和解释显示驱动图 7.6 5ms 中断框架图(5) 全局变量赋初值(6) 拟合二次函数系数设定(a) 占空比与期望电压之间的二次关系曲线系数(b) ADC 反馈值与期望电压之间的二次关系曲线系数由于数码管译码牵涉到多种状态,因此需要同时考虑以下两个方面:(1) 三位有效数字输出和四位有效数字输出的切换(2) 特殊情况下数码管输出特殊字符的显示1.1.2 按键扫描及解释模块在系统运行中,不断扫描按键,以判断用户是否有任何输入指示,这部分工作主要是在 5ms 中断中完成。一旦用户有按键操作,系统将做出判断,给予按键解释,执行相应的命令。

4、但是值得注意的是任何按键都有可能有抖动的现象,因此软件中必须含有消抖程序。本按键程序实际上是按键三种状态的切换:状态 0:键放开状态 1:键按下01 2状态 2::键长按 3s图 7.7 按键循环图当前状态 下一状态 转移条件 转移步骤1 键按下00 Else0 键放开 发消息到主控制程序2 长按 3s11 Else0 键放开 发消息到主控制程序22 Else表 7.1 按键说明表格( 以上图和表格转载自上海交通大学电子工程系科技创新课讲义,版权归袁焱老师所有,本文引用已经征得原作者同意)本软件中共有四个键需要控制,分别为 k1,k2,k3,k4,其中 k2,k3,k4 主要控制输入电压值各位

5、,十分位,百分位的数值增减,因此只有状态 0 和状态 1,可以用一套子程序来执行按键操作和解释。而 k1 主要涉及软件状态的切换,具有三个状态,因此需单独使用一套子程序。switch ( key_state0 ) / k1 键的三种状态判断case 0: key0_pr0 (); break;case 1: key0_pr1 (); break;default: key0_pr2 (); break;switch ( key_state3 ) / k2,k3 ,k4 键的两种状态判断case 0: key_pr0 (1, KEY1); break;default: key_pr1 (1, KE

6、Y3); break;对于 k1 的各种情况,需要另外编写三个子程序。void key0_pr1 () / 状态 1Save The Data;if ( IfSameTen (0) / k1 长按 3sTransfer to State 2; else if ( IfSameThree (0) & ( KEY0 = 1 ) / k1 放开Transfer to State 0; void key0_pr0 () / 状态 0Save The Data;if ( IfSameThree (0) & ( KEY0 = 0 ) / k1 按下Transfer to State 1;if (是在手动修

7、正模式下)存储修正值当三个修正值存储完毕解三元一次方程自动修正else / 用户在设置电压值的模式下计算占空比;return;void key0_pr2 () / 状态 2Save The Data.if ( IfSameThree (0) & ( KEY0 = 1 ) / k1 放开Transfer to State 0;return;对于 k2,k3,k4,只要另外定义一套子程序,删除状态 2,并重新定义新的按键解释即可。本软件中定义的解释为,每次按 k2,k3,k4 键分别使所对应的个位,十分位,百分位加 1,但是考虑到用户操作方便的原因,本软件不采用进位制,即当当前设定值位为5.69V

8、 时,再按 k4,设定值变为 5.60V。本软件将每次按键的状态存储在一个专门的数组中,每个键一个数组,共计四个数组和指针,以用来完成消除抖动和判断是否长按 3s 的功能。伪代码中用到了以下两个函数,主要实现以上所要求的功能。bit IfSameTen ( unsigned char n );bit IfSameThree ( unsigned char n );其中 n 表示所对应的键。对于 IfSameTen 函数,在这里设置的目的主要是为了判别是否长按 3s。每隔 5ms 扫描按键一次,将最近的 200 次状态存储在专用数组中,当 200 次状态均为按下时,则表示已经进入长按状态,切换到

9、状态 2。如下图所示,由于硬件系统板是 0 有效,我们在下图所画的 0 表示按键按下有效,而并非前面所指的状态 0。事实上本软件只判断了200ms51s 的状态,但考虑到程序调用延时和按键延时等多方面原因,实际上测下来需要经过 23s 时间后才能切换到状态 2。图 7.8 长按建盘实现说明图( 注:由于硬件系统板是 0 有效,这里的 0 表示按键按下有效,而并非前面所指的状态 0。 )对于 IfSameThree 函数,在本程序里的主要目的是消除抖动。由于是机械按键,不可避免的是当按键从按下状态变为放开状态后,机械键还会上下抖动多次,如果不加识别的话,程序可能误以为这是用户又一次按键指令,进行

10、错误的指令解释。区分是用户输入还是抖动所致的方法很简单:如果是用户输入的话,考虑到人的反应问题,连续 3 次所扫描到的按键状态必须一致(即连续 15ms 内,按键不切换状态);而若是抖动的话,则连续3 次状态必然不一致。下面我们用图示法说明,注意图中所表明的 0 依然是 0 有效,而并非是指状态 0。反之 1 并非是指状态 1,而表示键已经松开。表示键已经按下:图 7.8 长按建盘实现说明图( 注:由于硬件系统板是 0 有效,这里的 0 表示按键按下有效,而并非前面所指的状态 0。 )表示键已经放开:图 7.9 按建实现说明图( 注:由于硬件系统板是 0 有效,这里的 1 表示按键松开无效,而

11、并非前面所指的状态 1。 )抖动状态:1 1 0 1 0 10 0 1 0 1 01 0 0 0 1 1图 7.10 抖动状态说明图因此只要判断连续 15ms 内只要键的状态一致,即可消除抖动。1.1.3 显示驱动模块系统硬件所限,四个数码管不能每次同时驱动,而只能使扫描驱动指针值从 1 到 4 重复变换,每 5ms 间隔对一个数码管进行驱动, 20ms 一个轮回。由于时间足够短,人的肉眼不可分辨,因此看上去四个数码管始终是亮着的。这就完成了数码管驱动任务。流程图如图 7.11 所示:决定驱动哪一个数码位驱动第 1 个数 码 管, 显示 d i g i 1 相应的数码驱动第 2 个数 码 管,

12、 显示 d i g i 1 相应的数码驱动第 3 个数 码 管, 显示 d i g i 2 相应的数码驱动第 4 个数 码 管, 显示 d i g i 3 相应的数码图 7.11 数码驱动原理图if (+digi_scaner=5) digi_scaner = 1;switch (digi_scaner)case 1: /* 驱动第一个数码管 */output_sel |= 0x01;case 2: /* 驱动第二个数码管 */output_sel |= 0x02;case 3: /* 驱动第三个数码管 */output_sel |= 0x04;case 4: /* 驱动第四个数码管 */ou

13、tput_sel |= 0x08;;ADDR_SEL = output_sel; /*输出到锁存器 U6*/1.1.4 PWM 计算与输出模块为了输 PWM 波,本程序中添加了另外一个定时器(interrupt 3)中断来控制 PWM 波的占空比。每次用户重新输入期望电压值后,先通过解一元二次方程来确定占空比(注:期望电压值与占空比之间的二次关系详见附录的专题报告,在此不再展开说明。),随后修改定时器长短来输出新的 PWM 波形。具体流程图如下,实际上 PWM 波形就是两种状态之间的互相切换。初始状态设置 s t a t e = 1 , 输出H i g h , 定时常数设置为 T HS t a

14、 t e = 1设置 s t a t e = 2 , 输出L o w , 定时常数设置为 T LS t a t e = 2设置 s t a t e = 1 , 输出H i g h , 定时常数设置为 T H图 7.12 PWM 波形实现说明图1.1.5 手动修正模块由于温漂等不定因素存在,输出的实际值往往经过一段时间后将偏离输入的期望值,此时需要修正二次曲线各项系数。有两种方法可以实现此功能:(1)直接在程序中修正系数。但是此方法必须重新记录 50 个数据,通过 Origin 软件进行二次曲线的拟合,因此此方法较为繁琐。况且,对于一般用户而言,只是使用该硬件系统,并进行最基本的操作,根本不可能

15、了解内部实现方式,而且大多数用户手中并没有曲线拟合软件。所以,此方法是下下之策。(2)计算机自动修正。通过设定三个实际输出值来恢复二次曲线的系数。具体算法如下:(a)改变设定电压值,分别在实际输出为 5V,7.5V ,9.9V 时,记录所对应的占空比和所设置的电压值,存储在一个数组中,计为1,2,3,Vout1,Vout2,Vout3。(b)设原二次曲线为 (*)cbaVout *2而新二次曲线为 (*)newnenewcbaV*2令 newoutne Vvpcbpap ,则由(*) (*),得到:cpbapv3232121*已知 1,2,3,vp1,vp2,vp3,则通过解三元一次方程可以确定 ap, bp, cp, 进而确定新的系数 ,即可。newneca,另外对于解三元一次方程,可以通过矩阵法来求,算法最优化,如: 1/13232vpabp, cp 可以通过类似矩阵法求得,在此不再详述。此模块也是在一个 5ms 中断内完成的。为了方便用户从普通设置电压系统切换到手动修正系统,系统定义了 k1 键,即在 k1状态 0 中,若连续 200 个键盘扫描点相同,即长按 3s,则进入手动修正模块。另外为了让数码管显示一目了然,在设定 5.00 V,7.50 V,9.90 V 这三个精确值时,数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号