毕业设计 基于单片机汽车空调控制系统的设计


🔥 毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是:基于单片机汽车空调控制系统的设计

1工作原理

本系统可以分为五大部分:热电阻温度采集、运行状态显示、继电器控制、键盘输入、风向步进电机控制。

1.1 热电阻温度采集

热电阻传感器以其温度特性稳定、测量精度高的特点,在大型中央空调得到了广泛的应用。采用Pt1000热电阻作为温度传感器的测量电路原理图如图1 所示。热电阻Rt与三个电阻接成电桥。当温度变化时,使得运算放大器的同相输入端的电位发生变化,经过运算放大器放大之后输入到Atmega16单片机进行AD转换。由于单片机采用5V电压作为ADC的参考电源,而电桥在温度变化为0~100°C时,输出电压范围为0~0.7V,所以确定运算放大电路的放大倍数为7,以获得最佳的测量结果。运算放大电路的电阻按以下公式确定:

用Visual Basic.Net根据以上公式(1)、(2)生成用N来查找温度t的程序表格,其代码如下:

Private Sub Pt1000()

Me.Cursor = Cursors.WaitCursor

txtTab.Clear()

Dim U As Integer = 9 '电桥电源电压

'热电阻0度时的电阻值

Dim Pt1000_R0 As Integer = 1000

Dim n As Integer

Dim sngT As Single

Dim sngRt As Single

txtTab.AppendText("const float Pt1000Tab[]={" & Chr(13) & Chr(10))

For n = 0 To 1023

    sngRt = (10000 * n + 7161000 * U) / (7161 * U - 10 * n)

    sngT = (-const_A + Sqrt(const_A ^ 2 - 4 * const_B * (1 - sngRt / Pt1000_R0))) / (2 * const_B)

If n < 1023 Then                txtTab.AppendText(Format(Abs(sngT), "0.0") & ", /* " & n & " */")

   Else                txtTab.AppendText(Format(Abs(sngT), "0.0") & "  /* " & n & " */" & Chr(13) & Chr(10) & "};")

   End If

   If n Mod 5 = 0 Then

      txtTab.AppendText(Chr(13) & Chr(10))

   End If

Next

txtTab.SelectAll()

txtTab.Copy()

Me.Cursor = Cursors.Default

End Sub

生成的程序常数表格(1024个值)部分如下:

const float Pt1000Tab[]={

0.0, /* 0 */ 0.1, /* 1 */0.2, /* 2 */0.2,

……

63.4, /* 696 */63.5, /* 697 */

……

99.3, /* 1022 */99.4  /* 1023 */

};

1.2  运行状态显示

本系统采用一块16×4的字符型液晶模块,这种类型的LCD应用很广泛,其控制驱动主芯片为HD44780及其扩展驱动芯片HD44100(或兼容芯片),少量阻、容元件,结构件等装配在PCB板上而成。字符型液晶显示模块目前在国际上已经规范化,无论显示屏规格如何变化,其电特性和接口形式都是统一的。因此只要设计出一种型号的接口电路,在指令设置上稍加改动即可使用各种规格的字符型液晶显示模块。odeVisionAVR集成开发环境集成这种类型LCD的函数,可方便实现LCD的读写,其部分函数及功能简单介绍如下,更详细的资料可查阅各种文献。

函数原型:void lcd_init(unsigned char lcd_columns)

功能:初始化LCD模块,清屏并把显示坐标设定在0 列0 行。LCD模块的列必须指定(例如:16)。这时不显示光标。在使用其它高级LCD函数前,必须先调用此函数。

函数原型:void lcd_clear(void)

功能:清屏并把显示坐标设定在0 列0 行。

函数原型:void lcd_gotoxy(unsigned char x, unsigned char y) 

功能:设定显示坐标在x 列y行。列、行。

函数原型:void lcd_putchar(char c)

功能:在当前坐标显示字符c 。

函数原型:void lcd_puts(char *str)

功能:在当前坐标显示SRAM 中的字符串str 。

函数原型:void lcd_putsf(char flash *str)

功能:在当前坐标显示FLASH 中的字符串str 。

在对LCD进行写入显示数据之前,需要对它进行初始化,设定显示参数。

#include <lcd.h>

/*使用PORTB连接LCD模块*/

#asm

   .equ __lcd_port=0x18 ;PORTB

#endasm

void main(void){

//定义字符数组

uchar arr[5];

//初始化,指定列数为16

lcd_init(16);

//设定显示坐标为(0,1)

lcd_gotoxy(0,1);

/*在(0,1)显示字符串,注意:此字符串存储在Flash只读存储器中*/

lcd_putsf("Run  Mode:");

/*调用“浮点数转换成字符串”函数,

函数原型:void ftoa(float n, unsigned char decimals, char *str)

data为浮点数*/

ftoa(data,1,arr);

//设定显示坐标为(0,2)

lcd_gotoxy(0,2);

//显示RAM中字符串数组arr的内容

lcd_puts(arr);

while(1);

}

  1. 继电器控制

