单片机实训报告.docx
《单片机实训报告.docx》由会员分享,可在线阅读,更多相关《单片机实训报告.docx(16页珍藏版)》请在冰豆网上搜索。
单片机实训报告
单片机应用技术
实训
学院:
机电学院班级:
机电1103
学号:
2011200193姓名:
文君
1、设计题目
利用单片机和按键配合实现LED灯场景控制,循环点亮控制及点亮频率变化控制、7段数码管显示控制
2、设计要求
1、设计一个具有上电复位功能的单片机最小系统。
2、按照设计的单片机最小系统焊接一个实物电路。
3、设计满足程序功能的按键、8个LED灯及7段数码管外围电路。
4、利用单片机进行8个LED灯的循环点亮。
5、通过按键变化8个LED灯循环点亮的频率。
6、通过按键实现不同颜色LED灯的控制。
7、利用单片机和外围数码管电路实现数码显示0到9的数码。
8、给按键赋值,按某个按键显示对应的数码。
3、硬件设计
硬件电路设计原理图:
数码管显示数码6截图:
数码管显示数码1截图:
不同色彩LED灯的控制截图:
8个LED灯跑马灯截图:
At89c51单片机简介:
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
At89c51单片机的主要特点:
1、与MCS-51兼容
2、4K字节可编程闪烁存储器
3、寿命:
1000写/擦循环
4、数据保留时间:
10年
5、全静态工作:
0Hz-24Hz
6、三级程序存储器锁定
7、128*8位内部RAM
8、32可编程I/O线
9、两个16位定时器/计数器
10、5个中断源
11、可编程串行通道
12、低功耗的闲置和掉电模式
13、片内振荡器和时钟电路
4、软件设计流程图
LED跑马灯程序流程图:
数码管程序流程图:
五、重点程序解释
unsignedcharcodedx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
程序解释:
此段代码为共阳极7段数码管0到9十个数码的显示代码
voiddelay20ms()
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
TR0=1;
while(!
TF0)
;
TF0=0;
}
程序解释:
此段程序代码利用51单片机定时器0的准确定时功能,实现精确的20ms延时。
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
程序解释:
此段程序代码利用for循环语句,配合51单片机的指令周期,实现50us的大概延时。
ucharkeyscan()
{
ucharx=0;
P2=0xff;
if(P2!
=0xff)
{
delay_50us(200);
if(P2!
=0xff)
{
switch(P2)
{
case0x7f:
x=1;break;
case0xbf:
x=2;break;
case0xdf:
x=3;break;
case0xef:
x=4;break;
}
}
}
returnx;
}
程序解释:
此段代码是一个带无符号字符型返回值的子函数,实现的是对按键的判断,把单片机的P2口高四位作为按键数据采集位,当对应按键连接的位为低电平,且延时10ms后(程序消抖),仍然判断为低电平,则确定有键按下,并判断出具体按下的是哪个键,同时利用return语句返回按键值到主程序中进行下一步处理。
for(i=0;i<8;i++)
{
P1=~temp;
for(b=0;b{
delay20ms();
}
temp=temp<<1;
}
程序解释:
此for循环完成的是8个LED灯的循环点亮,利用变量n值改变跑马灯循环点亮的频率。
voiddisplay()
{
uintt;
P1=0x1f;
for(t=0;t<8;t++)
{
delay50ms();
}
P1=0xe3;
for(t=0;t<8;t++)
{
delay50ms();
}
P1=0xfc;
for(t=0;t<8;t++)
{
delay50ms();
}
}
程序解释:
此段代码是一个不带返回值的子函数,利用P1口实现三种不同颜色LED灯的场景控制。
switch(keyvalue)
{
case1:
i=1;break;
case2:
i=2;break;
case3:
i=3;break;
case4:
i=4;break;
}
程序解释:
利用switch选择语句,通过按键给变量i赋值,主程序再将i的值显示到7段数码管上。
for(i=0;i<10;i++)
{
P3=dx[i];
for(b=0;b<7;b++)
{
delay50ms();
if(P2!
=0xff)
temp=1;
}
}
程序解释:
利用数组,在数码管上循环显示0到9十个数码,并判断是否有按键按下,如果有按键按下,则进入另外一个while循环,实现按键值的显示。
5、实训总结及感悟
为期两周的单片机应用实训已经结束,我们组基本上完成了老师布置的任务。
第一周周一老师集中讲解了此次单片机应用实训的相关知识点、讲解了单片机最小系统的硬件组成、实训报告的相关要求、并给我们布置了任务。
第一周周二周三我们组成员合作完成了电路原理图的绘制,并在Proteus中进行了仿真电路测试。
第一周周四周五我们组利用keil软件共同完成了满足设计题目要求的源程序编写,并在Proteus中完成了软、硬件的联合调试。
第二周周一周二,我们组按照老师要求,完成了硬件电路的焊接制作,并将程序烧写入51单片机中实现了设计题目的要求。
通过此次单片机实训学习,我们组成员初步学习并掌握了Proteus软件的电路图设计及仿真操作方法,更加深入的了解并掌握了单片机课程中使用到的keilC语言编程软件。
通过设计并制作单片机最小系统环节,我们巩固了单片机课程上所学习的51单片机硬件结构。
在解决并完成满足单片机设计题目要求的过程中,提高了我们编写程序的逻辑思维能力。
在进行软件和硬件仿真的过程中,我们遇到了不少问题,通过解决这些问题,我们发现问题和解决问题的能力得到了显著提高。
在焊接制作实物电路环节,我们开始认为这是一件简单的事情,就是按照设计电路焊接就可以了。
但在实际过程中,才发现原来焊接电路并不如想象中容易,尤其是要得到高质量的电路板。
通过一个下午的焊接练习,我们组员的焊接技能得到了显著提高。
虽然这次实训学习基本完成了老师的要求,但其中也出现了很多问题。
第一、不够细心比如粗心大意焊错了线,在Proteus中设计电路时,接错单片机的I/O口,对C语言的编程语法不熟悉,导致编程软件报错。
第二,是在学习态度上,实训课程的性质本来就是开放的,这需要我们有较强的自制和自学能力。
实际上在实训过程中,我们也有过偷懒的时候,对此我们进行了认真的检讨并及时进行了纠正。
对于这次单片机综合应用课程实训,我的第一大心得体会是作为一名技术人员,要求具备的首要素质绝对应该是严谨,遇到问题时千万不能紧张,要冷静客观地分析解决问题。
第三,是在人生价值观上,作为一个有梦想有责任心的人,我认识到无论做什么事情,都要有担当尤其是在一个团队之中,要敢于挑战项目中出现的各种问题。
你要相信一个事实,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有事情能够难到你。
第四,一个称的上好的、并能高效完成任务的团队,必定是一个懂得团体合作,并能够相互补充的团队。
在我们组进行实训的过程中,我们遇到过很多问题,也产生过不少分歧,最终都是在相互理解和团队合作中解决的。
总的来说,这次实训我受益匪浅,不仅深化了专业知识,提高了实践动手能力,更加强了我与他人交流的能力,相信这次的学习经历,一定会为我以后的学习和工作生活带来正面的影响。
6、制作的电路板照片
单片机实物照片如下图:
LED跑马灯实物显示照片如下图:
单片机数码管外围电路实物显示照片如下图:
7、附程序源代码
1.利用单片机和按键配合实现LED灯场景控制,循环点亮控制及速度变化控制,三色灯的分别控制源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
unsignedcharcodedx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay20ms()
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
TR0=1;
while(!
TF0)
;
TF0=0;
}
voiddelay50ms()
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
while(!
TF0)
;
TF0=0;
}
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
voiddisplay();
ucharkeyscan();
voidmain()
{
unsignedchartemp,i,b,n=1,keyvalue=0;
unsignedintd=2000;
EX0=1;
TMOD=0X01;
EA=1;
while
(1)
{
temp=0x01;
keyvalue=keyscan();
switch(keyvalue)
{
case1:
while
(1){display();}
case4:
n+=2;while(P2!
=0xff);break;
}
for(i=0;i<8;i++)
{
P1=~temp;
for(b=0;b{
delay20ms();
}
temp=temp<<1;
}
}
}
voiddisplay()
{
uintt;
P1=0x1f;
for(t=0;t<8;t++)
{
delay50ms();
}
P1=0xe3;
for(t=0;t<8;t++)
{
delay50ms();
}
P1=0xfc;
for(t=0;t<8;t++)
{
delay50ms();
}
}
ucharkeyscan()
{
ucharx=0;
P2=0xff;
if(P2!
=0xff)
{
delay_50us(200);
if(P2!
=0xff)
{
switch(P2)
{
case0x7f:
x=1;break;
case0xbf:
x=2;break;
case0xdf:
x=3;break;
case0xef:
x=4;break;
}
}
}
returnx;
}
2.通过扩展按键实现对扩展LED数码管的控制源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
unsignedcharcodedx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay50ms()
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
while(!
TF0)
;
TF0=0;
}
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
voiddisplay();
ucharkeyscan();
voidmain()
{
unsignedchari,b,n=1,keyvalue=0,temp=0;
unsignedintd=2000;
EX0=1;
TMOD=0X01;
EA=1;
while
(1)
{
keyvalue=keyscan();
if(P2!
=0xff)
temp=1;
while(temp)
{
keyvalue=keyscan();
switch(keyvalue)
{
case1:
i=1;break;
case2:
i=2;break;
case3:
i=3;break;
case4:
i=4;break;
}
P3=dx[i];
}
for(i=0;i<10;i++)
{
P3=dx[i];
for(b=0;b<7;b++)
{
delay50ms();
if(P2!
=0xff)
temp=1;
}
}
}
}
注:
此处省略重复的按键扫描程序代码。