单片机实习报告.docx
《单片机实习报告.docx》由会员分享,可在线阅读,更多相关《单片机实习报告.docx(33页珍藏版)》请在冰豆网上搜索。
单片机实习报告
重庆科技学院
学生实习(实训)总结报告
院(系):
电子信息工程学院专业班级:
_测控普08___
学生姓名:
__曾慧_______学号:
_2008442312_
实习(实训)地点:
__微机接口与原理实验室I506____
报告题目:
___单片机系统综合训练________
报告日期:
2010年7月16日
指导教师评语:
_______________________________________
________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):
指导教师(签字):
_____________________
关于单片机系统综合训练的实习报告
前言
设计目的及意义
系统复习理论知识,熟悉单一功能的硬件设计及软件编程。
了解单片机应用系统的开发步骤,综合应用的软件开发。
掌握单片机开发系统的功能(DP150-P),熟练应用Keil51进行软件开发(编程、调试、下载、运行)。
设计内容及要求
1.重新完成课程试验的题目。
(见试验指导书)
2.资料准备,题目调研,确定题目。
3.系统设计、硬件设计、模块分解。
4.电路板制作(如果需要)、熟悉。
5.详细编程。
6.单元调试。
7.综合调试、运行。
8.撰写实习报告。
实现的功能项目:
①北京时间显示及调整功能。
②秒表功能。
③倒计时功能。
④整点报时功能。
项目①是基本要求,其它项目为加分项目。
项目②、③各加15分,项目④加10分。
编程语言:
C51、汇编。
汇编程序适当加分。
正文
1.开发平台简介
随着单片机的不断发展,以C为主流的单片机高级语言也不断被更多的单片机爱好者和工程师所喜爱。
使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEILuVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
目前,使用C语言进行程序设计已经成为软件开发的一个主流。
用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。
而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。
优化的Cx51C编译器完整的实现了ANSI的C语言标准对8051来说Cx51不是一个通用的C编译器它首先的目标是生成针对8051的最快和最紧凑的代码Cx51具有C编程的弹性和高效的代码和汇编语言的速度。
80C51是MCS-51系列中的一个典型品种;其它厂商以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。
当前常用的80C51系列单片机主要产品有:
Intel的:
80C31、80C51、87C51,80C32、80C52、87C52等;
ATMEL的:
89C51、89C52、89C2051等;
Philips、华邦、Dallas、STC、Siemens(Infineon)等公司的许多产品。
多功能电子时钟开发平台Easy-51实物图
注解:
⑴采用STC8951RC(与标准51指令、脚位完全兼容),支持在线串行ISP下载。
⑵供电方式:
USB供电
⑶串口RS232
⑷4个LED发光管
⑸四位数码管
⑹4个独立式键盘(包含外部中断按键)
⑺一个蜂鸣器
⑻一个PS2接口
⑼1602液晶接口(选配件)
⑽128*64液晶接口,单板支持带字库(ST7920)和不带字库(KS0108)两种128*64液晶.(选配件)
⑾DS18B20温度传感器(选配件)
⑿IrDA红外接收头(选配件)
1.1小系统板原理图
如图1-1所示。
1.2小系统板连线图
1.2.1连线总图
如图1-2所示。
图1.1最小系统板原理图
图1-2连线总图
1.2.2数码显示屏
1.2.3按键
1.2.4LED指示灯
1.2.5蜂鸣器
蜂鸣器
1.3Keil使用简介
首先运行KEIL51软件,接着按下面的步骤建立第一个项目:
(1)点击Project菜单,选择弹出的下拉式菜单中的NewProject,如图1-2。
接着弹出一个标准Windows文件对话窗口,如图1-3。
在“文件名”中输入您的第一个C程序项目名称,这里我们用“test”。
“保存”后的文件扩展名为uv2,这是KEILuVision2项目文件扩展名,以后可以直接点击此文件以打开先前做的项目。
图1-3NewProject菜单
图1-4文件窗口
(2)选择所要的单片机,这里选择常用的Ateml公司的AT89C51。
此时屏幕如图1-4所示。
图1-5选取芯片
(3)首先在项目中创建新的程序文件或加入旧程序文件。
如果您没有现成的程序,那么就要新建一个程序文件。
在KEIL中有一些程序的Demo,在这里我们还是以一个C程序为例介绍如何新建一个C程序和如何加到您的第一个项目中吧。
点击图1-5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也可以通过菜单File-New或快捷键Ctrl+N来实现。
完成上面步骤后,就可以进行程序的编写了。
图1-6新建程序文件
(4)点击图1-5中的3保存新建的程序,也可以用菜单File-Save或快捷键Ctrl+S进行保存。
因是新文件所以保存时会弹出类似图1-3的文件操作窗口,把第一个程序命名为test1.c,保存在项目所在的目录中,这时您会发现程序单词有了不同的颜色,说明KEIL的C语法检查生效了。
如图1-6鼠标在屏幕左边的SourceGroup1文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。
选“AddFiletoGroup‘SourceGroup1’”弹出文件窗口,选择刚刚保存的文件,按ADD按钮,关闭文件窗,程序文件已加到项目中了。
这时在SourceGroup1文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。
图1-7把文件加入到项目文件组中
(5)C程序文件已被加到了项目中了,下面就剩下编译运行了。
这个项目只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用于芯片烧写的HEX文件。
先来看图1-7吧,图中1、2、3都是编译按钮,不同是1是用于编译单个文件。
2是编译链接当前项目,如果先前编译过一次之后文件没有做动编辑改动,这时再点击是不会再次重新编译的。
3是重新编译,每点击一次均会再次编译链接一次,不管程序是否有改动。
在3右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。
5是菜单中的它们。
在4中可以看到编译的错误信息和使用的系统资源情况等,以后我们要查错就靠它了。
6是有一个小放大镜的按钮,这就是开启\关闭调试模式的按钮,它也存在于菜单Debug-Start\StopDebugSession,快捷键为Ctrl+F5。
图1-8编译程序
(6)进入调试模式,软件窗口样式大致如图1-8所示。
图中1为运行,当程序处于停止状态时才有效,2为停止,程序处于运行状态时才有效。
3是复位,模拟芯片的复位,程序回到最开头处执行。
按4可以打开5中的串行调试窗口,这个窗口可以看到从51芯片的串行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。
。
最后要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启\关闭调试模式按钮。
然后就可以进行关闭KEIL等相关操作了。
图1-9调试运行程序
(7)生成HEX文件和最小化系统
先来打开第一个项目,打开它的所在目录,找到test.Uv2的文件就可以打开先前的项目了。
然后右击图1-9中的1项目文件夹,弹出项目功能菜单,选OptionsforTarget’Target1’,弹出项目选项设置窗口,同样先选中项目文件夹图标,这时在Project菜单中也有一样的菜单可选。
打开项目选项窗口,转到Output选项页图1-10所示,图中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建HEX文件,选中它就可以输出HEX文件到指定的路径中。
再将它重新编译一次,很快在编译信息窗口中就显示HEX文件创建到指定的路径中了,如图1-11。
图1-10项目功能菜单
图1-11项目选项窗口
图1-12编译信息窗口
2.软件设计
2.1软件系统功能及流程
2.1.1软件系统功能
该系统可以实现四个功能:
一是北京时间显示及调整功能;二是秒表功能;三是倒计时功能;四是正点报时功能。
各功能相互独立,单独作用,并用按键来选择功能模式,并且每个功能模式对应着一种情况的LED灯显示及数码显示屏显示。
模式0:
北京时间的显示;模式1:
北京时间小时时间的调整及P23口LED灯点亮;模式2:
北京时间分钟时间的调整及P24口LED灯点亮;模式3:
秒表功能计时及P25口LED灯点亮;模式4:
倒计时分钟时间初值设置及P26口LED灯点亮;模式5:
倒计时秒钟时间初值时间设置及P23口和P24口LED灯同时点亮;模式6:
整点报时功能开启或者关闭。
在倒计时功能模式中,用ENT外部中断控制倒计时的开始及暂停。
2.1.2软件系统功能总流程图
开始
定时器。
。
。
?
接收按键
Y
北京时间显示
Mode=0?
N
Y
小时时间调整
Mode=1?
N
Y
分钟时间调整
Mode=2?
N
Y
秒表
功能
Mode=3?
N
Y
倒计时分钟初值设置
Mode=4?
N
Y
倒计时秒钟初值设置
Mode=5?
N
N
Mode=6?
Y
关闭整点报时功能
Y
z_flag==0?
N
开启整点报时功能
Y
z_flag==1?
N
图2-1总体流程图
2.2功能模块
该系统共有四个功能模块:
是北京时间显示及调整功能;是秒表功能;是倒计时功能;④是整点报时功能。
2.2.1北京时间显示及调整功能
模式0状态下是北京时间的显示功能;在模式1状态下,进行小时时间的调整,用UP键使小时时间增加,每按键一次,小时数加一,用DN键使小时时间减少,每按键一次,小时数减一;在模式2状态下,进行分钟时间的调整,同样的,用UP键使分钟时间增加,每按键一次,分钟数加一,用DN键使分钟时间减少,每按键一次,分钟数减一。
2.2.1.1北京时间显示功能流程图
开始
初始化
秒计时开始
数码管显示归零
Y
N
Hour>=24?
小时加1,分归零
Y
N
Min==60?
Y
分加1,秒归零
N
Sec==60?
秒加1,更新数码管显示
Y
N
计时1秒?
图2-2北京时间显示流程图
2.2.1.2北京时间调整功能流程图
N
N
Y
Y
Y
Y
Y
Y
N
N
N
N
小时时间增加
分钟时间增加
下一个Mode
Mode==2?
Mode==1?
分钟时间减少
小时时间减少
Mode==2?
Mode==1?
K_DN==0?
K_UP==0?
初始化
开始
图2-3北京时间调整流程图
2.2.2秒表功能
进入模式3,实现秒表功能:
用UP键控制秒表计时开始和暂停,按键一次,秒表计时开始,再按一次,秒表计时暂停,依次重复;用DN键实现秒表清零功能;功能流程图如图2-4所示。
开始
Y
Y
Y
N
N
N
秒归零
秒>59?
秒加1,毫秒归零
毫秒>99?
毫秒加1
计数达到10ms?
计时开始,更新数码管显示
start_flag==1
初始化
图2-4秒表功能流程图
2.2.3倒计时功能
模式4和模式5实现倒计时功能:
进入模式4后,用UP键来使倒计时分钟时间增加,DN键使倒计时分钟时间减少;进入模式5后,用UP键使倒计时秒钟时间增加,DN键使倒计时秒钟时间减少;倒计时时间初值设置好后,利用外部中断ENT来控制倒计时开始和暂停;流程图如图2-5所示。
开始
N
Y
Y
Y
N
N
d_flag=!
d_flag
倒计时
Fen减1,Miao从59开始倒计时
Fen==0?
Miao==0?
计时清零,更新数码管显示
计时1s?
倒计时开始
d_flag==1
给倒计时时间赋初值
图2-5倒计时功能流程图
2.2.4整点报时功能
模式6是实现整点报时功能的开启和关闭:
进入模式6后,UP键和DN键
N
N
Y
Y
整点报时功能关闭
整点报时功能开启
数码管显示OFF?
数码管显示on?
接收按键
Mode==6
K_UP==0或K_DN==0
初始化
开始
的功能相同,即设置整点报时功能的开启或关闭,通过设置,可以更方便的使用整点报时功能;流程图如图2-6所示。
图2-6整点报时流程图
3.系统操作(使用)说明
该系统可以实现多功能电子时钟功能,如:
时间的显示和调整、秒表、倒计时、整点报时等,各功能实现相互独立。
首先,打开系统开关,数码管显示00.00;进入模式1,调整北京时间小时时间的值,如:
02:
00;进入模式2,调整北京时间分钟时间的值,如:
02:
59;北京时间的调整功能完成;回到模式0,时间显示02:
59,即北京时间的显示功能实现。
然后,进入模式3,数码管显示00.00;按一次UP键,秒表计时开始,再按一次UP键,秒表计时暂停,依次重复功能,并且使用DN键对秒表计时清零,在该功能中,对于毫秒位,设置满100ms就向秒位进1,即秒加1,毫秒位归零再计时。
再次,模式4和模式5是对倒计时功能的实现。
进入模式4后,数码管显示00.00;用UP键来设置倒计时分钟数初值的增加,DN键设置倒计时分钟数初值的减少,如设置为01:
00;进入模式5后,数码管显示01:
00,用UP键来设置倒计时秒数初值的增加,DN键设置倒计时秒数初值的减少,如设置为01:
05;再利用外部中断ENT控制倒计时开始和暂停。
最后,模式6为整点报时功能开启或关闭的设置。
进入模式6后,数码管显示为on或OFF,用UP键或DN键来实现两者之间的切换,且UP键和DN键功能相同,当显示为on时,整点报时功能开启,当显示为OFF时,整点报时功能关闭;整点报时次数为此时刻整点数。
4.实习体会及建议
4.1遇到的主要问题及解决方法
4.1.1蜂鸣器不鸣响
问题:
蜂鸣器不鸣响。
在功能测试时,到整点该报时的时候,蜂鸣器不正常鸣响。
解决办法:
在I/O口定义的时候,没有对蜂鸣器定义,应该在定义的时候,加上语句“sbitP14=P1^4;”。
4.1.2P26口对应的LED灯不亮
问题:
P26口对应的LED灯不亮。
在功能测试时,进入模式4后,P26口对应的LED灯应该点亮,实际中没亮。
解决办法:
if(Mode>7)Mode=0;P2=0xff;
4.1.3倒计时功能不能实现
问题:
倒计时功能不能实现。
在功能测试时,调整了倒计时时间初值后,按下ENT键,倒计时值迅速归零,没有倒计时过程。
解决办法:
在倒计时功能程序中,语句if(d_count>200){d_count=0;flag=1;}后少了语句flag=1,所以数码显示屏不能更新,将该语句加上,倒计时功能则能正常实现。
4.1.4秒表
if(count>=200)
{
count=0;
Sec++;flag=1;
4.1.5d_count=0定义的位置?
4.1.6倒计时功能出错
问题:
倒计时功能出错。
在功能测试时,如设置倒计时初值为00.03,按下ENT键后,倒计时开始,到显示值为00.00,倒计时功能应该停止,但是最后显示值为00.59。
解决办法:
在程序中,语句else{Fen--;Miao=59;}少了后面那个大括弧,使之与前面的if不能对应,加上该括弧即可。
4.1.7秒表时间显示不稳定
问题:
秒表时间显示不稳定。
在功能测试时,进入模式3后,按下UP键,秒表计时开始,再按一下UP键,数码管应显示某一值,但是显示值会突然变为北京时间显示值。
解决办法:
在消抖处理中,消抖处理时间设置得不好,将语句if(K_count>=30)中的30改为40后,功能实现效果就好很多。
4.2本系统的特点
⑴
⑵
⑶
⑷
⑸
⑹
⑺
⑻
4.3可扩展功能
⑴半点报时
⑵
⑶
⑷
⑸
⑹
⑺
⑻
4.4体会
⑴掌握Kell工程的建立和软件的开发。
⑵掌握Kell软件的基本应用。
⑶掌握用Kell直接硬件仿真TX-1C单片机学习板的方法。
⑷提高了自己独立解决问题的能力。
⑸增强了自己的动手能力。
5.程序附录
#include"reg52.h"
#defineTHCO0xee
#defineTLCO0x0
unsignedcharcodeDuan[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x71,0x00};
unsignedcharData_shumaguan[4]={0,0,0,0};
unsignedcharHour=0,Min=0,Sec=0;
unsignedcharFen=0;Miao=0;
bitflag=0;
unsignedcharZDtimeflag=1;
bitSec_flag=0;
bitstart_flag=0;
bitd_flag=0;
bitz_flag=1;
unsignedcharHao_Miao=0,mb_Sec=0;
staticunsignedchartime_count=0;
staticunsignedcharMode=0;
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
sbitP14=P1^4;
sbitK_Mode=P2^0;
sbitK_UP=P2^1;
sbitK_DN=P2^2;
sbitLED1=P2^3;
sbitLED2=P2^4;
sbitLED3=P2^5;
sbitLED4=P2^6;
voiddelay();
voidmain()
{
unsignedchari=0;
TMOD=0x11;
TH0=THCO;
TL0=TLCO;
TR0=1;
ET0=1;
EA=1;
EX0=1;
IT0=1;
while
(1)
{
if(flag==1)
{
if(Mode==0||Mode==1||Mode==2)
{
flag=0;
Data_shumaguan[0]=Hour/10;
Data_shumaguan[1]=Hour%10;
Data_shumaguan[2]=Min/10;
Data_shumaguan[3]=Min%10;
}
if(Mode==3)
{
flag=0;
Data_shumaguan[0]=mb_Sec/10;
Data_shumaguan[1]=mb_Sec%10;
Data_shumaguan[2]=Hao_Miao/10;
Data_shumaguan[3]=Hao_Miao%10;
}
if(Mode==4||Mode==5)
{
flag=0;
Data_shumaguan[0]=Fen/10;
Data_shumaguan[1]=Fen%10;
Data_shumaguan[2]=Miao/10;
Data_shumaguan[3]=Miao%10;
}
if(Mode==6&&z_flag==0)
{
Data_shumaguan[0]=12;
Data_shumaguan[1]=0;
Data_shumaguan[2]=11;
Data_shumaguan[3]=11;
}
if(Mode==6&&z_flag==1)
{
Data_shumaguan[0]=12;
Data_shumaguan[1]=12;
Data_shumaguan[2]=0;
Data_shumaguan[3]=10;
}
}
if(ZDtimeflag==1&&z_flag==1)
{
ZDtimeflag=0;
for(i=0;i{
P14=0;
delay();
P14=1;
delay();
}
}
}
}
voiddelay()
{
unsignedchari=0;
unsignedcharj=0;
for(i=0;i<=200;i++)
{
for(j=0;j<=200;j++);
}
}
voidtimer0()interrupt1
{
staticunsignedcharBit=0;
staticunsignedcharcount=0,K_count=0,d_count=0;
TH0=THCO;
TL0=TLCO;
count++;
if(start_flag==1)
{
time_count++;flag=1;
if(time_count==2)
{
time_count=0;
Hao_Miao++;
if(Hao_Miao>99)
{
Hao_Miao=0;
mb_Sec++;
if(mb_Sec>59){mb_Sec=0;}
}
Sec_flag=1;
}
}
if(count>=200)
{
count=0;
Sec++;flag=1;
if(Sec>=60)
{
Sec=0;
Min++;
if(Min>=60){
Min=0;Hour++;
ZDtimeflag=1;}
if(Min==30)
{
ZDtimeflag=1;
}
if(Hour>=24)Hour=0;
}
}
if(d_flag==1)
{
d_count