单片机实习报告.docx
《单片机实习报告.docx》由会员分享,可在线阅读,更多相关《单片机实习报告.docx(31页珍藏版)》请在冰豆网上搜索。
单片机实习报告
关于单片机系统综合训练的实习报告
前言
目的与意义:
系统复习理论知识,熟悉单一功能的硬件设计及软件编程。
了解单片机应用系统的开发步骤,综合应用的软件开发。
掌握单片机开发系统的功能(DP150-P),熟练应用Keil51进行软件开发(编程、调试、下载、运行)。
实习要求:
1北京时间显示及调整功能。
2秒表功能。
3倒计时功能。
4正点报时功能。
项目①是基本要求,其它项目为加分项目。
项目②、③各加15分,项目④加10分。
编程语言:
C51、汇编。
汇编程序适当加分。
实习任务:
1.重新完成课程试验的题目。
2.资料准备,复习及熟悉开发系统、keil51;硬件系统熟悉。
3.系统设计、硬件设计、模块分解。
4.详细编程。
5.单元调试。
6.综合调试、运行。
7.撰写实习报告,指导教师检查、提交实习总结报告。
主体
1.开发平台简介
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
C51工具包中uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及C51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
图1-1多功能电子时钟开发平台Easy-51实物图
注解:
采用STC8951RC(与标准51指令、脚位完全兼容),支持在线串行ISP下载。
供电方式:
USB供电
串口RS232
4个LED发光管
四位数码管
4个独立式键盘(包含外部中断按键)
一个蜂鸣器
一个PS2接口
1602液晶接口(选配件)
128*64液晶接口,单板支持带字库(ST7920)和不带字库(KS0108)两种128*64液晶.(选配件)
DS18B20温度传感器(选配件)
IrDA红外接收头(选配件)
1.1小系统板原理图
图1-2最小系统板原理图
1.2小系统板连线图
1.2.1连线总图
图1-3最小系统板连线图
1.2.2数码显示屏
图1-4数码显示屏
1.2.3按键
图1-5按键
1.2.4LED指示灯
图1-6LED指示灯
1.2.5蜂鸣器
图1-7蜂鸣器
1.3keil使用简介
1.3.1Keil具体使用
(1)点击Project菜单,选择弹出的下拉式菜单中的NewProject,如图。
然后弹出一个标准Windows文件对话窗口,如图。
在“文件名”中输入第一个C程序项目名称,“张洋.c”。
“保存”后的文件扩展名为uv2。
图1-8NewProject菜单
图1-9文件窗口
接下来会弹出如下对话框,让选择处理器,这里选择Atmel/AT89S51
图1-10选取芯片
接下来会问是否把StartupCode加入到工程,选是即可
图1-11是否添加文件窗口
然后右击SourceGroup1,选择AddFilestoGroup'SourceGroup1',然后弹出一个对话框
图1-12添加文件
然后把“张洋.c”加进去,关闭对话框,在SourceGroup1下找到“张洋.c”,打开文件。
图1-13编写源程序
然后对程序进行编译运行,这个项目只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用于芯片烧写的HEX文件。
编译链接完成以后,点击“OptionsforTarget”,弹出以下活动窗口
图1-14项目选择窗口
在输出选项中选中“创建.HEX文件”,调试选项中选中“U使用”
图1-15选择“创建HEX”文件
图1-16选择“U使用”
点击“确定”,再编译链接一次,生成.hex文件。
1.3.2Keil使用特点
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
使用独立的Keil仿真器时,注意事项:
*仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。
*仿真器上的复位按钮只复位仿真芯片,不复位目标系统。
*仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。
2.软件设计
2.1软件系统功能及流程
N
Y
N
Y
N
Y
N
Y
N
Y
图2-1总体流程图
该软件系统主要是完成一个多功能电子时钟,包含有五个功能,北京时间的显示及调整、秒表功能、倒计时功能、整点报时功能、跑表功能。
当MODE<=4时,为功能模块一;当MODE==5时,为功能模块二;当MODE==6时,为功能模块三;当MODE=7时,为功能模块四;当MODE==8时,为功能模块五。
2.2功能模块
该系统有五个功能模块:
1北京时间显示及调整功能;2秒表功能;3倒计时功能;4跑表功能;5正点报时功能。
图2-2模块图
2.2.1功能模块1
北京时间的显示及调整:
此模块包含5个模式,模式0时显示的为北京时间;模式1为小时的调节;模式2为分钟的调节;模式3显示分秒;模式4可调节分钟;在模式1、2、4中按UP和DN键可对小时和分钟进行调节。
N
Y
YY
N
NN
Y
YY
N
NNY
Y
N
YY
NNNY
图2-3模块一流程图
2.2.2功能模块2
秒表功能:
模式5为秒表功能,可显示0—9999s。
在此模块中,按UP键奇数次时,秒表计时,相反偶数次时,秒表暂停;按DN键可对秒表进行清0。
YY
N
YY
N
N
Y
图2-4模块二流程图
2.2.3功能模块3
倒计时功能:
模式6为倒计时功能,该倒计时最大可定时99分钟。
在此模块中,按UP键可以调整倒计的时间,按DN键可对倒计时进行暂停,倒计时减到0时,会有一次长鸣,用作标志倒计完成。
N
Y
N
Y
N
Y
图2-5模块三流程图
2.2.4功能模块4
整点报时功能:
模式7为整点报时功能,当显示屏上显示“BS.00”,报时功能关闭,显示“BS.01”,报时功能开启。
在此模块中UP键可选择功能的关闭或开启。
NN
Y
Y
图2-6模块四流程图
2.2.5功能模块5
跑表功能:
模式8为跑表功能,可显示0—99s。
在此模块中,按UP键奇数次时,跑表计时,相反偶数次时,跑表暂停;按DN键可对跑表进行清0。
NN
YY
NN
Y
Y
图2-7模块五流程图
3.系统操作说明
此系统主要是运用单片机应用系统的开发,和Keil51软件的编程调试,完成一个简单的多功能电子时钟,电子时钟的基本功能是北京时间的显示及调整,此外还有秒表功能、倒计时功能、整点报时功能、跑表功能,共5个功能模块。
其中除第二个功能模块显示屏小数点不闪动外,其他模块时显示屏上中间小数点0.5s亮,0.5秒灭。
3.1功能模块一——北京时间显示及调整
模式0为北京时间(时分)的显示:
打开开关即为模式0,此时LED灯都不亮,在显示屏上前两位显示小时,后两位显示分钟,中间小数点0.5S亮,0.5S灭。
模式1为北京时间时间的调节:
按MODE键1次进入模式1,LED1灯亮,按UP键小时加1,相反按DN键小时减1。
模式2为北京时间分钟的调节:
按MODE键2次进入模式2,LED2灯亮,按UP键分钟加一,相反按DN键分钟减1。
模式3为北京时间(分秒)的显示:
按MODE键3次进入模式3,LED灯都不亮,显示屏上前两位显示分钟,后两位显示秒钟。
模式4为北京时间分钟的调节:
按MODE键4次进入模式4,LED3灯亮,按UP键分钟加1,相反按DN键分钟减1。
3.2功能模块二——秒表功能
按MODE键5次进入模式5,LED4灯亮,第一次按下UP键,秒表启动,开始计时,第二次按下UP键,秒表暂停,记录的是暂停时刻的数字,若再按一次UP键,秒表又继续计时,按DN键可对秒表进行清0,此秒表最大可计时0—9999s。
3.3功能模块三——倒计时功能
按MODE键6次进入模式6,LED1灯亮,按UP键可对分钟加1,进行定时,按下DN键可对倒计时进行暂停,当倒计时完成后,会有一个声音的提醒,此倒计时最大可定时99分钟。
3.4功能模块四——整点报时功能
按MODE键7次进入模式7,LED2灯亮,此时显示屏上显示“BS.00”或“BS.01”,当显示“BS.00”时表示整点报时功能关闭,当北京时间显示整点时不报时;当显示“BS.01”时整点报时功能开始,当北京时间显示整点时报时,并且几点钟响几次。
3.5功能模块五——跑表功能
按MODE键8次进入模式8,LED灯亮,第一次按下UP键,跑表启动,开始计时,第二次按下UP键,跑表暂停,记录的是暂停时刻的数字,若再按一次UP键,跑表又继续计时,按DN键可对秒表进行清0,此跑表最大可计时99s。
4.实习体会及建议
实习体会:
在学习了数字电子技术、电子线路计算机辅助设计的课程设计后,我们对单片机有了初步的了解,在这次单片机系统综合训练的实习中,在老师和同学的帮助下,系统复习了理论知识,熟悉单一功能的硬件设计及软件编程;了解单片机应用系统的开发步骤,综合应用的软件开发;掌握单片机开发系统的功能(DP150-P),对单片机小系统板STC89C51有了更深的认识,知道芯片的结构,掌握了芯片的工作原理和其具体的使用方法,同时也知道了怎样才能把程序正确的下载到单片机中去;熟练应用Keil51进行软件开发,怎样创建工程,添加文件,编写好的程序编译、链接、调试、下载、运行;对Keil51语言有了更好的理解,知道了常用的一些语法功。
在实习过程中也提高了自己分析问题解决问题的能力,对word、photoshop、画图板等软件有了更进一步的了解,这使我在以后的工作中更加得心应手。
实习建议:
在软件设计过程中,可以从实习要求着手,分成几个功能模块完成,先画整体流程图,在各个模块中又画详细的流程图,这样对程序的后期调试很有帮助,
有问题时很容易得到解决。
4.1遇到的主要问题及解决方法
4.1.1北京时间显示及调整
问题描述:
打开开关,进入模式0时,蜂鸣器会响一次。
问题分析及解决办法:
每次打开开关时显示“00.00”,注意到在倒计时模块中,当倒计时完成时,显示“00.00”,此时有一个声音提醒标志,DJ_time=1,所以当开关打开时蜂鸣器也会响一次,为解决这个问题可以再加一个条件MODE==6,这样打开开关时就不会有提醒声音了。
4.1.2秒表
问题描述:
进入第二个模块时,当按下MODE键,模式为5时,发现秒表不是从0开始计时,而是以第一个模式的秒为初值计时;第二位后的小数点和其他模式一样也在闪动;当计时到255s时又开始归零,而不是9999s。
问题分析及解决办法:
1.秒表没有从0开始计时,是因为在定义时第一个模块与第二个模块的显示字符为同一个,为了加以区分,第二个模块的显示数字定义为Sec1,同时可以加个启动标志start_flag1,此时当MODE==5时,显示屏上“00.00”;
2.第二个小数点一直在闪动,是因为没有注意到,其他模式时都有定义if(count<100&&Bit==1)P0|=0x80,意为0.5S中间小数点亮,之后灭,不断循环,此时应加个条件if(Mode!
=5),这个问题就可以解决;
3.计时到255s时归零重新开始,是因为定义的Sec1的类型不够9999那么长,注意到定义unsignedcharSec1=0,把char改为int,此问题即得到解决。
4.1.3倒计时
问题描述:
定好时间后,按下DN键启动倒计时,显示屏没有变化。
解决办法:
开始以为是初始化出了问题,把unsignedcharSec2=0改为Sec2=59,定好时后按下DN键,此时显示屏可显示倒计时,但是减到“00.59”时显示屏又不动了,然后改为staticunsignedcharSec2=59,这时可以减到“00.00”,但是不会停止。
然后检查程序,加一个条件当减到“00.00”时,start_flag2=!
start_flag2,意为当减到0时,自动暂停倒计时。
就此问题的解决方法我觉得除了上述的减为0,暂停倒计时外还有可以选择使用刷新,倒计时过程中一直刷新显示屏,倒计完成时关闭刷新。
4.1.4整点报时
问题描述:
开启报时功能,发现到整点时未报时。
问题分析及解决办法:
检查程序没有错误,检查定义语句,发现只有“P14=1”,而没有定义蜂鸣器I/O口,应加入sbitP14=P1^4,当重新开启整点报时功能时,北京时间显示整点时可以报时。
4.2本系统的特点
1.系统采用KeilC51生成的目标代码,此软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,生成的目标代码效率非常高,容易理解。
2.系统可实现电子钟的五个功能,各个功能模块独立完成,互补影响。
3.倒计时功能模块中,当倒计时减为“00.00”时,蜂鸣器会长鸣一次,用做提醒倒计完成。
4.3可扩展功能
1倒计时分钟的减
功能模块三倒计时功能中,按UP键分钟加1,DN键实现倒计时的启动或暂停。
在这个模块中,没有对分钟的减1,如果定时99分钟,就需要一直得加到99,很不方便,可以再增加模式实现对分钟的减操作。
如果要实现大于99分钟的倒计时,还可增加模式进行操作。
2整点报时可有多种音乐的选择
功能模块四整点报时功能中,显示“BS.01”报时功能开始时,当北京时间到达整点时,几点钟会响几次声音。
可以增加模式做报时音乐的选择,不同的时间会有不同的音乐响起。
3可多段计数的跑表
功能模块五跑表功能中,按UP键可启动或暂停跑表,按DN键对跑表进行清0。
在这个模块中,跑表不具备存储记忆功能,当按下UP键偶数次时,跑表暂停,只可显示暂停那一刻的时间,可以增加模式,实现对多个时间段记录的跑表。
4指示灯
在整个过程中,模式比较多,LED灯作为区分模式的选择标志,在这里自己做的不是很好,在操作时不容易区分模式。
因为LED灯有四个,模式一般有八九个,这时最好选用8421BCD码,如果模式大于16个就得另外想办法。
5此外还可以加几个功能:
如闹钟功能,其中可设置打开或关闭闹钟,有无贪睡功能;显示年、月、日及调整功能,还可显示星期。
附录:
源程序代码
#include"reg52.h"
#defineTHCO0xee
#defineTLCO0x0
UnsignedcharcodeDuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F};//共阴极数码管,0-9段码表
unsignedcharData_Buffer[4]={0,0,0,0};
//四个数码管显示数值,数组变量定义
unsignedcharHour=0,Min=0,Min2=0,Sec=0,Sec2=0,Sec3=0,Mill_sec=0;
unsignedintSec1=0;
bitflag=0;//1分时间到标志
bitBrush_flag=0;
bitstart_flag1=0;//秒表自启动
bitstart_flag2=0;//倒计时开启
bitstart_flag3=0;//跑表自启动
sbitP10=P1^0;//四个数码管的位码口定义
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
sbitP14=P1^4;//蜂鸣器控制I/O口
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(intn);
unsignedcharZD_time=1;//整点报时
unsignedcharZD_N_flag=0;//整点报时功能开启否
unsignedcharDJ_time=1;//倒计时减到0
unsignedchari;
unsignedcharMode=0;
voidmain()
{
TMOD=0x11;//定时器0初始化
TH0=THCO;
TL0=TLCO;
TR0=1;
ET0=1;
EA=1;
while
(1)
{
if(ZD_time&&ZD_N_flag==1)//整点报时功能开启
{
ZD_time=0;
for(i=0;i{
P14=0;
delay(100);
P14=1;
delay(100);
}
}
if(DJ_time&&Mode==6)
{
DJ_time=0;
P14=0;
delay(200);
P14=1;
delay(200);
}
if(Brush_flag==1)
{
Brush_flag=0;
if(Mode<=2)
{
Data_Buffer[0]=Hour/10;
Data_Buffer[1]=Hour%10;
Data_Buffer[2]=Min/10;
Data_Buffer[3]=Min%10;
}
elseif(Mode<=4)
{
Data_Buffer[0]=Min/10;
Data_Buffer[1]=Min%10;
Data_Buffer[2]=Sec/10;
Data_Buffer[3]=Sec%10;
}
elseif(Mode==5)
{
Data_Buffer[0]=Sec1/1000;
Data_Buffer[1]=Sec1%1000/100;
Data_Buffer[2]=Sec1%100/10;
Data_Buffer[3]=Sec1%10;
}
elseif(Mode==6)
{
Data_Buffer[0]=Min2/10;
Data_Buffer[1]=Min2%10;
Data_Buffer[2]=Sec2/10;
Data_Buffer[3]=Sec2%10;
}
elseif(Mode==7)
{
Data_Buffer[0]=Sec3/10;
Data_Buffer[1]=Sec3%10;
Data_Buffer[2]=Mill_sec/10;
Data_Buffer[3]=Mill_sec%10;
}
elseif(Mode==8)
{
Data_Buffer[0]=8;
Data_Buffer[1]=5;
Data_Buffer[2]=0;
Data_Buffer[3]=ZD_N_flag;
}
}
}
}
voiddelay(intn)
{
unsignedchari,j;
for(i=0;i{
for(j=0;j<250;j++)
{
}
}
}
voidtimer0()interrupt1
{
staticunsignedcharBit=0;//静态变量,退出程序后,值保留
staticunsignedcharcount=0,K_count=0,count1=0,count2=0,count3=0;
TH0=THCO;
TL0=TLCO;
count++;
if(count>=200)//秒计时,定时器定时5ms,计200次为一秒
{
count=0;
Sec++;
if(Sec>=60)
{
Sec=0;
Min++;
if(Min>=60)//时间计时
{
Min=0;Hour++;
ZD_time=1;
if(Hour>=24)Hour=0;
}
}
Brush_flag=1;//更新数码管显示
}
Bit++;
if(Bit>=4)Bit=0;
P1|=0x0f;//先关位码
P0=Duan[Data_Buffer[Bit]];//开段码
if(Mode!
=5)
{
if(count<100&&Bit==1)P0|=0x80;}//0.5S中间小数点亮,之后灭,不断循环
switch(Bit)//送位码
{
case0:
P10=0;break;
case1:
P11=0;break;
case2:
P12=0;break;
case3:
P13=0;break;
}
if(start_flag1==1)//秒表开启
{
count1++;
if(count1>=200)
{
count1=0;
Sec1++;
if(Sec1>9999)
Sec1=0;
}Brush_flag=1;
}
if(start_flag2==1)//倒计时开启
{
count2++;
if(count2>=200)
{
count2=0;
if(Sec2<=0)
{
if(Min2<=0){DJ_time=1;start_flag2=!
start_flag2;}
else{Min2--;Sec2=59;}
}