单片机实训报告

单片机实训报告

            

姓名

         学号:

         班级:

         指导老师:

         实训时间:


前言

     一周的单片机实训很快就结束咯,在这一周的时间里,我学到了很多关于单片机各方面的知识。老师在实训课中也教会咯我们很多关于单片机软件编程与硬件设施的知识。

一周的实训中我们一共实训咯好几个项目,通过这几个项目的实训,我们掌握咯一些单片机的汇编语言和硬件调试,达到了很好的效果。

一周时间实训过后,我把之前在课堂上不懂的知识点,通过实际操作的练习,我都搞明白咯。当然在实训过程中也遇到咯很多问题,就是有时在调试方面不能调试成功,有时程序是没有错误,但是就是调试不好,一直找原因也找不出是什么原因。

希望以后能够拥有更多的实训时间和机会学习单片机。

实训任务一

一、实验目的

熟悉Keil C51集成开发环境的使用方法

二、实验设备及器件

IBM PC机             一台

三、实验内容

按照本书的第2章的2.1节到2.4节内容进行Keil C51集成开发环境的安装和使用练习。然后按照以下内容建立文件并编译产生HEX文件。

ORG  8000H

LJMP Main

ORG  80F0H

Main:

MOV R7,#0

LOOP:

MOV R6,#0

DJNZ R6,$

DJNZ R6,$

DJNZ R6,$

DJNZ R6,$

DJNZ R7,LOOP     ;延时

CPL    P1.0         ;P1.0取反

CPL    P1.1          ;P1.1取反

CPL    P1.2         ;P1.2取反

CPL    P1.3         ;P1.3取反

CPL    P1.4         ;P1.4取反

CPL    P1.5         ;P1.5取反

CPL    P1.6         ;P1.6取反

CPL    P1.7         ;P1.7取反

SJMP Main

END

通过该程序实现八盏灯的同时亮和同时灭的功能,更好的掌握汇编指令。

4、实验要求:熟练掌握结合DP-51PROC单片机综合仿真实验仪和Keil C51集成开发环境进行仿真调试。如果还有时间,可以把本书的第2章的2.6节、2.7节内容也看一下

5、实验步骤:

(1)用40针排线把DP-51PROC实验仪上的A1区J76接口和A2区J79接口相连,然后使用排线把A2区的J61接口与D1区的J52接口相连。如图所示。

2、对DP-51PROC实验仪上电,然后按照本书的第2章的2.5.1小节设置TKSMonitor51仿真器和使用软件DPFlash把MON51监控程序下载到TKSMonitor51仿真器。

3、关闭DPFlash软件。把TKSMonitor51仿真器的工作模式选择开关切换到RUN处,然后按一下复位键(RST),MON51程序就开始运行了。此时,TKSMonitor51仿真器进入调试状态。

4、用户使用Keil C51集成开发环境建立工程、编辑与编译“实验内容”所列的程序。然后按照本书的第2章2.5.3节的第2点(软件调试环境的设置)设置好,然后再编译一次。

5、此时用户就可以按照本书的第2章2.5.4节所讲述的方法进行仿真调试。如果用户在退出仿真调试模式后想再次进入仿真调试,可以先按一下TKSMonitor51仿真器的复位键(RST)。用户可以在仿真调试环境下设置断点、单步、全速运行等。在调试过程中用户可以看见D1区的LED的亮灭是由用户程序来控制的。

实验任务二:

一、实验目的:利用单片机的P1口作IO口,使用户学会利用

                 P1口作为输入和输出口。

二、实验设备及器件:

IBM PC机                                         一台

DP-51PROC单片机综合仿真实验仪           一台

三、实验内容

1.编写一段程序,用P1口作为控制端口,使D1区的LED轮流亮。

四、实验要求

学会使用单片机的P1口作IO口,如果有时间用户也可以利用P3口作IO口来做该实验

五、实验步骤

1、用导线把A2区的J61接口与D1区的J52接口相连。原理如图所示。

2、先编写一个延时程序。

3、将LED轮流亮的程序编写完整并调试运行


六、实验程序:

ORG  8000H

LJMP Main

ORG  8100H

Main:

MOV A,#0FFH

CLR   C

MainLoop:

CALL  Delay

RLC    A

MOV     P1,A         ;把A的值输出到P1口

SJMP      MainLoop

Delay:                       ;延时

MOV R7,#0

LOOP:

MOV R6,#0

DJNZ R6,$

DJNZ R6,$

DJNZ R6,$

DJNZ R7,LOOP

RET

END

七、实验结果:通过调试成功之后,八盏灯依次向左点亮,实现流水灯程序的功能。


实训总结

通过这次实训,使我们能够学以致用,在实践中进一步掌握并巩固我们的单片机理论知识。虽然在实训中遇到了不少难题与困惑,暴露出了不少问题和缺乏实践的弱点,但是在老师与同学们的帮助与指导下,我们最终解决与克服了一个个的困难与困惑,顺利的完成了老师交给的实训任务。

