单片机课程设计恒温控制模拟设计说明.docx

上传人:b****6 文档编号:7228439 上传时间:2023-01-22 格式:DOCX 页数:21 大小:137.56KB
下载 相关 举报
单片机课程设计恒温控制模拟设计说明.docx_第1页
第1页 / 共21页
单片机课程设计恒温控制模拟设计说明.docx_第2页
第2页 / 共21页
单片机课程设计恒温控制模拟设计说明.docx_第3页
第3页 / 共21页
单片机课程设计恒温控制模拟设计说明.docx_第4页
第4页 / 共21页
单片机课程设计恒温控制模拟设计说明.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机课程设计恒温控制模拟设计说明.docx

《单片机课程设计恒温控制模拟设计说明.docx》由会员分享,可在线阅读,更多相关《单片机课程设计恒温控制模拟设计说明.docx(21页珍藏版)》请在冰豆网上搜索。

单片机课程设计恒温控制模拟设计说明.docx

单片机课程设计恒温控制模拟设计说明

 

单片机课程设计

 

课题:

恒温控制模拟设计

 

系别:

专业:

姓名:

学号:

 

城建学院

2011年12月28日

 

成绩评定·

一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。

 

二、评分

评分项目

设计报告评分

答辩评分

平时表现评分

合计

(100分)

任务完成

情况

(20分)

课程设计

报告质量

(40分)

表达情况

(10分)

回答问题

情况

(10分)

工作态度与纪律

(10分)

独立工作

能力

(10分)

得分

 

课程设计成绩评定

班级0934091姓名赵益乐学号093409173

 

成绩:

分(折合等级)

 

指导教师签字年月日

 

1、设计目的

1、使学生增进对单片机的感性认识,加深对单片机理论方面的理解;

2、使学生掌握单片机的部功能模块的应用,如定时器/计数器、中断、片外存贮器、I/O口、A/D、D/A、串行口通讯等;

3、使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。

 

2、设计要求

1、对一定围的温度进行控制,低于此围则加热,高于此围则降温;

2、要求给出加热、降温信号。

3、扩展功能:

时间显示

 

3、总体设计

4、各部分电路设计

上图为18B20的电路设计。

上图为LCD1602的电路设计。

 

下图为独立按键的电路设计:

 

 

上图为单片机晶振的连接电路。

 

5、整体电路图

 

六、设计总结

1、设计过程中遇到的问题及解决方法

遇到的问题:

关于温度显示和温度比较,由于定义了全局温度中间变量temp,并将temp初始化为0,所以显示温度时由于temp被重新初始化,故显示的温度为0,且比较温度时温度与0度比较。

解决方法:

关于温度显示,在温度被初始化为0之前,先将温度显示出来,然后初始化后读取下一个温度。

关于温度比较,由于初始化后将设定温度K与初始化的温度0比较,故重新定义了一个局部变量J,将temp的值传递给J,使局部变量J与设定温度K进行比较,从而确定加热或是降温。

2、设计体会

通过单片机课程设计,我更加深刻具体的认识到了单片机的工作原理,工作状态,是我对单片机有了更加深刻的认识。

通过课程设计,我发现只学习书上的理论知识,而不进行具体实践是难以真正了解一件事物的。

实践出真知。

而且通过实践可以发现理论正确的程序或硬件的一些小的bug,通过修改各种错误和bug,使自己的软硬件功底不断提高,可以在未来的各种设计中,掌握更好的设计方法。

3、对设计的建议

课程设计提高了我们对单片机的具体认识,加深了理解。

课程设计对更好的学习课程有很大的帮助。

 

参考文献

《单片机原理及应用》人民邮电

《8051单片机彻底研究》中国电力

《51单片机应用开发技术大全》人民邮电

《51单片机C语言应用程序设计实例精讲》电子工业

《51单片机及其C语言程序开发实例》清华大学

 

附录(程序):

main.c:

/*******************************************************************

智能温控器

P01602数据线;P1按键;P2^0温度;RS=P2^5;

RW=P2^6;EN=P2^7;SPEAKER=P2^3;OUT=P2^2

********************************************************************/

#include

#include

#include"18b20.h"

#include"1602.h"

#include"delay.h"

#defineucharunsignedchar

sbitMENU=P1^0;//调整温度、时间菜单

sbitINC=P1^1;//增加键

