综合实验报告doc00.docx
《综合实验报告doc00.docx》由会员分享,可在线阅读,更多相关《综合实验报告doc00.docx(21页珍藏版)》请在冰豆网上搜索。
![综合实验报告doc00.docx](https://file1.bdocx.com/fileroot1/2022-12/17/f253f613-d6fe-4a25-9534-680864f29d5e/f253f613-d6fe-4a25-9534-680864f29d5e1.gif)
综合实验报告doc00
嘉应学院
电子信息工程学院
单片机综合性设计实验报告
2010~2011学年度第1学期
温度监控系统(计时功能)
专业
自动化
班级
082
姓名
座号
任课教师
电子信息工程学院编
引言
单片机已经在测控领域中获得了广泛的应用,它除了可以测量电信以外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛应用很多领域。
本次设计,就是用单片机实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。
本次采用DS18B20数字温度传感器来实现基于52单片机的数字温度计的设计
ds18b20简介
ds18B20数字温度传感器,是美国DALLAS公司生产的可组网数字温度传感器,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的
ds18b20具有可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
本次设计实验采用12位精度的分辨率实现测温功能。
此次选用外部电源供电方式工作。
Ds18b20内部结构图
一、系统组成框图如下
二、温度监控系统电路图如下:
三、程序流程图如下图示
四、
/*延时函数*/
voiddelays(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
/*初始化函数*/
voidInitUART(void)
{TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
tempmax=30;
p14=0;
p15=0;
SCON=0x50;//SCON:
模式1,8-bitUART,使能接收
TMOD|=0x20;//TMOD:
timer1,mode2,8-bit重装
TH1=0xFD;//TH1:
重装值9600波特率晶振11.0592MHz
TR1=1;//TR1:
timer1打开
EA=1;//打开总中断
//ES=1;//打开串口中断
}
/*串口发送数据函数*/
voidSendByte(temp)
{
SBUF=temp;
while(!
TI);
TI=0;
}
源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchartemp;
uchartempmax;
ucharshi,fen,miao,count;
ucharmshi,mge,fshi,fge,sshi,sge;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
sbitp14=P1^4;
sbitp15=P1^5;
sbitDQ=P2^2;
sbitp20=P2^0;
sbitp21=P2^1;
sbitbeep=P2^3;
sbitbt1=P2^4;
sbitbt2=P2^1;
sbitbt3=P2^0;
sbitRS=P2^5;//定义端口
sbitRW=P2^6;
sbitEN=P2^7;
voidinit_ds18b20(void);
voiddelay(uintt);
voidwrite_byte(uchardat);
ucharread_byte(void);
ucharreadtemperature(void);
voidstep_motor();
voidstep_motor1();
voidanjian();
voidLCD_Init(void);
voidLcd_User_Chr(void);
voidLCD_Write_Com(unsignedcharcom);
voidLCD_Write_Data(unsignedcharData);
voidLCD_Clear(void);
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s);
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData);
/*延时函数*/
voiddelay(uintt)
{
while(t--);
}
voidinit_ds18b20(void)
{ucharn;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
/*DS18B20写字节函数*/
voidwrite_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4);
DQ=1;
dat>>=1;
}
delay(4);
}
/*DS18B20读字节函数*/
ucharread_byte(void)
{
uchari,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
returnvalue;
}
/*主函数*/
voidmain(void)
{
unsignedchardatabyTempeartue;
LCD_Init();//初始化液晶
delay(20);//延时有助于稳定
LCD_Clear();//清屏
Lcd_User_Chr();
LCD_Write_String(0,0,"T:
");
LCD_Write_String(0,1,"W(");
LCD_Write_String(12,1,")Y");
LCD_Write_String(4,1,"00:
00:
00");
LCD_Write_Char(5,0,0x01);//写入温度右上角点
LCD_Write_Char(6,0,'C');//写入字符C
LCD_Write_Char(14,0,0x01);//写入温度右上角点
LCD_Write_Char(15,0,'C');//写入字符C
InitUART();
while
(1)
{
byTempeartue=readtemperature();
temp=readtemperature();
LCD_Write_Char(2,0,'0'+byTempeartue/100);
LCD_Write_Char(3,0,'0'+(byTempeartue%100)/10);
LCD_Write_Char(4,0,'0'+byTempeartue%10);
LCD_Write_String(9,0,"A:
");
LCD_Write_Char(11,0,'0'+tempmax/100);
LCD_Write_Char(12,0,'0'+(tempmax%100)/10);
LCD_Write_Char(13,0,'0'+tempmax%10);
SendByte(temp);
anjian();
if(temp>=tempmax)
{p15=1;
p14=0;
beep=1;
delays(200);
beep=~beep;
delays(200);}
else
{beep=1;
p15=0;
p14=1;
}}}
}
/*DS18B20读温度数据函数*/
ucharreadtemperature(void)
{
uchara,b;
init_ds18b20();
write_byte(0xcc);
write_byte(0x44);
delay(300);
init_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
b<<=4;
b+=(a&0xf0)>>4;
returnb;
}
/*电机正转工作函数*/
voidstep_motor()
{
ucharcodetable[]={0x03,0x09,0x0c,0x06};
uchari=0;
for(i=0;i<4;i++)
{
P1=table[i];
delay(4000);
}
}
/*电机正转工作函数*/
voidstep_motor1()
{
ucharcodetable[]={0x03,0x06,0x0c,0x09};
uchari=0;
for(i=0;i<4;i++)
{
P1=table[i];
delay(4000);
}
}
/*按键设置函数*/
voidanjian()
{if(bt2==1)
{
delays(150);
if(bt2==1)
tempmax++;
}
if(bt3==1)
{
delays(150);
if(bt3==1)
tempmax--;
}
if(temp>=tempmax)
{if(bt1==0)
step_motor1();
else
step_motor();
}}
/*1602写命令函数*/
voidLCD_Write_Com(unsignedcharcom)
{
delay(100);//延时等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
delay(5);
EN_CLR;
}
/*1602写数据函数*/
voidLCD_Write_Data(unsignedcharData)
{
delay(100);//延时等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
delay
(1);
EN_CLR;}
/*定义液晶右上角温度标号”*/
voidLcd_User_Chr(void)
{//第一个自定义字符
LCD_Write_Com(0x40);//"01000000"第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))
LCD_Write_Data(0x00);//"XXX11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)
LCD_Write_Com(0x41);//"01000001"第2行地址
LCD_Write_Data(0x04);//"XXX10001"第2行数据
LCD_Write_Com(0x42);//"01000010"第3行地址
LCD_Write_Data(0x0e);//"XXX10101"第3行数据
LCD_Write_Com(0x43);//"01000011"第4行地址
LCD_Write_Data(0x0e);//"XXX10001"第4行数据
LCD_Write_Com(0x44);//"01000100"第5行地址
LCD_Write_Data(0x0e);//"XXX11111"第5行数据
LCD_Write_Com(0x45);//"01000101"第6行地址
LCD_Write_Data(0x1f);//"XXX01010"第6行数据
LCD_Write_Com(0x46);//"01000110"第7行地址
LCD_Write_Data(0x04);//"XXX11111"第7行数据
LCD_Write_Com(0x47);//"01000111"第8行地址
LCD_Write_Data(0x00);//"XXX00000"第8行数据
//第二个自定义字符
/*1602清屏函数*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
delay(5);}
/*1602写字符串函数*/
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++;}}
/*1602写字符函数*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{if(y==0)
{LCD_Write_Com(0x80+x);}
else
{LCD_Write_Com(0xC0+x);}
LCD_Write_Data(Data);}
/*1602初始化函数*/
voidLCD_Init(void)
{LCD_Write_Com(0x38);/*显示模式设置*/
delay(5);
LCD_Write_Com(0x38);
delay(5);
LCD_Write_Com(0x38);
delay(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
delay(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
LCD_Write_Com(0x48);//"01001000"第1行地址
LCD_Write_Data(0x03);//"XXX00001"第1行数据
LCD_Write_Com(0x49);//"01001001"第2行地址
LCD_Write_Data(0x03);//"XXX11011"第2行数据
LCD_Write_Com(0x4a);//"01001010"第3行地址
LCD_Write_Data(0x00);//"XXX11101"第3行数据
LCD_Write_Com(0x4b);//"01001011"第4行地址
LCD_Write_Data(0x00);//"XXX11001"第4行数据
LCD_Write_Com(0x4c);//"01001100"第5行地址
LCD_Write_Data(0x00);//"XXX11101"第5行数据
LCD_Write_Com(0x4d);//"01001101"第6行地址
LCD_Write_Data(0x00);//"XXX11011"第6行数据
LCD_Write_Com(0x4e);//"01001110"第7行地址
LCD_Write_Data(0x00);//"XXX00001"第7行数据
LCD_Write_Com(0x4f);//"01001111"第8行地址
LCD_Write_Data(0x00);//"XXX00000"第8行数据
}
voidzhongduan()interrupt1
{TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
LCD_Write_Char(12,1,0x29);
if(count==20)
{count=0;
miao++;
mshi=miao/10;
mge=miao%10;
if(miao==59)
{miao=0;
fen++;
fshi=fen/10;
fge=fen%10;
if(fen==59)
{fen=0;
shi++;
sshi=shi/10;
sge=shi%10;
if(shi==23)
{shi=0;}}
LCD_Write_Char(5,1,'0'+sge);
LCD_Write_Char(4,1,'0'+sshi);}
LCD_Write_Char(8,1,'0'+fge);
LCD_Write_Char(7,1,'0'+fshi);}
LCD_Write_Char(11,1,'0'+mge);
LCD_Write_Char(10,1,'0'+mshi);}
五:
系统功能描述
本系统是基于AT89C52RC单片机控制的温度监控报警系统。
利用DS18B20温度传感器测温,并将数据传送给单片机进行数据处理,最后将数据利用1602液晶显示。
本系统可以设置报警温度,报警温度初值设置为30°C,可以通过按键轻触开关“+”、“-”报警设置温度,当环境温度高于报警温度时,蜂鸣器发出“嘀嗒,嘀嗒”的报警声,同时红色发光二极管闪烁,同时本系统可以利用串口发送数据至计算机,也可以通过计算机下载单片机程序;另外本系统预设计时功能,在上电时开始计时,采用二十四小时制计时。
六:
总结
通过这次综合设计性实验,对c语言在单片机中应用更加熟悉,初步掌握了温度传感器以及LCD和按键等的程序写法。
而且通过实物制作,知道现实与理想的差距,仿真成功不一定实物就能如理想般理想。
需要不断的检测和调试,需要一定的耐心和毅力。