文档说明本文档AT89S52单片机,通过C语言编程实现了.docVIP

文档说明本文档AT89S52单片机,通过C语言编程实现了.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

ldj215323 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档