sbitDEC=P1^2;//减小键

sbitLOW=P2^3;//低温加热信号

sbitHIGH=P2^2;//高温降温信号

chardisplaytemp[16];//定义显示区域临时存储数组

unsignedinttemp;//中间变量

floattemperature;//显示温度

intsecond=0;//定义并初始化时钟变量

intminute=0;

inthour=12;

uchartt;//定时时间中间变量

inttemp1;//温度显示变量

ucharset;//按键

intK=12;//初始报警温度

bitON_OFF=0;//报警启动

bitReadTempFlag;//定义读温度标志

voidkeyscan(void);//键盘扫描

voidinc_key(void);//按键加法函数

voiddec_key(void);//按键减法函数

/*****************显示函数********************/

voiddisplay()

{

if(set!

=0)

LCD_Write_Com(0x0f);

if(ON_OFF==1)

sprintf(displaytemp,"Time%02d:

%02d:

%02dON",hour,minute,second);//显示时间

else

sprintf(displaytemp,"Time%02d:

%02d:

%02dOF",hour,minute,second);//显示时间

LCD_Write_String(0,0,displaytemp);//显示第一行

switch(set)//LCD根据工作模式显示

{

case0:

LCD_Write_Com(0x0c);break;//调整模式显示

case1:

LCD_Write_Char(7,0,'');break;//增加模式显示

case2:

LCD_Write_Char(10,0,'');break;//渐少模式显示

case3:

LCD_Write_Char(7,1,'');break;//报警开启/关闭

default:

break;

}

if(set!

=0)

LCD_Write_Com(0x10);

}

/**************键盘扫描子函数******************/

voidkeyscan(void)

{

ucharxx;//局部变量

P1=0xff;

if(P1!

=0xff)

{

DelayMs(50);

if(P1!

=0xff)

{

xx=P1;

while(P1!

=0xff);

switch(xx)//根据按键状态,调用不同的子函数

{

case0xfe:

set++;if(set>=4)set=0;break;

case0xfd:

inc_key();break;

case0xfb:

dec_key();break;

case0xf7:

ON_OFF=!

ON_OFF;break;

default:

break;

}

}

}

}

/****************按键加法子函数******************/

voidinc_key(void)

{

DelayMs(30);

switch(set)

{

case0:

if(P1==0xf7)ON_OFF=!

ON_OFF;break;

case1:

hour++;if(hour>=24)hour=0;break;

case2:

minute++;if(minute>=60)minute=0;break;

case3:

K++;if(K>=100)K=0;break;

default:

break;

}

}

/****************按键减法子函数*****************/

voiddec_key(void)

{

DelayMs(30);

switch(set)

{

case0:

if(P1==0xf7)ON_OFF=!

ON_OFF;break;

case1:

hour--;if(hour<0)hour=23;break;

case2:

minute--;if(minute<0)minute=59;break;

case3:

K--;if(K<=1)K=1;break;

default:

break;

}

}

/***************定时器t0初始化*******************/

voidInit_Timer0(void)

{

TMOD=0x01;//time0为定时器,方式1

TH0=0x3c;//预置计数初值15536计时50ms

TL0=0xb0;

EA=1;

ET0=1;

TR0=1;

}

/***********定时器t0中断子函数**************/

voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次

{

tt++;

TH0=0x3c;

TL0=0xb0;

if(tt==20)

{

tt=0;

ReadTempFlag=1;

second++;

if(second>=60){minute++;second=0;}

if(minute>=60){hour++;minute=0;}

if(hour>=24)hour=0;

}

keyscan();//按键扫描

}

/***********themainfuntion*************/

voidmain(void)

{

intJ;//温度局部变量

ucharx=0;

P1=0xff;//初始化p1口

HIGH=1;

LOW=1;

LCD_Init();//初始化液晶

DelayMs(20);

LCD_Clear();//清屏

Init_Timer0();//时钟定时器0初始化

while

(1)

{

if(ReadTempFlag==1)

{

ReadTempFlag=0;//温度标志位

temp=ReadTemperature();

temperature=(float)temp*0.0625;//温度采集

temp1=(int)temperature;

J=temp1;

sprintf(displaytemp,"Temp%02dC%7.2fC",K,temperature);//显示温度值

LCD_Write_String(0,1,displaytemp);

}

temp1=(int)temperature;

display();

keyscan();

if(ON_OFF==1)//若温控标志位1,控制LAMP动作

{

if(J>K){HIGH=0;LOW=1;}

elseif(J

else{HIGH=1;LOW=1;}

}

else{HIGH=1;LOW=1;}

}

}

1602.H:

#include

#include

#ifndef__1602_H__

#define__1602_H__

bitLCD_Check_Busy(void);

voidLCD_Write_Com(unsignedchar);

voidLCD_Write_Data(unsignedcharData);

voidLCD_Clear(void);

voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s);

voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData);

voidLCD_Init(void);

voidLcd_User_Chr(void);

#endif

1602.C

#include"1602.h"

#include"delay.h"

#defineCHECK_BUSY

sbitRS=P2^7;//定义端口

sbitRW=P2^6;

sbitEN=P2^5;

#defineRS_CLRRS=0

#defineRS_SETRS=1

#defineRW_CLRRW=0

#defineRW_SETRW=1

#defineEN_CLREN=0

#defineEN_SETEN=1

#defineDataPortP0

/*------------------------------------------------

判忙函数

------------------------------------------------*/

bitLCD_Check_Busy(void)

{

#ifdefCHECK_BUSY

DataPort=0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return(bit)(DataPort&0x80);

#else

return0;

#endif

}

/*------------------------------------------------

写入命令函数

---------------------------------------------*/

voidLCD_Write_Com(unsignedchar)

{

while(LCD_Check_Busy());//忙则等待

RS_CLR;

RW_CLR;

EN_SET;

DataPort=;

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入数据函数

------------------------------------------------*/

voidLCD_Write_Data(unsignedcharData)

{

while(LCD_Check_Busy());//忙则等待

RS_SET;

RW_CLR;

EN_SET;

DataPort=Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

清屏函数

------------------------------------------------*/

voidLCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

写入字符串函数

------------------------------------------------*/

voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)

{

if(y==0)

{

LCD_Write_Com(0x80+x);//表示第一行

}

else

{

LCD_Write_Com(0xC0+x);//表示第二行

}

while(*s)

{

LCD_Write_Data(*s);

s++;

}

}

/*------------------------------------------------

写入字符函数

------------------------------------------------*/

voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)

{

if(y==0)

{

LCD_Write_Com(0x80+x);

}

else

{

LCD_Write_Com(0xC0+x);

}

LCD_Write_Data(Data);

}

/*------------------------------------------------

初始化函数

------------------------------------------------*/

voidLCD_Init(void)

{

LCD_Write_Com(0x38);/*显示模式设置*/

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08);/*显示关闭*/

LCD_Write_Com(0x01);/*显示清屏*/

LCD_Write_Com(0x06);/*显示光标移动设置*/

DelayMs(5);

LCD_Write_Com(0x0C);/*显示开及光标设置*/

}

