课程设计报告.docx
- 文档编号:25827861
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:55
- 大小:824.23KB
课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(55页珍藏版)》请在冰豆网上搜索。
课程设计报告
单片机课程设计实验报告
设计题目:
基于单片机的多功能综合应用系统的设计
专业:
电子工程信息
班级:
电嵌Q1241
姓名学号:
指导老师:
摘要
“单片机原理与应用“是电气工程及其自动化、自动化、电子信息工程、通信工程、电气控制等电类相关专业的专业必修课,也是一门应用性很强的课程,而单片机课程设计则是”单片机原理与应用“课程不可缺少的实践教学环节。
单片机课程设计是训练学生运用单片机及其相关知识进行单片机应用系统设计与开发的能力。
本次单片机课程设计基于单片机的基本原理设计了几个具有一定的趣味性、实用性和趣味性的单片机课程设计课程,系统地介绍了单片机课程设计的任务与要求,单片机硬件设计以及课题的设计要求、系统方案、软件设计等内容。
本次单片机课程设计第一部分讲述的是51单片机的基础知识,并运用这些基础知识设计了一些基本的应用,如流水灯、流星雨、左右循环、键盘扫描。
1620LCD显示屏的显示等功能。
第二部分介绍了led点阵的应用。
第三部分系统的介绍了DS28B20传感器的应用。
通过这几个实例的学习让学生通过由浅入深、由易到难的独立单元的训练练习,逐步掌握各种独立环节的硬件电路连接、编程、设计方法与技巧,可进一步提高学生的编程能力和技巧,为以后工作打好良好的基础。
第一章设计说明
1.1设计目的
1.2设计内容及要求
第二章方案分析
2.1方案分析
第三章硬件电路仿真实现
3.1硬件结构分析
3.2基本功能仿真电路图
3.3扩展功能仿真电路图
第四章软件设计实现
4.1软件程序内容
4.2模块分析
4.3程序流程图
4.4程序
第五章系统测试
5.1测试电路
5.2测试结果
5.3测试结果分析
第六章心得体会
第七章参考文献
附录
基于单片机的多功能综合应用系统的设计
第一章设计说明
1.1设计目的
由多个单项设计综合构成一个综合系统的设计,每组可根据本组实际情况进行内容组合选择。
1.2设计内容及要求
第一部分:
基本功能
1.设计并实现具有复位功能的单片机小系统。
2.利用单片机进行左右循环、扩散收缩式移动、流星雨及速度变化控制
3.利用单片机进行灯光的色彩连续变化效果控制。
4.利用单片机进行灯光的三色联动定时控制(以交通灯为例)。
5.配合2至5项中功能,实现液晶屏输出功能或状态信息。
6.以调节5或4项中的时间为例实现基于4X4键盘的输入功能。
第二部分:
基本应用模块
7.数字温度计的设计(要求:
实时显示温度、设置限值温度、超限报警等)
第三部分:
基于仿真的扩展模块
8.16x16点阵LED显示同组同学汉字名。
(利用取字模软件获取数据)。
原件清单
序号
名称、规格
单位
数量/组
组数
备注
1
AT89S51/2
片
1
22
AT89S51
2
连线
把
4
共用
分红、黑、蓝、绿等色
3
12MHz晶振
只
1
22
Crystal
4
47p电容
只
2
22
5
10u电容(电解)
只
1
22
Electrolyticcapacitor
6
0.1u电容
只
1
22
capacitor
7
电阻330Ω
只
10
22
resistor
8
电阻1k
只
10
22
resistor
9
可调电阻10k
只
4
22
10
电阻:
510Ω×8排阻
只
2
22
11
红色LED小灯
只
3
22
LED
12
绿色LED小灯
只
2
22
13
蓝色LED小灯
只
3
22
14
按键式开关
只
1
22
Button
15
拨动式开关
只
6
22
switch
16
面包板
块
1
22
17
74LS04
片
2
22
可换用74LS07/06、74HC245
18
RT1602液晶显示屏
只
1
22
19
DS18B20温度传感器
只
1
22
20
8550三极管
只
1
22
PNP型
21
有源一体蜂鸣器5V
只
1
22
第二章方案分析
方案分析
首先所有功能的实现都是基于单片机这个中心元器件,复位电路和晶振电路就比较固定。
我们可以在P1端口接8个LED灯实现各种LED灯的变化,P2端口接1620液晶显示屏达到显示的功能,P3端口接矩阵键盘实现按键扫描的功能,通过键值控制程序流程的走向。
第三章硬件电路仿真实现
3.3.2复位电路
3.2.3LCD显示电路
3.2.4按键扫描电路
3.3扩展功能仿真电路图
数字温度计仿真图如下:
16x16点阵LED显示仿真图如下:
第四章软件设计实现
4.1软件程序内容
(1)基本功能:
P1端口的LED灯有伸缩扩展(同时有速度的变化)、循环亮灯、流星雨、色彩的连续变化、交通灯功能。
(2)1602液晶驱动程序
(3)键盘扫描程序
(4)DS1802的驱动程序
4.2模块分析
4.2.1交通灯功能实现说明
(1)该控制系统能控制东西南北四个方向的红绿黄灯正常工作。
(2)东西方向绿灯亮,南北方向红灯亮,亮灯30s,此后,东西方向、南北方向黄灯闪烁3下。
然后,东西方向红灯亮南北方向绿灯亮,亮灯30后,东西方向、南北方向黄灯闪烁3下。
如此循环。
(3)相应方向绿灯亮时,同时伴随着喇叭响以提醒盲人可过马路。
(4)当发生紧急情况(交通事故、救护车等),东西方向,南北方向都是红灯亮(可通过外部中断实现此功能)。
4.2.24*4矩阵键盘扫描流程图
4.2.31602驱动程序的流程图
初始化(写模式设置指令)
读状态(忙碌检测)
将显示地址写入
将数据(ASCII码)写入
显示字符
4.2.4数字温度计的设计
基本功能
(1)通过DS18020实时检测温度,并在LCD上显示当前温度的数字值
(2)可设置温度阈值(最低温度、最高温度),当温度高于或者低于阈值时,蜂鸣器响报警。
设计原理
温度计电路设计总体设计:
控制器采用单片机AT89C51,温度传感器感采用DS18B20;用LCD实现温度显示。
模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,处理后的数据送到LCD中显示。
DS18B20的工作时序
DS18B20的工作时序包括初始化时序、写时序和读时序,如下图:
(1)初始化:
单片机将数据线的电平拉低480~960us后释放,等待15~60us,单总线器件即可输出一持续60~240us的低电平(存在脉冲),单片机收到此应答后即可进行操作。
(2)写时序:
当主机将数据线的电平从高拉到低时,形成写时序。
写时序开始后,DS18B20在15~60us期间从数据线上采样。
如果采样到低电平,则向DS18B20写“0”;如果采样到高电平,则向DS18B20写入“1“。
两个独立的时序间需要1us的恢复时间(拉高总线电平)。
(3)读时序:
当主机从DS18B20读取数据时,产生读时序。
此时,主机将数据线的电平从高拉到低使读时序被初始化。
如果此后15us内,主机在总线上采取到低电平,则从DS18B20上读“0“;如果此后15us之内,主机在总线上采取到高电平,则从DS18B20上读”1“。
对DS18B20操作的软件流程图:
4.3程序流程图
第五章系统测试
5.1测试电路
5.2测试结果
5.3测试结果分析
软件部分的测试我们是分模块完成的,各个模块在单独测试的时候还是比较顺利的。
我们把各个模块封装在一个程序或者是一个文件中,然后在主程序中调用或者是添加该文件的.h文件,这时问题就来了,有些功能在单一模块中是一个死循环,放在主程序之后,程序就无法往后执行。
后来想到用break语句强制结束循环。
经过多次测试后,仿真部分的结果总算是出来了。
硬件部分就比较苦恼了,开始我们一遍又一遍的烧程序,但LED灯始终不亮,按键没有反应,我们一遍遍的检查硬件电路,最后经已经测试出结果的同学和汪老师指导,我们不断地调试复位电路和晶振电路,总算是出了部分结果。
硬件部分借鉴了一些同学的电路设计,所以跟软件部分的测试结果有些许不同,不过大同小异啦。
晶振电路还是不太好调出来的,有时候晶振插上去,直接所有的灯全灭,对这点还是有点不理解。
不过基本功能还是实现了,不负半学期的时间吧。
第六章心得体会
张丽兰30总结:
历经半学期的单片机课程设计算是有了一个句点了,在这半学期中,我经历了很多,也收获了许多;途中一波三折,心情也是起起落落;
犹记得第一天汪老师布置完任务的时候,我好迷茫地问了一句:
老师,我们这是要干嘛?
因为大二学习51单片机是基于汇编语言的,当时对汇编语言真的是好反感,又是要背指令,又是程序不具备可读性,那时候就没有好好学,拿到题目顿时觉得无从下手,唯一庆幸的一点是,所有软件的实现都是基于C语言的。
第一节课,老师说让我们画流程图,我们什么都没干,取而代之地是漫无目的的浏览网页,没有画流程图,这大概就是后来我把各部分功能放在一起时,整个人都觉得很凌乱的原因吧。
第二次课有些同学已经上手的时候,我们才开始慢慢摸索起来,我们从最基本的流水灯程序开始,一步一个脚印,慢慢地,发现自己已经对单片机的基本结构有了一个初步的了解。
实现交通灯功能的时候用到了外部中断,当时对这个中断的概念也是模模糊糊,于是,我开始翻阅一些单片机课程设计的相关书籍,写了一些基本的中断程序。
但在实现交通灯功能的时候还是遇到了一些问题,导致无法启动中断,记得当时还拉着老师问了一下,汪老师又给我讲了一下中断的概念,不过竟然没有指出我的仿真电路外部中断端口接错了(后面我自己发现了)。
正因为如此,我对51单片机的中断部分又有了一个比较深入的了解,这还是要感谢汪老师。
像1602液晶的驱动和DS16B20都是之前没有接触到的,但通过这次课程设计,我对这些器件也有了基本的认识,同时也知道了怎么用软件实现它们的功能。
这次单片机课程设计,让我对51单片机有了深入的认识,不再停留在一些理论知识上,而是真正将它同具体的应用联系起来,相信这层认识将推动我今后更深入地学习单片机,同时提高了我将理论知识同具体应用结合起来的能力。
想到这些,真的觉得半个学期的努力都是值得的。
罗婧09总结:
最开始拿到课程设计的题目的时候,其实我们两个都有点懵,毕竟上学期的单片机课程中我们学的是用汇编来写的代码,而且学的还不是很扎实。
后来,网上查了很多资料,在图书馆借了几本书,慢慢的心里才有点底。
一步步的,我们最终把软件部分完成了(这句话我现在说着听起来感觉很轻松的样子,但是当时真的熬了几晚上,每一次进展我们都会激动半天)。
然后真正头疼的时候来了,硬件部分搭好之后还有同学过来看看觉得挺好看的,但是它怎么都不出结果啊!
于是就一遍遍写最简单的程序,一遍遍往芯片里面烧写,最终在一点点改进的过程中“奇迹”般的成功了。
其实,直到现在我都还不是特别清楚它为什么没有出结果,也不知道最后为什么又出结果了,有在实验室的同学说我们做工科的要的就是结果,过程怎样都不重要,只要最后实现想要的功能就好了,也许吧。
这样的机会对我们来说不多但却是非常可贵的,在一次次这样的实验中,我们不停地摸索、总结,积累了我们的实践经验,以便为以后打下牢固的基础。
而这些才是我们作为一名工科学生最宝贵的财富。
非常感谢汪老师,不停地给我们讲设计要求,认真解答我们的问题,从来都没有不耐烦。
通过这次的单片机课程设计,我对单片机的定时器、中断这些难点有了更加清晰的认识,同时也更好地与同伴合作、与人分享与交流,以后再做类似地实验时我一定能做的更好。
第七章参考文献
1.《单片机课程设计指导书》(第1版)北京理工大学出版社作者:
皮大能南光群刘金华2010.7
2.《单片机技术-课程设计与项目实例》中国电力出版社作者:
李海滨等2009.10
3.《Proteus教程-电子线路设计、制版与仿真》清华大学出版社作者:
朱清彗2008.9
4.《单片机C语言应用100例》(第1版)电子大学出版社作者:
王东峰王会亮董冠强2009.3
5.《基于5103K的单片机实验指导书》(内部试用)
6.其它单片机课程教材及参考书
附录源程序
//文件名:
Compile.c
#include
#include
#include
#include
#include
#include
voidbasicFunction_2(void);
voidbasicFunction_4(void);
voidbasicFunction_5(void);
sbitSP1=P2^0;
sbitL1=P2^1;
sbitSP2=P3^2;
sbitled01=P1^0;
sbitled02=P1^1;
sbitled03=P1^2;
unsignedcharpattern;
unsignedcharcodestring1[]={"ExtendFast!
"};
unsignedcharcodestring2[]={"ExtendSlow!
"};
unsignedcharcodestring3[]={"Circle!
"};
unsignedcharcodestring4[]={"StarShower!
"};
unsignedcharcodestring5[]={"TrafficLights!
"};
voidmain()
{
P0=0XF0;
if(SP1==0)
{delay5ms();
if(SP1==0)basicFunction_2();
while(SP1==0);
do{delay5ms();}
while(SP1==0);
}
if(SP1==1)
{
pattern=key_scan();
if(pattern==4)basicFunction_4();
if(pattern==5)basicFunction_5();
}
}
voidbasicFunction_2()
{
unsignedchari,temp,a;
while
(1)
{
pattern=key_scan();
if(pattern==0)
//模式0:
伸缩扩展(快)
while
(1)
{
LcdInitiate();
Lcd_Display(string1);
if(pattern==0)
{
P1=0X7E;delay10ms();
P1=0XBD;delay10ms();
P1=0XDB;delay10ms();
P1=0XE7;delay10ms();
P1=0XDB;delay10ms();
P1=0XBD;delay10ms();
P1=0X7E;delay10ms();
pattern=key_scan();
}
elsebreak;
}
if(pattern==1)
//模式1:
伸缩扩展(慢)
while
(1)
{
if(pattern==1)
{
LcdInitiate();Lcd_Display(string2);
P1=0X7E;delay02s();
P1=0XBD;delay02s();
P1=0XDB;delay02s();
P1=0XE7;delay02s();
P1=0XDB;delay02s();
P1=0XBD;delay02s();
P1=0X7E;delay02s();
pattern=key_scan();
}
elsebreak;
}
if(pattern==2)
//模式2:
左右循环
while
(1)
{
if(pattern==2)
{
LcdInitiate();Lcd_Display(string3);
temp=0x01;
P1=~temp;
delay10ms();
for(i=1;i<8;i++)
{
a=temp<
}
temp=0x80;
for(i=1;i<8;i++)
{
a=temp>>i;P1=~a&0xff;delay10ms();
}
pattern=key_scan();
}
elsebreak;
}
if(pattern==3)
//模式3:
流星雨
while
(1)
{
LcdInitiate();Lcd_Display(string4);
if(pattern==3)
{
P1=0XFE;delay10ms();
P1=0XFC;delay10ms();
P1=0XF8;delay10ms();
P1=0XF0;delay10ms();
P1=0XE0;delay10ms();
P1=0X8F;delay10ms();
P1=0XBF;delay10ms();
P1=0X7F;delay10ms();
P1=0XFF;delay10ms();
pattern=key_scan();
}
elsebreak;
}
}
}
voidbasicFunction_5()
{
unsignedchari;
LcdInitiate();
Lcd_Display(string5);
EX0=1;
IT0=1;
EA=1;
while
(1)
{
P1=0XED;L1=0;delay(30);L1=1;
for(i=0;i<3;i++)
{
P1=0XBB;delay
(1);
P1=0XFF;delay
(1);
}
P1=0XDE;L1=0;delay(30);L1=1;
for(i=0;i<3;i++)
{
P1=0XBB;delay
(1);
P1=0XFF;delay
(1);
}
}
}
//中断处理函数
voidExternal_Intertupt_0()interrupt0
{
while
(1)
{
P1=0XEE;L1=1;
}
}
//文件名key_scan.c
#include
#include
#definedata_keyP3
unsignedcharkey_scan(void)
{
unsignedchari,j;
data_key=0x0f;
i=data_key;
j=0xff;
if(i!
=0xff)
{
delay10ms();
i=data_key;
if(i!
=0xff)
{
data_key=0xf0;
delay10ms();
j=data_key;
i=i+j;
switch(i)
{case0x7e:
j=0;break;
case0xbe:
j=1;break;
case0xde:
j=2;break;
case0xee:
j=3;break;
case0x7d:
j=4;break;
case0xbd:
j=5;break;
case0xdd:
j=6;break;
case0xed:
j=7;break;
case0x7b:
j=8;break;
case0xbb:
j=9;break;
case0xdb:
j=10;break;
case0xeb:
j=11;break;
case0x77:
j=12;break;
case0xb7:
j=13;break;
case0xd7:
j=14;break;
case0xe7:
j=15;break;
default:
j=0xff;break;
}
}
}
return(j);
}
//文件名:
key_scan.h
#ifndef__key_scan_H__
#define__key_scan_H__
charkey_scan(void);
#endif
//文件名lcdShow.c
#include
#include
#include
#defineLcd_dataP0
sbitRS=P2^4;
sbitRW=P2^5;
sbitE=P2^6;
sbitBF=P0^7;
/*****************************************************
函数功能:
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;result=0,不忙
***************************************************/
unsignedcharBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;
returnresult;
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidLcd_WriteCom(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(根据表8-6,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告