Atmega16输出缓冲器具有对称的驱动特性,可以输出和吸收大电流,直接驱动LED,但是仍然不能直接驱动更大电流的器件,如继电器,所以必须接入较大功率的驱动器。常用的驱动方法有74系列功率集成电路驱动、MOC系列光耦合过零触发双向晶闸管驱动、固态继电器驱动等。

本系统采用ULN2003芯片来驱动继电器。其内部结构如图2所示。

ULN2003是达林顿阵列,是专门用来驱动继电器的芯片,甚至在芯片内部做了一个消线圈

图2 ULN2003内部结构图

反电动势的二极管。ULN2003的输出端允许通过IC 电流200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。采用集电极开路输出,输出电流大,故可以直接驱动继电器或固体继电器(SSR)等外接控制器件,也可直接驱动低压灯泡,共可以驱动7路,减少了电路板的连线数量,成本较低,广泛应用于各种工控板,其驱动原理如图3所示。

图3  驱动原理

压缩机离合器继电器采用RS触发器和ULN2003一起控制,这样做的好处是:当单片机受到外界干扰而不断复位或看门狗超时复位时,保证压缩机始终处于开启或关闭状态,有助于延长压缩机的寿命。

1.4 键盘输入

本系统采用3×3矩阵式键盘。通过键盘可以控制系统工作方式(关闭、送风、制冷)、风向步进电机(水平送风、倾斜送风、扫风)、温度设定等。

键盘的行由PD0、PD1、PD2(使能内部上拉电阻)控制,而列则由PC3、PC4、PC5控制,如图4所示。采用程序扫描的方式识别键码,其工作过程如下:

(1)判断键盘中有无键按下。通过以下代码实现:

PORTC&=~0x20;

if((PIND&0x07)!=0x07) {//……}

首先置PC5为“0”,再判断PD0、PD1、PD2是否都为“1”。如果全为“1”,则表明第3列无键按下,否则有键按下,进入消除抖动程序;再置PC4为“0”,再判断PD0、PD1、PD2是否都为“1”。如果全为“1”,则表明第2列无键按下,否则有键按下,进入消除抖动程序;再置PC3为“0”,再判断PD0、PD1、PD2是否都为“1”。如果全为“1”,则表明第1列无键按下,否则有键按下,进入消除抖动程序。

图4 3×3矩阵式键盘

(2),消除抖动。当发现有键按下时,延时一段时间再判断键盘状态,若仍有键保持按下状态,则可以确定有键按下,否则认为是抖动。通过以下代码实现:

   delay();

if((PIND&0x07)!=0x07) {//……}

(3)判断键码。以下是识别为“Key2-3”( 第2行第3列)的程序代码,其它按健类似。

if((PIND&0x07)==0x05)

{     // Key 2-3   

      // uchar key_num[]="K23";

      // 等待按键释放

      while((PIND&0x07)==0x05);

      //判断换气风机是否在运行

      if(ventilator_state==1)

      {

         ventilator_state=0;

         //关闭换气风机

         stop_ventilator();

         //在LCD上的(12,3)显示“OFF”         lcd_gotoxy(12,3);

         lcd_putsf("OFF");             

       }

       else

       {

          ventilator_state=1;

          //开启换气风机

          start_ventilator();

         //在LCD上的(12,3)显示“Run”    

          lcd_gotoxy(12,3);

          lcd_putsf("Run");                

       }           

       return;//识别完毕,返回主程序

}

1.5 风向步进电机控制

Atmega16的定时器能够输出PWM,编程简单,精度高。编程让定时器2工作于相位可调模式,产生高精度的PWM波形输出,调节占空比,以达到控制步进电机不同转角的目的。初始化设置如下:

ASSR=0x00;

/*  相位可调PWM模式,比较匹配时清零OC2,计数为0xff时置位OC2   */

TCCR2=0x64;

TCNT2=0x00;

OCR2=0x00;

TIMSK=0x80;      //使能匹配中断

图5  相位可调PWM 模式的时序图

图6 水平送风模式下的PWM波形

图6 倾斜送风模式下的PWM波形

2  仿真

 Proteus是目前最好的模拟单片机及外围器件的仿真软件,可以仿真51系列、AVR,PIC等常用的MCU及其外围电路,如LED、LCD、RAM、ROM、键盘、马达、继电器、AD/DA、部分SPI器件、部分

器件、74系列、 

COMS 4000系列芯片等。利用Proteus可以大大提高开发效率、降低投资,在没有硬件的情况下让开发人员能像Pspice仿真模拟/数字电路那样仿真MCU及外围电路。

Proteus提供的可调电阻是“十级可调”而不是“无级可调”,所以本系统采用三个可调电阻模拟Pt1000热电阻,以实现“粗调”、“中调”、“细调”,更真实反映热电阻阻值的细微变化。

图7 换气风机、压缩机、蒸发器风机处于工作状态

图8 LCD显示结果

如果学弟学妹们在毕设方面有任何问题,随时可以私信我咨询哦,有问必答!学长专注于单片机相关的知识,可以解决单片机设计、嵌入式系统、编程和硬件等方面的难题。
愿毕业生有力,陪迷茫着前行!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值