单片机实训报告Word文档下载推荐.docx
《单片机实训报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机实训报告Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
第五章附录6
第1章概述
此次实训融合了单片机与C语言的知识,通过利用C语言编写程序将单片机理论知识和实践知识相结合,来提升我们学生对单片机和C语言的综合运用能力。
实训内容是利用动态扫描和定时器1在数码管上显示出从123456开始以1秒的速度往上递增直至123476并保持显示此数,与此同时利用定时器0以500mS速度进行流水灯从左至右移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。
到此保持住。
此次实训改变了以往分组进行的方式,我们自行编写自己的程序。
要求用C语言编写程序,编译无误后将程序带给老师看,对程序进行讲解并回答老师提出的问题,然后将程序下载到单片机实验板上,看实际效果。
因为往往理论上看起来正确的程序并不能保证能达到你要的结果。
我们通过此次的深入学习更加透彻的把理论与实践结合起来,来实现我们学以致用的学习方法和学习态度,能够更加灵活的把单片机知识与C语言知识相结合,让我们尝试到当遇到硬件与软件问题同时存在时解决问题的艰辛。
相信我们通过此次的单片机与C语言综合实训会使我们个方面的专业知识与专业技能得以迅速提升。
第二章思路设计及方案
一、分解总程序
将总程序分为四个小程序,一步一步的将程序写出,然后再将四个小程序融合成总程序。
二、用C语言编写程序
1、分程序1:
利用定时器0以500mS速度进行流水灯从左至右移动。
#include<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
uchara;
uintt;
voidinit();
voidmain()
{
init();
a=0xfe;
P1=a;
while
(1)
{
if(t==10)
{
t=0;
a=_crol_(a,1);
P1=a;
}
}
}
voidtime0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
//进入中断的次数
voidinit()
t=0;
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
2、分程序2:
实验板上流水灯开始全部闪烁,3秒后(用T0定时)流水灯全部关闭。
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
voidinit();
voidmain()
init();
while
(1);
voidtimer0()interrupt1//定时器0中断
TL0=(65536-50000)%256;
t++;
if(t%4==0)//小灯每200毫秒变化一次
P1=~P1;
if(t==60)
TR0=0;
//3秒后关闭定时器0,关闭灯
P1=0xff;
voidinit()
//定时器初始化
3、分程序3:
利用动态扫描和定时器1在数码上显示出从123456开始以1秒的速度往上递增直至123476并保持此数。
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};
sbitdula=P2^6;
sbitwela=P2^7;
uchart,shi,ge;
uintshu;
voiddisplay(uchara0,uchara1,uchara2,uchara3,ucharshi,ucharge);
voiddelay(uintz)//延时子函数
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
voidmain()
shu=56;
TMOD=0x01;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
//定时器初始化
ET1=1;
TR1=1;
display(1,2,3,4,shi,ge);
}
voidtime1()interrupt3//定时器1中断函数
if(t==200)
shu++;
shi=shu/10;
ge=shu%10;
if(shu==76)//当到67时把原来T0中的数清除,重新加裁初值让小灯闪烁
TR1=0;
voiddisplay(uchara0,uchara1,uchara2,uchara3,ucharshi,ucharge)//显示子函数
dula=1;
P0=table[a0];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay
(1);
P0=table[a1];
P0=0xfd;
P0=table[a2];
P0=0xfb;
P0=table[a3];
P0=0xf7;
P0=table[shi];
P0=0xef;
P0=table[ge];
P0=0xdf;
4、分程序4:
数码管上显示HELLO。
#include<
ucharcodetable[]={
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
voiddisplay(ucharone,uchartwo,ucharthree,ucharfour,ucharfive,ucharsix);
voiddelay(uint);
display(16,17,18,18,19,20);
voiddisplay(ucharone,uchartwo,ucharthree,ucharfour,ucharfive,ucharsix)
P0=table[one];
P0=table[two];
P0=table[three];
P0=table[four];
P0=table[five];
P0=table[six];
voiddelay(uintz)
3、分程序汇总
将四个分程序用连接语句进行连接,组成总的程序。
uchara,t0,t1,flag,flag1,shi,ge;
TMOD=0x11;
{if(flag1!
=1)
display(1,2,3,4,shi,ge);
else
display(16,17,18,18,19,20);
voidtime0()interrupt1
t0++;
if(flag!
{if(t0==10)
t0=1;
else{
if(t0%4==0)
P1=~P1;
if(t0==60)
{
TR0=0;
P1=0xff;
flag1=1;
}
voidtimer1()interrupt3
t1++;
if(t1==20)
t1=0;
shu++;
if(shu==76)
flag=1;
t0=0;
}
voiddisplay(uchara0,uchara1,uchara2,uchara3,ucharshi,ucharge)
第3章所得结果及结论
1、编程中所存在的问题
1、在分程序3中,在定时器1中断函数中在图A与图B的区别在于如果按前者编程,最后数码管会从123400开始接着是123456到123476,如果按后者,数码管才会按要求从123456一直累加到123476。
(图A)(图B)
2、在分程序2中,在定时器0中断函数中两图的区别在于如果按前者编程,3秒后流水灯不会关闭,而后者会关闭。
2、实训小结
1、准确分析总程序,将总程序分成几个简短的小程序进行编写。
2、正确使用keil软件,并熟练应用。
3、熟练掌握中断、延时、定时器等主要程序。
4、学会使用连接程序将四个小程序组合成总程序。
5、通过将程序下载到实验板上,能够通过实验板上显示的不足马上分析出程序问题之所在,并要能熟练的去修改。
3、实训结果
在实训的近一个星期里,我基本上每天都能按照要求完成当天的任务。
在最后结果检查中虽然结果不是很完美但也是良好。
我相信这次的实训让我们大家都有收获。
第四章总结与体会
通过这一周的单片机的实训,还有老师的精心指导和同学的帮助,以及在网上找的一些资料,让我有了不少体会。
首先,通过老师对总程序的讲解,让我们对此次实训有一个基本的认识,在自己的心里能够将C语言程序中的数组以及函数的一些知识慢慢的移植到单片机程序编写中。
在编写程序的过程中其中最重要,最麻烦,也是学到和掌握的东西最多的地方就是程序的编写检验。
这样你必须对程序的每部分都很熟悉,掌握每句程序在整个整体的作用,这样出现问题才能根据问题改编程序内容而达到目的,出问题最多的也是这个地方,这证明了我对程序的掌握还有欠缺,不能熟悉的掌握和运用程序,所以不能导致很快很好的完成任务。
当然也还有很多细节方面的失误问题,程序编写上也出现了很多细节的错误,并不能把程序一次性就编写好,这也浪费了很多的时间,这主要也是没有把这方面的知识学扎实。
而我都能通过自己研究,翻阅书籍,请教同学,网上查找资料等方法来解决问题。
能够做到不懂就问,不懂就及时解决。
最后,在开始程序检验时,先通过我们对老师的讲解,及老师对我们提问,使我们自己对程序有了跟进一步的掌握和了解。
在这过程中,发现自己平时基本功不够扎实,不能及时有效的解决问题,而且不能善于思考问题,不能对问题有本质上的了解,而老师的一些点拨让我有些了解,进而解决问题,这次实训还是有了不少收获,对单片机级C语言的的认识更加深了。
第5章附录
参考文献:
《单片机的C语言应用程序设计》马忠梅北京北京航空航天大学出版社2003.11
《51单片机应用基础》