单片机实习报告文档格式.docx
《单片机实习报告文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实习报告文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
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
图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键可对小时和分钟进行调节。
YY
N
NN
YY
NNY
NNNY
图2-3模块一流程图
2.2.2功能模块2
秒表功能:
模式5为秒表功能,可显示0—9999s。
在此模块中,按UP键奇数次时,秒表计时,相反偶数次时,秒表暂停;
按DN键可对秒表进行清0。
YY
YY
N
Y
图2-4模块二流程图
2.2.3功能模块3
倒计时功能:
模式6为倒计时功能,该倒计时最大可定时99分钟。
在此模块中,按UP键可以调整倒计的时间,按DN键可对倒计时进行暂停,倒计时减到0时,会有一次长鸣,用作标志倒计完成。
图2-5模块三流程图
2.2.4功能模块4
整点报时功能:
模式7为整点报时功能,当显示屏上显示“BS.00”,报时功能关闭,显示“BS.01”,报时功能开启。
在此模块中UP键可选择功能的关闭或开启。
NN
Y
图2-6模块四流程图
2.2.5功能模块5
跑表功能:
模式8为跑表功能,可显示0—99s。
在此模块中,按UP键奇数次时,跑表计时,相反偶数次时,跑表暂停;
按DN键可对跑表进行清0。
NN
YY
图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<
Hour;
i++)
P14=0;
delay(100);
P14=1;
}
}
if(DJ_time&
Mode==6)
DJ_time=0;
P14=0;
delay(200);
P14=1;
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;
n;
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<
Bit==1)P0|=0x80;
}//0.5S中间小数点亮,之后灭,不断循环
switch(Bit)//送位码
case0:
P10=0;
break;
case1:
P11=0;
case2:
P12=0;
case3:
P13=0;
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>
count2=0;
if(Sec2<
=0)
if(Min2<
=0){DJ_time=1;
start_flag2=!
start_flag2;
else{Min2--;
Sec2=59;