单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告
电气与电子信息工程学院
单片机课程设计
设计题目:
数字式温度计设计与制作
专业班级:
电子信息工程2010
(1)班
学 号:
201040210123
姓名:
XXX
指导教师:
XXXXXXXXX
设计时间:
2013/06/03~2013/06/16
设计地点:
K2—406
单片机课程设计成绩评定表
姓名
学号
201040210123
专业班级
电子信息工程2010
(1)班
课程设计题目:
数字温度计设计与制作
课程设计答辩或质疑记录:
1、单片机时钟电路的作用?
解:
单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。
机器周期不仅对于指令执行有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。
单片机选择了12MHz晶振,那么当定时器的数值加1时,实际经过的时间就是1us,这也是单片机的定时原理。
2、温度传感器接上后,为啥开始总显示85℃?
解:
温度传感器一旦接反就会立刻发热,有可能烧毁!
接反是导致该传感器总是显示85℃的原因。
面对着扁平的那一面,左负右正。
成绩评定依据:
实物制作(40%):
课程设计考勤情况(10%):
课程设计答辩情况(20%):
完成设计任务及报告规范性(30%):
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
2013年6月20日
目录
第一部分课程设计任务书4
一、课程设计题目4
二、课程设计内容4
三、进度安排4
四、基本要求5
五、课程设计考核办法与成绩评定5
第二部分课程设计7
1系统方案选择与论证7
1.1测温电路选取7
1.2显示电路选取7
2系统硬件电路设计7
2.1总体功能介绍7
2.2各功能模块硬件介绍8
3系统软件设计11
3.1系统总程序流图11
3.2系统子程序11
3.3keil调试13
3.4仿真结果14
4实物的组装与调试14
4.1调试结果14
4.2调试问题15
5心得体会15
附录16
附录1:
电路原理图16
附录2:
程序16
附录3:
使用元器件一览表21
参考文献21
第一部分课程设计任务书
2012~2013学年第2学期
学生姓名:
陈庚专业班级:
电子信息工程2010级
(1)班
指导教师:
李玉平王海华工作部门:
电气学院电信教研室
一、课程设计题目:
单片机课程设计
1.简易心率检测仪
6.遥控开关
2.电子时钟的设计与制作
7.水温控制系统
3.电子密码锁的设计与制作
8.音乐播放器的设计与制作
4.数字式温度计的设计与制作
9.多路数据采集系统
5.数字式电压表的设计与制作
10自选
二、课程设计内容
1.根据具体设计课题的技术指标和给定条件,以单片机为核心器件,能独立而正确地进行方案论证和电路设计与制作,要求概念清楚、方案合理、方法正确、步骤完整;
2.熟悉、掌握各种外围接口电路芯片的工作原理和控制方法;
3.熟练使用单片机C/汇编语言进行软件设计;
4.熟练使用Proteus、Keil软件进行仿真电路测试;
5.熟练使用Protel软件设计印刷电路板;
6.学会查阅有关参考资料和手册,并能正确选择有关元器件和参数;
7.撰写设计报告,参考毕业设计论文格式。
注:
详细要求和技术指标见附录。
三、进度安排
1.时间安排
序号
内容
学时安排(天)
1
方案论证和总体设计
2
2
硬件设计
2
3
软件设计
2
4
硬件测试
1
5
撰写和打印设计报告
1
合计
10
设计指导答辩地点:
K2—406
2.执行要求
单片机应用系统设计与制作多个选题,每组不超过3人,为避免雷同,在设计中每个同学所采用的方案不能一样。
四、基本要求
(1)根据要求确定系统设计方案;
(2)绘制系统框图、系统原理总图,印刷电路板图,列出元器件明细表;
(3)计算电路参数和选择元器件,画出软件框图,列出程序清单;
(4)仿真,测试与修改调整;
(5)对设计进行全面总结,写出课程设计报告。
五、课程设计考核办法与成绩评定
根据过程、报告、答辩等确定设计成绩,成绩分优、良、中、及格、不及格五等。
评定项目
基本内涵
分值
设计过程
考勤
10分
答辩
回答问题情况
20分
实物测试
正常无故障运行
40分
设计报告
完成设计任务、报告规范性等情况
30分
90~100分:
优;80~89分:
良;70~79分:
中;60~69分,及格;60分以下:
不及格
第二部分课程设计
1系统方案选择与论证
1.1测温电路选取
方案一:
测温电路的设计,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻
方案二:
考虑使用温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行转换,依次完成设计要求。
比较以上两种方案,很容易看出,采用方案二,能够直接读取温度,而且电路设计比较简单,软件设计容易实现,故实际设计中拟采用方案二。
1.2显示电路选取
方案一:
采用LCD1602液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,显示多样,,显示数据清晰可观。
方案二:
采用LED数码管动态扫描,专门用来显示温度,并且采用动态扫描法与单片机连接时。
通过对比以上二种方案,本设计采用了LCD1602液晶显示屏作为数字式温度计显示模块,因为其价格适中,而且其可显示大量文字,显示多样,,显示数据清晰可观。
2系统硬件电路设计
2.1总体功能介绍
数字式温度计由四部分组成:
1、控制部分主芯片采用单片机AT89C52;2、显示部分采用LCD1602液晶显示屏实现显示环境温度,同时利用单片机定时器实现走时功能;3、温度采集部分采用DS18B20温度传感器采集温度;4、利用LED灯实现高温报警系统。
5、利用按键实现调时功能。
总体设计原理图如下:
2.2各功能模块硬件介绍
2.2.1控制模块
单片机控制模块
该方案是基于STC89C52单片机来实现系统控制。
通过编写程序控制外围电路来控制液晶显示屏,其I/O口的选取也是采取一般的选取方式。
其时钟电路采用12MHZ的时钟晶振。
2.2.2温度采集模块
DS18B20温度采集电路
该部分主要完成对温度信号的采集和转换工作,由DS18B20数字温度传感器及其与单片机的接口部分组成。
数字温度传感器DS18B20把采集到的温度通过数据引脚传到单片机的P3.4口,单片机接受温度并存储。
此部分只用到DS18B20和单片机,硬件很简单。
其测温范围为—10摄氏度到+50摄氏度。
每一片DSl8B20在其ROM中都存有其唯一的48位序列号,在出厂前已写入片内ROM中。
主机在进入操作程序前必须用读ROM(33H)命令将该DSl8B20的序列号读出。
程序可以先跳过ROM,启动所有DSl8B20进行温度变换,之后通过匹配ROM,再逐一地读回每个DSl8B20的温度数据。
其具体测温流程如下图所示。
DS18B20测温流程
2.2.3液晶显示模块
LCD1602液晶显示
通过采集ds18b20的温度,同步显示到LCD显示器上,精确到小数点后两位。
同时在液晶上显示走时功能和最高温度和最低温度。
1602采用标准的16脚接口,其引脚电路功能如下所示
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
2.2.4独立按键和高温报警模块
独立按键电路
高温报警电路
这两个模块均为单片机外围辅助模块,其按键电路主要实现对时间的调节,可实现对时分秒的加减调节;而高温报警电路主要实现对高温提示作用,当温度在正常范围时,D1灯亮,当温度达到高温37度时,D1灯灭,D2灯亮,这样也就实现了报警提示功能。
3系统软件设计
3.1系统总程序流图
系统总的流程图
3.2系统子程序
3.2.1读取温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
DS18B20的各个命令对时序的要求特别严格,所以必须按照所要求的时序才能达到预期的目的,同时,要注意读进来的是高位在后低位在前,共有12位数,小数4位,整数7位,还有一位符号位。
3.2.2时钟走时子程序
该时钟主要通过AT89C52单片机的定时器T0中断实现走时功能,同时通过开关设置时间。
具体程序流程图如下:
3.3keil调试
在keil调试过程中,发现走时总是很慢,不管设置定时器初值,其走时人很慢,而且没多大变化,后来通过询问老师,和自己不停调试,发现时程序延时除了问题,最终将显示程序从主程序移到中断程序中就解决了此问题。
3.4仿真结果
4实物的组装与调试
4.1调试结果
4.2调试问题
刚开始接液晶时,液晶灯亮,但没有显示任何数值,后经过检查,发现是V0脚必须接一滑动变阻器,同时接地,通过调节滑动变阻器的阻值来调节液晶显示器对比度,这样就很好的显示出结果来。
5心得体会
此次课程设计使用单片机实现,在选题中,我们到图书馆,网上查询资料,最终我们小组决定做数字式温度计。
因为这学期刚好开设了单片机课程,所以方案上手还是比较顺利。
在设计过程中,我们发现理论学习是一回事,真正做实物却又感觉确实很难,如调试程序过程就是一个考验人耐心的过程,有时一个很小的问题就要调试好久。
仿真时,出现时钟走时很慢的现象,当时以为是定时器设置初值时出了问题,但不管怎么调,最终还是一样,最终在请教老师后,才知道是程序延时除了问题,把显示程序移到中断程序中就可以了。
在制作实物的时候,我们也遇到不少问题,开始液晶不显示数值,后来通过在液晶14号引脚接滑动变阻器调节才解决这一问题。
但在大家的耐心讨论下,这些问题我们都一一解决了。
最终,我们的数字式温度计也成功制作出来了。
这次课程设计,让我懂得要想真正学好单片机,不光要学好课本知识,还要不断增强自己的实践动手能力,通过做实物,不断积累经验。
同时,我们也学到了团结合作的精神。
附录
附录1:
电路原理图
附录2:
程序
#include
#include
#include
#include
#include
#include
#include
#include"LCD1602.h"
sbitkey1=P1^0;
sbitkey2=P1^1;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
unsignedcharwarn[10]={0x20,0x57,0x41,0x52,0x4e,0x49,0x4e,0x47,'\0'};
unsignedchart[2],*pt,s1num;
unsignedcharcount=0,num=0,num1=0,num2=0;
unsigned
charTempBuffer1[17]={0x2b,0x31,0x32,0x37,0x2e,0x30,0x30,0xdf,0x43,
0x20,0x4C,0x3A,0x2D,0x20,0x35,0x35,'\0'};
unsignedcharTempBuffer0[17]={0x30,0x30,0x3a,0x30,0x30,0x3a,0x30,0x30,
0x20,0x20,0x48,0x3A,0x2B,0x31,0x32,0x35,'\0'};
unsignedcharcodedotcode[4]={0,25,50,75};
voidcovert1(void)
{
unsignedcharx=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]>0x07)
{
TempBuffer1[0]=0x2d;
t[1]=~t[1];
t[0]=~t[0];
x=t[0]+1;
t[0]=x;
if(x>255)
t[1]++;
}
elseTempBuffer1[0]=0x2b;
t[1]<<=4;
t[1]=t[1]&0x70;
x=t[0];
x>>=4;
x=x&0x0f;
t[1]=t[1]|x;
TempBuffer1[1]=t[1]/100+0x30;
if(TempBuffer1[1]==0x30)TempBuffer1[1]=0xfe;
TempBuffer1[2]=(t[1]%100)/10+0x30;
if((TempBuffer1[0]==0x2d)&&(TempBuffer1[2]>2+0x30))
key1=0;
elsekey1=1;
if(TempBuffer1[2]>8+0x30)key2=0;elsekey2=1;
TempBuffer1[3]=(t[1]%100)%10+0x30;
t[0]=t[0]&0x0c;
t[0]>>=2;
x=t[0];
y=dotcode[x];
TempBuffer1[5]=y/10+0x30;
TempBuffer1[6]=y%10+0x30;
}
voiddelay2(unsignedchari)
{
while(i--);
}
voidinit()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
voidtime()
{
if(count==2)
{
count=0;
num++;
TempBuffer0[7]=num%10+0x30;
TempBuffer0[6]=num/10+0x30;
if(num==60)
{
num1++;
num=0;
TempBuffer0[4]=num1%10+0x30;
TempBuffer0[3]=num1/10+0x30;
if(num1==60)
{
num1=0;
num2++;
TempBuffer0[1]=num2%10+0x30;
TempBuffer0[0]=num2/10+0x30;
if(num2==24)
num2=0;
}
}
}
}
voidkeyscan()
{
if(s1==0)
{
delay2(5);
if(s1==0)
{
s1num++;
while(!
s1);
if(s1num==1)
{
TR0=0;
LCD_Write(LCD_COMMAND,0x80+7);
LCD_Write(LCD_COMMAND,0x09);
}
if(s1num==2)
{
LCD_Write1(4);
}
if(s1num==3)
{
LCD_Write1
(1);
}
if(s1num==4)
{
s1num=0;
TR0=1;
LCD_Write(LCD_COMMAND,0x0c);
}
}
}
if(s1num!
=0)
{
if(s2==0)
{
delay2(50);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
num++;
if(num==60)
num=0;
TempBuffer0[7]=num%10+0x30;
TempBuffer0[6]=num/10+0x30;
}
if(s1num==2)
{
num1++;
if(num1==60)
num1=0;
TempBuffer0[4]=num1%10+0x30;
TempBuffer0[3]=num1/10+0x30;
}
if(s1num==3)
{
num2++;
if(num2==24)
num2=0;
TempBuffer0[1]=num2%10+0x30;
TempBuffer0[0]=num2/10+0x30;
}
}
}
}
if(s1num!
=0)
{
if(s3==0)
{
delay2(50);
if(s3==0)
{
while(!
s3);
if(s1num==1)
{
num--;
if(num==0)
num=59;
TempBuffer0[7]=num%10+0x30;
TempBuffer0[6]=num/10+0x30;
}
if(s1num==2)
{
num1--;
if(num1==0)
num1=59;
TempBuffer0[4]=num1%10+0x30;
TempBuffer0[3]=num1/10+0x30;
}
if(s1num==3)
{
num2--;
if(num2==0)
num2=23;
TempBuffer0[1]=num2%10+0x30;
TempBuffer0[0]=num2/10+0x30;
}
}
}
}
}
voidmain()
{
unsignedcharTH=125,TL=-55;
init();
while
(1)
{
pt=ReadTemperature(TH,TL,0x7f);
delay2(100);
keyscan();
time();
covert1();
LCD_Initial();
LCD_Print(0,0,TempBuffer0);
if(TempBuffer1[2]<8+0x30)
LCD_Print(0,1,TempBuffer1);
else
LCD_Print(0,1,warn);
}
}
voidT0_time()interrupt1
{
TH0=0x3c;
TL0=0xb0;
count++;
}
附录3:
使用元器件一览表
组件
数量
组件
数量
STC89C52
一片
30pf瓷片电容
两个
12M晶振
一个
10K排阻
一个
按键
三个
330电阻
一个
LED灯
二个
10k排阻
两个
5v电源
一个
芯片底座
一个
LCD1602液晶
一个
10uf极性电容
一个
参考文献
[1]李朝青,单片机原理及接口技术(简明修订版)[M].北京:
北京航空航天大学出版社,1998
[2]李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[3]金伟正.单线数字温度传感器的原理与应用[J].电子技术与应用,2000
[4]李钢.1-Wire总线数字温度传感器DS18B20原理及应用.现代电子技术[J],2005
[5]苏麟祥.DS1820数字温度传感器的功能特性及其应用.世界采矿快报,
2000(9)
[6]沙占友等.智能化集成温度传感器原理与应用.北京:
机械工业出版社,2002
[7]郭天祥.51单片机C语言教程.北京:
电子工业出版社.
[8]胡汉才.单片机原理及接口技术[M].北京:
清华大学出版社,1996