空调控制系统_毕业论文(编辑修改稿)内容摘要:

部电路如图 24所示: 图 24 外部晶振电路 外部振荡信号由 X2引入, X1和 X2:片内振荡电路输入、输出引脚,这两个端子用来外接石英晶体和微调电容。 在石英晶体的两个管脚加交变电 场时,它将会产生一定频率的机械变形,而这种机械振荡又会产生交变电场,上述物理现象称为压电效应。 一般情况下,无论是机械振动的振幅,还是交变电场的振幅都非常小。 但是,当交变电场的频率为某一特定值时,振幅骤然增大,产生共振,称之为压电振荡。 这一特定频率就是石英晶体的固有频率,也称谐振频率,即用来连接 89C51片内 OSC的定时反馈回路。 石英晶振起振后要能在 X2线上输出一个 3V左右的正弦波,以便使 MCS51片内的 OSC电路按石英晶振相同频率 10 自激振荡。 通常 OSC的输出时钟频率 fosc为 ~ 16 MHz,典型 值为 12 MHz或者 MHz。 电容C5, C6可以帮助起振,典型值为 33 pF,调节它们可以达到微调 fosc的目的。 11 3 软件设计 软件设计原理及设计所用工具 本设计中采用的处理器是 AT89C51单片机,由此可采用面向 MCS51的程序设计语言,包括 ASM51汇言和 C语言,这两种语言各有特点。 C语言更接近机器语言,常用来编制与系统硬件相关的程序,如访问I/O端口、中断处理程序、实时控制程序、实时通信程序等;而数学运算程序则适合用 C51高级语言编写,因为用 高级语言编写运算程序可提高编程效率和应用程序的可靠性。 与以往的 80C51单片机不同, AT89C51具有在线调试和下载功能,它由支持 AT89C51的开发工具包 Keil 开发系统来提供。 也就是说,在用户系统保留 AT89C51 的情况下,通过开发系统与 AT89C51的串行接口通信,直接对用户系统进行调试,并在调试完成后将调试好的程序下载到 AT89C51 中。 Keil :编译、下载、调试和模拟,分别由 Keil 、在线串 行下载器、调试器和模拟器来实现。 Keil Windows操作系统下直接使用,编译汇编源程序,并生成 16进制文件和列表文件。 串行下载器是一个软件程序,它允许通过标准 PC机上的串口串行下载汇编程序到片内 8kB 的闪速程序存储器中。 调试器采用 Windows 系统,允许用户使用AT89C51的 UART串行接口在芯片上调试代码执行。 在典型调试对话中,调试器提供对片内所有外围设备的访问、单步和设置断点的代码执行控制方式。 模拟器采用 Windows系统,能完全模拟 AT89C51的所有功能。 模拟器 使用简单,结合了许多标准调试特征,包括多断点、单步以及代码执行跟踪等能力。 主程序功能单一化,只对各子程序进行控制、调动,使整个程序成为有机的整体。 软件主程序是系统的监控程序,主要工作流程为:系统在上电以后进入初始化状态,将系统中所有的接口模式、状态以及有关的存储单元置位成初始状态,然后恢复 AT89C51的 P1 口 (控制输出 )的工作状态。 部分程序的流程图 主程序流程图 本设计主程序流程如图 31所示。 程序启动后,首先清理系统内存,然后对温度进行采集,通过温度采集芯片内部转换后, 传输到单片机,由单片机控制显示设备,显示现在的温度,然后系统进入待机状态,等待键盘输入设定温度,系统将设定温度与现在温度进行比较,得出结果,启动制冷系统或者加热系统。 12 图 31 主程序流程图 DS18B20 的温度采样程序流程图 CPU对 DS18B20的访问流程是:先对 DS18B20初始化,再进行 ROM 操作命令,最后才能对存储器和数据进行操作。 DS18B20每一步操作都要遵循严格的工作时序和通信协议。 如主机控制 DS18B20完成温度转换这一过程,根据 DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对 DS18B20进行复位,复位成功后发送一条 ROM 指令,最后发送 RAM指令,这样才能对 DS18B20进行预定的操作。 DS18B20工作的流程 如图 32。 13 图 32 温度采样框 程序如下: float tt。 Init_DS18B20()。 // 初始化 ds18b2子函数 delay_MS(1)。 WriteOneChar(0xcc)。 // 跳过 ROM命令 WriteOneChar(0xbe)。 // 发送读取数据命令 temp_data[0]=ReadOneChar()。 // 连续读两个字节数据 temp_data[1]=ReadOneChar()。 temp1=temp_data[1]。 temp1=8。 temp1=temp1|temp_data[0]。 // 两字节合成一个整型变量。 return temp1。 // 返回温度值 } void tem_deal(uint tem) /* 温度数据显示处理函数 */ { if(tem6348) // 温度值正负判断 { tem=65536tem。 flag1=1。 } // 负温度求补码 ,标志 位置 1 else flag1=0。 Dis_ram[0]=temamp。 0x0f。 // 取小数部分的值 14 Dis_play[3]=Dis_ram[0]。 // 存入小数部分显示值 Dis_ram[0]=tem4。 // 取中间八位 ,即整数部分的值 Dis_play[0]=Dis_ram[0]/100。 // 取百位数据暂存 Dis_play[2]=Dis_ram[0]%100。 // 取后两位数据 暂存 if(Dis_play[2]=XX) Dis_play[4]=1。 else Dis_play[4]=0。 if(Dis_play[2]=SX) Dis_play[5]=1。 else Dis_play[5]=0。 Dis_play[1]=Dis_play[2]/10。 // 取十位数据暂存 Dis_play[2]=Dis_play[2]%10。 // 取个位数据暂 存 if(!Dis_play[0]) // 最高位为 0都不显示 { Dis_play[0]=0x0a。 // 先判断百位是否为 0 if(!Dis_play[1]) { Dis_play[1]=0x0a。 // 再判断十位是否为 0 LED 显示部分程序流程图 LED软件设计的主要功能是将 DS18B20所测数据经过模糊控制以后用 LED显示出来。 其流程图如图 33: 15 图 33 LED显示流程图 程序如下 : LED1=~LED1。 { LED2=~LED2。 } void display() /*****显示温度子程序 *****/ { char k。 for(k=0。 k4。 k++) //4 位 LED扫描控制 { if(table[Dis_play[k]] != 0) { Disdata=table[Dis_play[k]]。 //数据显示 } if (k==2){DIN=0。 } //小数点显示 discan=scan_con[k+3]。 //位选 delay_MS(90)。 //延时 discan=0x00。 } 16 discan=scan_con[7]。 //位选 Disdata=0xc6。 //显示 C delay_MS(90)。 discan=0x00。 } /*****主函数 *****/ void main(void) { EA=1。 //允许 INT0 中断 EX0=1。 IT0=1。 //下降沿触发 do { tmpchange()。 //温度转换 tem_deal(tmp())。 //显示温度值 display()。 if(Dis_play[4]==1) shengwen()。 else LED1=1。 if(Dis_play[5]==1) jiangwen()。 else LE。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。