通过几天下来的实训,感觉就是自己的知识实在是太浅了。在课本上学到的知识感觉自己都懂了,但在实际应用中还是无从下手。所以我们不应满足于课本上的知识,只有通过不断的实践,才能够真正掌握理论知识。虽然只有几天的时光,但还是学了很多的东西,比之于平常的上课更觉得学到更多。所以,这对于我们还是一门很必要的课程。当然,要真正学有所用,我们还要在实践中去不断提高,不断完善。

其实刚开始还是不太喜欢实训,也有点害怕的。但过后才觉得只有几天的实训时间还是有点少,毕竟是刚开始对单片机进行实际应用,还是很陌生的。由于时间的仓促,自己的作品也远还没达到完善的地步。

 

第二篇:单片机实训报告模板

项目一 万年历

班级:   学号:    姓名:

一、任务目的

   通过对万年历的设计和制作,应用了单片机的数码管、键盘接口技术,以及定时/计数器、中断等程序设计技术,进一步训练了单片机并行I/O端口的应用能力、循环程序设计、键盘查询程序设计和调试能力,让同学们初步了解了作为单片机的重要输入设备——键盘接口技术和程序设计方法。

二、设计要求

    用单片机设计一个在数码管能同时显示年月日时分秒,具体要求:根据提供的单片机,设计出万年历的硬件电路,编写软件,用Proteus进行仿真实验,然后进行实物的软硬件调试,并撰写符合要求的实训报告。

三、系统硬件电路设计

   可分为最小系统、数码管显示、按键三个单元电路,要求画出各部分电路图,写出工作原理。

最小系统:

数码管显示:

按键:

                                                                    

四、软件设计

主流程图:

                                                                     流程图:

 软件设计有三部分:计时(区分大小月与平月)、显示、校时(使用按键)。

#include <reg51.h>

unsigned char msec,sec,min,hou,day=20,mon=3,ci;/*定义msec50ms计数变量,sec为秒变量,min为分变量,hou为时变量,day为天变量,mon为月变量,ci为循环次数 */

int year=2013;/*定义year为年变量,定义起始年为20##*/

sbit P30=P3^0;/*通过sbit定义可位寻址变量*/

sbit P32=P3^2;

sbit P33=P3^3;

sbit P34=P3^4;

void delay(unsigned char i)/*延时函数,当i=1时,延时255微秒*/

  { unsigned char j,k;

   for(k=0;k<i;k++)

    for(j=0;j<255;j++);}   

 //函数名:T0_INT

 //函数功能:定时器0中断函数,50ms定时时间到,自动执行该函数,判断是否中断20

 //形式参数:无

 //返回值:无

void T0_INT() interrupt 1//定时器0中断类型号为1                           

{TH0=0x3c;                   //50ms定时初值

TL0=0xb0;

msec++;                       //中断次数增1

  if(msec==20)            //中断次数为20次么?

  {msec=0;                  //是,1s计时到,50ms计数变量清零

  sec++;                 //秒变量加1

  if(sec==60)         //60s么?

  {sec=0;               //是,1分计时到,秒变量清零

  min++;              //分变量加1

  if(min==60)             //60分么?

 { min=0;               //是,1小时计时到,分变量清零

  hou++;               //时变量加1

  if(hou==24)             //24时么?

 { hou=0;               //是,1天计时到,时变量清零

  day++;               //天变量加1

  if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)//月是为1,3,5,7,8,10,12么?

{if(day==32){day=1;mon++;} }     //是,天到32么?是,天变量复位为1,月变量加1

 else if( mon==2)                      //月是为2么?

 {if(day==29){day=1;mon++;}}         //是,天到29么?是,天变量复位为1,月变量加1

  else                                                    //月是为4,6,9,11么?

 {if(day==31){day=1;mon++;}}    //是,天到31么?是,天变量复位为1,月变量加1

  if(mon==13)                                           //月到13么?

 { mon=1;                                 //是,1年计时到,月变量复位到1

  year++;}}}}}}                                                    //年变量加1

void main()                                                             //主函数

