ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:83.86KB ,
资源ID:16813772      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16813772.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(#本文档是基于AT89S52单片机Word格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

#本文档是基于AT89S52单片机Word格式.docx

1、按键按下存储器last_key_down按键按下确认存储器count_key_flash按键重复计数器显示digi_scaner数码管扫描驱动指针output_selunsigned char bdata数码管位驱动和指示灯驱动信号输出缓存led_1sbitoutput_sel5led_2output_sel6led_3output_sel7led_4output_sel4Vo输出电压digi4unsigned char xdata 数码管输出寄存器digi_flash_temp数码管闪烁用寄存器double xdatapulse_width当前的占空比input_for_display输入显

2、示用寄存器count_digi_flash闪烁计数器input_position输入位(即数码管闪烁位拟合coefficient_A拟合曲线的系数coefficient_Bcoefficient_CVo_adjust4long int xdata输出电压数组display_for_adjust4int xdata显示数组Avead读数继电器ctr_out_foot继电器电平信号sub_set_val系统设定温度sub_cur_val当前温度1.2 控制软件各功能模块介绍1.2.1 AD转换模块介绍当ad_mode =1时,此模块有效,以方便开闭环的转换。程序利用变量ad_flag作为标记,判断

3、读adc0804的时机,在读D时采用了取平均值的方法。在进行了一定次数后将采样值与标准值比较。其中定义采样次数AD_SMPL_NUM = 30。对实际水温0100分2段拟合:(1.080 曲线拟和:temp = -0.004 * (doubleave * (doubleave + 3.856 * (doubleave + 307.64。(2.80100曲线拟和:temp = -0.0061 * (doubleave + 4.011 * (doubleave + 268.27。1.2.2 模块程序第一部分图5.3.1 AD转换流程图源程序见附录1.2.3 继电器控制模块介绍此模块根据加热时水温的

4、上升和过冲程度决定继电器的通断,可以改变继电器的通断频率来解决温度过冲问题,并在达到设定温度后保持恒温。1.2.4 模块程序第二部分分两段对继电器控制:075度:继电器1.05s通断一次75100度:继电器0.25s通断一次每段作如下处理图5.3.2 控制模块原理图其效果是温度达到指定范围后继电器即处于关断交替状态算法如下:if(ctr_out_foot = 1 /当继电器接通时if(ave 150 /第一段大于75度if(sub_cur_val + 40 = sub_set_valctr_out_foot = 0。count_self_ctrl = 2000。 /设延迟为0.2selse /

5、第二段小于75度if(sub_cur_val + 60 count_self_ctrl = 10000。 /设延迟为1selse /继电器断开if(sub_cur_val ctr_out_foot = 1。count_self_ctrl = 500。 /循环延迟50ms1.2.5 按键解释功能说明按键是人机互最重要的部分,基本所以的操作都要通过按键来完成,在系统运行中,不断扫描按键,以判断用户是否有任何输入指示,一旦用户有按键操作,系统将做出判断,给予按键解释,执行相应的命令。但是值得注意的是任何按键都有可能有抖动的现象,因此软件中必须含有消抖程序。在水温控制中,key3实现自动与手动的切换,

6、在自动情况下,系统接收本地主系统的控制,自动调整水温;当在手动情况下,可以通过key1切换继电器的开和关,这样在调试时比较方便。对于温度的设置,采用了对位的调整方法,使得温度设定更为方便。二 程序清单:#include reg51.h math.h/*0全局变量开始*/* 定时器 */#define count0_H 0xfc / 计数器0计数初值(1.0004ms时基,(crystal 11.059200MHz#define count0_L 0x65#define count1_H 0xff / 9600波特率(307200/32#define count1_L 0xa3/* 按键key

7、*/#define KEY_SCAN_TIME 500 / 按键扫描周期#define KEY_REPEAT_TIME 10 / 按键重复周期#define KEY_TYPE_SEC 1#define KEY_TYPE_DIS 2#define KEY_TYPE_CHG 3#define KEY_TYPE_POS 4#define KEY_TYPE_ERROR 5sbit KEY1= P10。sbit KEY2= P11。sbit KEY3= P12。sbit KEY4= P13。int count_key_scan。 / 按键扫描计数器char xdata last_key_down。 /

8、上次按键char xdata count_key_repeat。 / 按键重复计数器char xdata key_type。/* 数码管显示 */#define ADDR_8SEG XBYTE0x2000 / 数码管段驱动寄存器地址#define ADDR_SEL XBYTE0x4000 / 数码管位驱动和指示灯驱动寄存器地址#define LED_SCAN_TIME 40 / 数码管扫描周期(1000/4/4=62.5Hz#define LED_FLASH_MAX_TIME 100#define LED_FLASH_GATE_TIME 50#define SET_TIME 20000。int

9、 count_led_scan。 / 数码管扫描计数器unsigned char xdata led_scaner。 / 数码管扫描驱动指针unsigned char bdata output_sel。 / 数码管位驱动和指示灯驱动信号输出缓存,定义了一个可位寻址的变量sbit led_1 = output_sel5。sbit led_2 = output_sel6。sbit led_3 = output_sel7。sbit led_4 = output_sel4。char xdata led4。 / 数码管状态寄存器char led_flash_pos。 / 数码管闪烁位int count_

10、led_flash。char led_flash_temp。int count_set_time。char dis_rewrite_flag。char dis_set_flag。/* 通信 */#define COM_FRAME_LENGTH 8 / 6 + 2#define COM_BUFFER_LENGTH 16 / 8 * 2#define COM_TYPE_STOP 0 / 通讯停止#define COM_TYPE_IN 1 / 接收#define COM_TYPE_OUT 2 / 发送#define COM_TYPE_MANAGE 4 / 接收后处理#define SUB_ADDR

11、2 / 作为从机的地址#define SUB_ADDR_0 0#define SUB_ADDR_1 2#define MASTER_ADDR 0 / 主机地址#define LOCAL_VER 1 / 本地协议版本号#define BYTE_MISS_TIME 400 / 字节最大延时#define BYTE_DELAY_TIME 170 / 字节发送延时#define STD_FRAME_LEN 12 / 标准最短帧长int count_byte_miss。 / 接收字节计时int count_byte_delay。 / 发送字节计时char com_tra_pin。 / 发送用指针char

12、 com_tra_pos。 / 发送数据区标志char com_tra_bufCOM_BUFFER_LENGTH + 2。 / 发送帧缓冲区char com_rec_pos。 / 接收数据区标志char com_rec_bufCOM_BUFFER_LENGTH。 / 接受帧缓冲区char com_type。 / 通信机状态/* 子系统相关 */#define ADDR_0804 XBYTE0x6000#define AD_TIME 500 / 0.05秒采样#define DATA_BUF_LEN 10 / 数据缓冲区长度sbit ctr_out_foot = P33。unsigned cha

13、r data_bufDATA_BUF_LEN。 /数据缓冲区int count_self_ctrl = 0。 / 抽样计数器int count_data_manage = 0。 / 数据处理计数器int xdata sub_cur_val。 / 初值int xdata sub_set_val。 / 设定值int xdata sub_max_val。 / 最大值int xdata sub_min_val。 / 最小值int xdata sub_max_val_base。 / 最大数量级int xdata sub_dis_temp。 / 显示缓冲int xdata sub_cur_val_base

14、。 / 当前输入位数量级int xdata sub_val_base。char xdata sub_set_posib。 / 可设置标志位char xdata master_lock。 / 锁定标志位/*0全局变量结束*/*1硬件接口输出层开始*/*1.1*/* 7段数码显示译码( D70 = PGFEDCBA */unsigned char NUMTOSEG7(char DATA unsigned char AA。 if(DATA DATA = -DATA。 AA = 0x00。 else AA = 0x80。 switch (DATA case : AA |= 0x40。break。 /

15、01 AA |= 0x79。 / 1 AA |= 0x24。 / 23 AA |= 0x30。 / 34 AA |= 0x19。 / 45 AA |= 0x12。 / 56 AA |= 0x02。 / 6 7 AA |= 0x78。 / 78 AA |= 0x00。 / 89 AA |= 0x10。 / 9A AA |= 0x08。 / AB AA |= 0x03。 / BC AA |= 0x46。 / CD AA |= 0x21。 / DE AA |= 0x06。 / EF AA |= 0x0e。 / F G AA |= 0x42。 / GH AA |= 0x09。 / HI AA |= 0

16、x4f。 / IJ AA |= 0x71。 / JK AA |= 0x0f。 / KL AA |= 0x47。 / LP AA |= 0x0c。 / P- AA |= 0x3f。 / 减号_ AA |= 0x77。 / 下划线 AA |= 0x7f。 / 消隐 AA |= 0x7e。 / 上划线 default: AA = 0xff。 return(AA。/*1.2*/*1.2 LED刷新 */void LEDDisplayHard( led_scaner = (led_scaner + 1 % 5。 / 移动扫描指针 output_sel = (output_sel & 0xf0 | 0x0

17、1 led_1 = 0。 if (KEY2=0 led_2 = 0。 if (KEY3=0 led_3 = 0。 if (KEY4=0 led_4 = 0。*/ if(led_flash_pos = 0 / 数码管闪烁 count_led_flash-。 if(count_led_flash = LED_FLASH_GATE_TIME / 点亮 ledled_flash_pos = led_flash_temp。 else if(count_led_flash = 0 / 熄灭 count_led_flash = LED_FLASH_MAX_TIME。 / 循环计时 if(ledled_fla

18、sh_pos / 通信指示灯 led_4 = 0。 else led_4 = 1。 ADDR_8SEG = NUMTOSEG7(ledled_scaner / 输出数码管形状 ADDR_SEL = output_sel。 / 输出选通/*1硬件接口输出层结束*/*2硬件接口功能层开始*/*2.1*/*2.2*/* 按键消抖 */char keyDown(void char key_down = 0。 /* 扫描按键 */ if(KEY1 = 0 key_down = 1。 else if(KEY2 = 0 key_down = 2。 else if(KEY3 = 0 key_down = 3。

19、 else if(KEY4 = 0 key_down = 4。 if(last_key_down != key_down / 抖动 last_key_down = key_down。 count_key_repeat = 0。 else / 有效信号 count_key_repeat-。 if(count_key_repeat interrupt 1 using 0 /*2.3*/* T0时钟中断服务程序 */* 提供系统时基 */timer1( interrupt 3 using 1 ET0 = 0。 / 关中断 TH1 = count1_H。 / 1ms定时 TL1 = count1_L。

20、 TR1 = 1。 if(count_led_scan ! / 扫描数码管 count_led_scan-。 if(count_key_scan ! / 扫描按键 count_key_scan -= 1。 if(count_byte_miss ! / 字节丢失 count_byte_miss-。 else if(com_type = COM_TYPE_IN com_type = COM_TYPE_STOP。 / 通讯停止 if(count_byte_delay ! / 字节延时 count_byte_delay-。 else if(com_type = COM_TYPE_OUT SBUF =

21、com_tra_bufcom_tra_pin。 count_byte_delay = BYTE_DELAY_TIME。 / 延迟5ms发送下一字节 if(count_set_time ! / 显示设定值 count_set_time-。 if(count_self_ctrl ! / 自控 count_self_ctrl-。 ET0 = 1。 / 开中断/*2.4*/* 串口中断服务程序*/* 通信用中断 */comHard(interrupt 4 using 3 char temp。 ES = 0。 if(RI = 1 / 接收中断 RI = 0。 / 接收中断复位 temp = SBUF。 if(temp = & com_type / 出现SOI com_rec_pos = 0。 / (重新开始接收 com_type = COM_TYPE_IN。 / 转接收 count_byte_miss = BY

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1