单片机毕业设计.docx
- 文档编号:20705543
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:69
- 大小:124.46KB
单片机毕业设计.docx
《单片机毕业设计.docx》由会员分享,可在线阅读,更多相关《单片机毕业设计.docx(69页珍藏版)》请在冰豆网上搜索。
单片机毕业设计
单片机毕业设计
粮食仓库
实时温度监控报警系统
院系:
班级:
设计:
学号:
指导老师:
设计日期:
一、总体设计框图..................................................5
二、硬件设计..............................................................6
三、软件设计...............................................................7
设计小结........................................................................29
参考文献..............................................................30
第1章引言
本论文是基于单片机的仓库温湿度监控系统,该系统克服了传统装置的不足之处,由信号采集、信号分析和信号处理三个部分组成的,是一种造价低廉、使用方便简单,且测量准确的温湿度测量装置。
论文介绍
本设计用于温度的智能控制,节能环保,低耗能,噪音低,设计合理,体现了优化设计低碳生活的理念。
下面是本设计的具体内容及功能说明。
1.温度测量,测量范围0-125C
2.数字式温度范围可调,0-125C。
各种设定值在掉电后不会丢失,各种温度初始化设定值如下所述:
风机启动:
90C
风机停止:
70C
超温报警:
120C
报警:
100C
3.保存上次掉电时的瞬间温度,最高温度,最低温度。
4.可以手动启停风机,超温报警,报警信号的显示。
5.可以声光报警。
6.带时钟显示,可以调整时间,
7.可以查看掉电时,瞬间温度的时间,最高温度的时间,最低温度的时间
8.闹钟设置功能
9.闹钟初始值是8:
00(1键是确定键,2键是加键,3是减键,4是退出键,5是设置温度键,6是时间设置键,7是查看掉电前时的瞬间温度及出现的时间,最高温度及出现的时间,最低温度及出现的时间,当前最高时的温度及出现的时间。
8键时设置闹钟时的时间。
9键手动开关风机,超温跳闸,报警。
)
10.可以与上位机进行通讯:
上位机
(1)按下1键可以在上位机查看掉电前瞬间时的温度,及时间
(2)按下2键时在上位机可以看到此刻的温度,及时间
(3)按下3键可在上位机以看到设定超温的温度也就是跳闸温度
(4)按下4键可以在上位机看到设定的报警温度
(5)按下5键在上位机上可以看到设定的开风机温度
(6)按下6键在上位机上可以看到设定的关风机温度
(7)按下7键可以实现开风机
(8)按下8键可以实现关风机
11、设置时间:
按下设置时间键后,接下来设置月,设置日,设置时,设置分,设置时,按2,3键进行调整数值,设置时可以按退出键(4)退出。
12.设置闹钟时,按下设置闹钟键后,接下来设置时,分,按2,3键进行调整数值,设置时可以按退出键(4)退出。
13.设置温度:
按下设置温度键后,会弹出提示语,OK按1键,Ese按4键,设置完后,按OK键可以退出,在中间设置时,可以按退出键(4)退出。
14查询温度:
按下查询温度键后,按下2,3键可以切换查询的内容,在温度后面显示的数字:
0代表掉电前瞬间时的温度,1代表掉电前出现的最高温度,2代表掉电前出现的最低温度,3代表此次出现的最高温度,4代表此次出现的最低温度。
按退出键(4)退出查看。
15.手动开关风机,当按下9键后,超温跳闸,按2,3键后可以超温跳闸,报警,开风机,关风机之间切换,按退出键(4)键退出手动操作。
第2章设计任务分析
一.实时:
能够按照实际的日期时间显示和记录各项待检测物理量的参数值。
二.温度:
能够检测各连续时间点所对应的的温度值。
三.监控:
用户随时能够了解到仓库任意时间(包括历史时间)的温度状况以及做出相应的对策和处理措施,特别是不需要工作人员到仓库现场就可以知道仓库里的温度环境状况。
四.报警:
当仓库的环境温度超过设定值时系统报警,风机启动,然后进行通风。
五.本系统通过液晶显示器将时间和温度显示给用户以及和上位机通讯。
第3章仓库环境温度实时监控系统的总体设计
一、总体设计框图
二、硬件设计(附图)
重要元器件介绍
此次设计用到的芯片有AT89S52、AT2404、LCM2402、ULN2003、MAXIM487、DST302、
DS18B20
三、软件设计
设计程序如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount,count1;
ucharclock_beep;
chark_diaodian;
ucharchaowenflag,baojinflag,kaifengjiflag;
ucharkey_ok=0;
ucharkey_Ese=0;
ucharkey_add1=0;
ucharkey_add2=0;
ucharkey_settemp=0;
ucharkey_time=0;
ucharkey_searchtem=0;
ucharkey_clock=0;
ucharkey_qiting=0;
ucharser_flag=0;
ucharser_a=0;
#defineLCM2402_DB0_DB7P0//数据总线
sbitLCM2402_RS=P2^5;//定义LCM2402的Rs控制线
sbitLCM2402_RW=P2^4;//定义LCM2402的RW控制线
sbitLCM2402_E=P2^3;//定义LCM2402的E控制线
sbitLCM2402_Busy=P0^7;//定义LCM2402的侧忙线
//LCM2402指令集
#defineCMD_clear0x01
#defineCMD_back0x02
#defineCMD_dec10x04
#defineCMD_add10x06
#defineCMD_dis_gb10x0f
#defineCMD_dis_gb20x0e
#defineCMD_dis_gb30x0c
#defineCMD_OFF_dis0x08
#defineCMD_set820x38
#defineCMD_set810x30
#defineCMD_set420x28
#defineCMD_set410x20
#definelin_10x80
#definelin_20xc0
//底层协议
voiddelayS(uinta)//延时大概1MS
{
uchari;
while(--a!
=0)
{
for(i=0;i<125;i++)
{;}
}
}
voidDelayS250(void)//延时
{
DelayS(250);
}
//LCM2402测忙,若LCM2402处于忙状态,本函数将继续测忙,直到LCM2402处于非忙状态
voidLCM2402_TestBusy(void)
{
LCM2402_DB0_DB7=0xff;//设备读状态
LCM2402_RS=0;
LCM2402_RW=1;
LCM2402_E=1;
while(LCM2402_Busy);
LCM2402_E=0;
}
voidLCM2402_WriteCMD(uintLCM2402_command)
{
LCM2402_TestBusy();
LCM2402_DB0_DB7=LCM2402_command;
LCM2402_RS=0;
LCM2402_RW=0;
LCM2402_E=1;
LCM2402_E=0;
}
voidLCM2402_WriteData(uintLCM2402_data)
{
LCM2402_TestBusy();
LCM2402_DB0_DB7=LCM2402_data;
LCM2402_RS=1;
LCM2402_RW=0;
LCM2402_E=1;
LCM2402_E=0;
}
voidLCM2402_Init(void)
{
LCM2402_WriteCMD(CMD_set82);
LCM2402_WriteCMD(CMD_clear);
LCM2402_WriteCMD(CMD_back);
LCM2402_WriteCMD(CMD_add1);
LCM2402_WriteCMD(CMD_dis_gb3);
}
voidprint(uint*str)
{
LCM2402_WriteCMD(a);
while(*str!
='\0')
{
LCM2402_WriteData(*str++);
}
*str=0;
}
voidprint2(uinta,uintt)
{
LCM2402_WriteCMD(a);
LCM2402_WriteData(t);
}
//写数据LCM创建小汉字
unsignedintcodeXword[]=
{
0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,//C
0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,//一
0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,//二
0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,//三
0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,//四
0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,//五
0x00,0x0r,0x00,0xff,0x00,0x0a,0x11,0x00,//六
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,//日
};
voidCgramWrite(void)//装入cgram
{
unsignedinti,k;
k=AT24c02_Read(0x33);//读取标志位,多次开机,只执行一次这程序
if(k==1)
{
LCM2402_WriteCMD(0x06);//CGRAM地址自动加一
LCM2402_WriteCMD(0x40);//CGRAM地址设为00处
for(i=0;i<64;i++)
{
LCM2402_WriteData(Xword[i]);
}
AT24c02_WriteCMD(0x33,0);//写入0标志位
}
}
//AT24c02芯片的处理
sbitSCL=P2^1;
sbitSDA=P2^2;
sbitmos_bit
sbitlow_bit
datacom_data//定义一个能位寻址的变量
mos_bit=com_data^7;
low_bit=com_data^0;
voidstart()
{
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
voidstop()
{
SDA=0;_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();
}
voidack()
{
SCL=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
voidshift8(chara)
{
datauchari;
com_data=a;
for(i=0;i<8;i++)
{
SDA=mos_bit;
SCL=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
com_data=com_data*2;
}
}
unsignedcharAT24c02_Read(chara)//读数据
{
dataunsignedchari,command;
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift(command);
ack();
shift8(a);
ack();
start();
command=161;
shift8(command);
ack();
SDA=1;_nop_();_nop_();_nop_();_nop_();
for(i=0;i<8;i++)
{
com_data=com_data*2;
SCL=1;_nop_();_nop_();_nop_();_nop_();
low_bit=SDA;
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
stop();
returncom_data;
}
voidAT24c02_Write(chara,charb)//写数据,a是地址,b要写的数据
{
dataunsignedcharcommand;
nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(a);
ack();
shift(b);
ack();
stop();
nop_();_nop_();_nop_();_nop_();
}
//Ds1302时钟芯片的初始化
sbitclock_clk=P3^5;//时钟线
sbitclock_dat=P3^6;//数据线
sbitclock_Rst=P3^7;//复位线
sbita0=ACC^0;
sbita1=ACC^1;
sbita2=ACC^2;
sbita3=ACC^3;
sbita4=ACC^4;
sbita5=ACC^5;
sbita6=ACC^6;
sbita7=ACC^7;
unsignedcharyy;mo,dd,xq,hh,mm,ss;//全局变量
bitw=0;//调时标志位
voidclock_out(unsignedchardd)//发送8位数据到1302
{
ACC=dd;
clock_dat=a0;clock_clk=1;clock_clk=0;
clock_dat=a1;clock_clk=1;clock_clk=0;
clock_dat=a2;clock_clk=1;clock_clk=0;
clock_dat=a3;clock_clk=1;clock_clk=0;
clock_dat=a4;clock_clk=1;clock_clk=0;
clock_dat=a5;clock_clk=1;clock_clk=0;
clock_dat=a6;clock_clk=1;clock_clk=0;
clock_dat=a7;clock_clk=1;clock_clk=0;
}
unsignedcharclock_in(void)//从1302中接收8位数据
{
clock_dat=1;
a0=clock_dat;
clock_clk=1;clock_clk=0;a1=clock_dat;
clock_clk=1;clock_clk=0;a2=clock_dat;
clock_clk=1;clock_clk=0;a3=clock_dat;
clock_clk=1;clock_clk=0;a4=clock_dat;
clock_clk=1;clock_clk=0;a5=clock_dat;
clock_clk=1;clock_clk=0;a6=clock_dat;
clock_clk=1;clock_clk=0;a7=clock_dat;
return(ACC);
}
voidwrite_clock(unsignedcharord,unsignedchardd)//写入一个数
{
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
unsignedcharread_clock(unsignedcharord)//读取一个数
{
unsignedchardd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
voidInit_1302(void)//1302初始化
{
uchark;
k=AT24c02_Read(0x34);//标志位为一时,
if(k==1)
{
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x10);//年
write_clock(0x8a,0x02);//星期
write_clock(0x88,0x04);//月
write_clock(0x86,0x10);//日
write_clock(0x84,0x11);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x34,0);//写入标志位为0;
write_clock(0x8e,0x80);//禁止写操作
}
}
//18B02温度初始化,及相关处理
sbitDQ=P2^0;
voidDelay(intnum)//延时函数
{while(num--);
}
voidInit_DS18B20(void)//初始化ds18b20
{
ucharx=0;
DQ=1;
Delay(8);
DQ=0;//单片机将DQ拉低
Delay(80);//精确延时大于480us
DQ=1;
Delay(14);
x=DQ;
Delay(20);
}
ucharReadOneChar(void)//读一个字节
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
voidWriteOneChar(uchardat)//写一字节
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&01;
Delay(5);
DQ=1;
dat>>=1;
}
}
uintReadTemperature(void)//读取温度
{
uchara=0;
ucharb=0;
uintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过序列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过序列号的操作
WriteOneChar(0xBE)//读取温度寄存器
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
voidprintTemperature(void)显示温度
{
uinti=0;
uchara=0,b=0,c=0,d=0;
i=ReadTemperature();
a=i/1000;
if(a>0)
{print2(0xC2,a+0x30);}
b=i/100-a*10;
print2(0xc3,b+0x30);
c=i/10%10;
print2(0xc4,c+0x30);
print2(0xc5,".");
d=t%10;
print2(0xc6,d+0x30);
print2(0xc7,0x00);
}
//实时时间显示
voidRealTime_Display(void)
{
print(0x80,"20");
print2(0x82,(read_clock(0x8d)/16)+0x30);
print2(0x83,(read_clock(0x8d)%16)+0x30);
print(0x84,"/");//显示年
print2(0x85,(read_clock(0x89)/16)+0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 毕业设计