- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
文档说明本文档AT89S52单片机,通过C语言编程实现了
文档说明:本文档用AT89S52单片机,通过C语言编程实现了PWM脉宽调制的功能,用于给DC-DC电路实现稳定可调的电源。
一.程序结构说明:
本程序是基于单片机C语言编写的,经过uVision2编译通过,主要实现单片机操作,运算和输出等方面的功能。
整体框架图7.4所示:
图7.4 软件整体框架图
共分为以下几个部分:
主控制板块
按键扫描与解释板块
显示驱动板块
PWM计算与输出板块
手动修正模块
反馈和自动修正模块
软件各部分结构说明
主控制模块
Main程序主要实现程序的初始化操作和总体控制,它的图7.5如下:
图7.5 Main程序框架图
系统初始化主要包括以下六部分:
单片机系统初始化
初始化P1,P3口,常将这两个口先置oxff。
中断工作寄存器初始化
设置IE,IP等特殊寄存器,用于开启两个定时器。
定时器工作寄存器初始化
设置定时器定时长度。对于定时器0设置为5ms,而对于定时器1先设置为1ms, 随后程序会自动根据占空比的改变而变化。
开定时器,定时器中断允许
定时器0用于5ms中断。
按键判断和解释
反馈采样和反馈控制
显示驱动
(b)定时器1用于输出PWM波形。
图7.6 5ms中断框架图
全局变量赋初值
拟合二次函数系数设定
占空比与期望电压之间的二次关系曲线系数
ADC反馈值与期望电压之间的二次关系曲线系数
由于数码管译码牵涉到多种状态,因此需要同时考虑以下两个方面:
三位有效数字输出和四位有效数字输出的切换
特殊情况下数码管输出特殊字符的显示
按键扫描及解释模块
在系统运行中,不断扫描按键,以判断用户是否有任何输入指示,这部分工作主要是在5ms中断中完成。一旦用户有按键操作,系统将做出判断,给予按键解释,执行相应的命令。但是值得注意的是任何按键都有可能有抖动的现象,因此软件中必须含有消抖程序。
本按键程序实际上是按键三种状态的切换:
状态0:键放开
状态1:键按下
状态2::键长按3s
图7.7 按键循环图
当前状态
下一状态
转移条件
转移步骤
0
1
键按下
0
Else
1
0
键放开
发消息到主控制程序
2
长按3s
1
Else
2
0
键放开
发消息到主控制程序
2
Else
表7.1 按键说明表格
( 以上图和表格转载自上海交通大学电子工程系科技创新课讲义,版权归袁焱老师所有,本文引用已经征得原作者同意)
本软件中共有四个键需要控制,分别为k1,k2,k3,k4,其中k2,k3,k4主要控制输入电压值各位,十分位,百分位的数值增减,因此只有状态0和状态1,可以用一套子程序来执行按键操作和解释。而k1主要涉及软件状态的切换,具有三个状态,因此需单独使用一套子程序。
switch ( key_state[0] ) // k1键的三种状态判断
{
case 0: key0_pr0 (); break;
case 1: key0_pr1 (); break;
default: key0_pr2 (); break;
};
switch ( key_state[3] ) // k2,k3,k4键的两种状态判断
{
case 0: key_pr0 (1, KEY1); break;
default: key_pr1 (1, KEY3); break;
};
对于k1的各种情况,需要另外编写三个子程序。
void key0_pr1 () // 状态1
{
Save The Data;
if ( IfSameTen (0)) // k1长按3s
Transfer to State 2;
else if (( IfSameThree (0)) ( KEY0 == 1 )) // k1放开
Transfer to State 0;
}
void key0_pr0 () // 状态0
{
Save The Data;
if (( IfSameThree (0)) ( KEY0 == 0 )) // k1按下
{
Transfer to State 1;
if (是在手动修正模式下)
{
存储修正值
当三个修正值存储完毕
解三元一次方程自动修正
}
else // 用户在设置电压值的模式下
{
原创力文档


文档评论(0)