{unsignedcharled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义数字0~9字型显示码,数码管共阴

TMOD=0x01;                            //定时器0工作方式1

TR0=1;                                                                         //启动定时器

TH0=0x3c;                                                                 //50ms定时初值

TL0=0xb0;

EA=1;                                                                         //开总中断

ET0=1;                                                                  //定时器0中断

while(1)                                                                                              

{if(P30==1)                                     //P3.0=1么?(开关是开启的么?)

{ for(ci=1;ci<=10;ci++)                      //for循环,ci的初值为1,判断ci<=10,若小于等于10循环,ci+1,若大于10跳出循环

{P2=0x00;P0=led[sec%10];delay(2); //选中P20x00时控制的数码管,显示秒个位

P2=0x01;P0=led[sec/10];delay(2);  //选中P20x01时控制的数码管,显示秒十位

P2=0x02;P0=led[min%10];delay(2); //选中P20x02时控制的数码管,显示分个位

P2=0x03;P0=led[min/10];delay(2);     //选中P20x03时控制的数码管,显示分十位

P2=0x04;P0=led[hou%10];delay(2); //选中P20x04时控制的数码管,显示时个位

P2=0x05;P0=led[hou/10];delay(2);} //选中P20x05时控制的数码管,显示时十位                                                                                                

if(P32==0)                                                  //P3.2=0么?按钮按下么?

{delay(55);if(P32==0) {sec++;}if(sec==60) {sec=0;}} //是,延时55*255um;P3.2=0么?是,秒变量加1;秒到60么?是,秒变量清零

if(P33==0)                                                  //P3.3=0么?按钮按下么?

{delay(55);if(P33==0) {min++;}if(min==60) {min=0;}} //是,延时55*255um;P3.3=0么?是,分变量加1;分到60么?是,分变量清零

if(P34==0)                                            //P3.4=0么?按钮按下么?

{delay(55);if(P34==0) {hou++;}if(hou==24) {hou=0;}}} //是,延时55*255um;P3.4=0么?是,时变量加1;时到24么?是,时变量清零

else if(P30==0)                         //P3.0=0么?(开关是闭合的么?)

 {for(ci=1;ci<=10;ci++) //for循环,ci的初值为1,判断ci<=10,若小于等于10循环,ci+1,若大于10跳出循环

{P2=0x00;P0=led[day%10];delay(2);       //选中P20x00时控制的数码管,显示天个位

P2=0x01;P0=led[day/10];delay(2);      //选中P20x01时控制的数码管,显示天十位

P2=0x02;P0=led[mon%10];delay(2);  //选中P20x02时控制的数码管,显示月个位

P2=0x03;P0=led[mon/10];delay(2);    //选中P20x03时控制的数码管,显示月十位

P2=0x04;P0=led[year%10];delay(2); //选中P20x04时控制的数码管,显示年个位

P2=0x05;P0=led[year/10%10];delay(2); //选中P20x05时控制的数码管,显示年十位

P2=0x06;P0=led[year/100%10];delay(2); //选中P20x06时控制的数码管,显示年百位

P2=0x07;P0=led[year/1000];delay(2);} //选中P20x07时控制的数码管,显示年千位

if(P32==0)                      //P3.2=0么?按钮按下么?

{delay(50);if(P32==0) {day++;}if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)  //是,延时50*255um;P3.2=0么?是,天变量加1;月是为1,3,5,7,8,10,12么?

  {if(day==32){day=1;} }  //是,天到32么?是,天变量复位为1

    else if( mon==2)                                            //月是为2么?

     {if(day==29){day=1;}} //是,天到29么?是,天变量复位为1

       else                                                //月是为4,6,9,11么?

        {if(day==31){day=1;}}} //是,天到31么?是,天变量复位为1

if(P33==0)                                                  //P3.3=0么?按钮按下么?

{delay(50);if(P33==0) {mon++;}if(mon==13) {mon=1;}}   //是,延时50*255um;P3.3=0么?是,月变量加1;月到13么?是,月变量复位为1

if(P34==0)                                       //P3.4=0么?按钮按下么?

{delay(50);if(P34==0) {year++;}}} //是,延时50*255um;P3.3=0么?是,年变量加1

 else {;}}}

五、系统调试

   画proteus图,了解单片机最小系统,选用的元件有AT89C51,共阴的蓝色的8位数码管(7SEG-MPX8-CC-BLUE),三八译码器(74HC138),按钮(BUTTON),普通电容(CAP),极性电容(CAP-ELEC),晶体管(CRYSTAL),10K电阻(RES),排阻(RESPACK-8),单刀单匝开关(SWITCH),将电路连接完整。

编写程序。

编译程序并导入画好的proteus中,查看情况,调试。

在调试过程中,我们先编写的是时分秒的数字钟的显示,在最开始的时候数码管全部显示8,经后来查程序发现程序内少了计时器开启的命令,所以数码管没有时间跳动。在时分秒显示后,我们开始将年月日加进去,在P3.0口接入单刀单匝开关,当开关断开时显示的是时分秒,开关闭合时是显示年月日。然后调试时发现开关没用,后来问同学知道,P3.0是不能直接用的,所以要用sbit来定义可位寻址变量的,改正后可以变换了。最后编写校时的程序,在调试校时这部分时当我们按下按键的时候会跳掉好几个数,后来经老师解答知道那是抖动,所以要消抖,消抖后虽然好了点,但是还是会有数字跳动的,后来在课堂上知道了是所有的程序运作是要时间的,之前占用的时间太多会让后面的校时有错的,所以在显示的部分用了for的循环语句。最后是区分大小月和平月,这程序是在放在计时和校时的部分的。

六、心得体会

   经过这次练习,我对单片机的应用有了更深的认识了,而且还记住了以前总是记不住的单片机的最小系统。从最开始的觉得C语言编万年历太难了,到后来觉得这个万年历也不是很难的。在编程序的时候必须要认真仔细,防止不必要的错误。

相关推荐