delay.H:

#ifndef__DELAY_H__

#define__DELAY_H__

/*------------------------------------------------

uS延时函数,含有输入参数unsignedchart,无返回值

unsignedchar是定义无符号字符变量,其值的围是

0~255这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下T=tx2+5uS

------------------------------------------------*/

voidDelayUs2x(unsignedchart);

/*------------------------------------------------

mS延时函数,含有输入参数unsignedchart,无返回值

unsignedchar是定义无符号字符变量,其值的围是

0~255这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

voidDelayMs(unsignedchart);

#endif

delay.C:

#include"delay.h"

/*------------------------------------------------

大致延时

T=tx2+5uS

------------------------------------------------*/

voidDelayUs2x(unsignedchart)

{

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数unsignedchart,无返回值

------------------------------------------------*/

voidDelayMs(unsignedchart)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

18b20.H:

#ifndef__DS18B20_H__

#define__DS18B20_H__

#include

#include

#defineucharunsignedchar

#defineuintunsignedint;

/*------------------------------------------------

端口定义

------------------------------------------------*/

sbitDQ=P2^0;//ds18b20端口

/*------------------------------------------------

函数声明

------------------------------------------------*/

unsignedintReadTemperature(void);

bitInit_DS18B20(void);

unsignedcharReadOneChar(void);

voidWriteOneChar(unsignedchardat);

#endif

18b20.C:

/*-----------------------------------------------

名称:

18B20温度传感器

------------------------------------------------*/

#include"delay.h"

#include"18b20.h"

/*------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

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

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