单片机跑马灯实验报告

20##年中职骨干教师国家级培训

单片机焊接与调试

实验报告

学员姓名: 

专业:电子电器应用与维修

单位:山西省临猗县第一职业中学

时间:20##年7月23日

实验一  熟悉最小单片机组装及keil的使用

                             

实验题目:

用P1口的P1.0~P1.3作为输入,读取开关K0~K3上的数据,用P1.4~P1.7作为输出,控制发光二极管L0~L3。设晶振频率fosc=12MHz,为更好的观察实验现象,要求程序在延时1S后再执行下一条。

实验目的:熟悉最小单片机组装及STC ISP和keil软件的使用,并进行调试。

实验内容:最小单片机的组装与焊接,熟悉实验环境,掌握keil的使用方法;建立工程,编程,调试并运行程序。

基本要求:能够在计算机上使用相应的软件建立一个工程,应用简单指令编写简单的程序进行编译,并在实验板上调试成功。

实验工具:

1、单片机测试平台:PC机,串口线,并口线,单片机开发板。

2、软件:keil51测试软件,STC软件,串口调试软件,定时器/计数器初值测试软件。

3、万用表,尖嘴钳,斜口钳,镊子,剪刀,螺丝刀(十字/一字),电烙铁,烙铁架,松香,焊锡,清洁棉,工具箱。

电路原理:

    

程序流程:                            

实现小灯随开关闭合亮的程流程图

 

实验步骤:

1、          应的元件组装最小单片电路

成果图

2、          进行编程

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:MOV SP,#60H   ;主程序开始,设置堆栈SP为60H

MOV A,#0FH         

MOV P1,A            ;数据送P1口,设置P1.0~P1.3为输入

NEXT:MOV A,P1       ;读K0~K3上的数据

SWAP A              ;A的低4位与高4位交换

ORL A,#0FH          ;A的高4位不变,低4位为全1

MOV P1,A            ;送数据到L0~L3,设置P1.0~P1.3为输入

LCALL DELAY         ;调用延时子程序

LJMP NEXT           ;循环

单片机跑马灯实验报告

实验体会

单片机是一门应用性和实践性非常强的学科,必须要多动手,多做实验。在本次实验过程中,我们从元器件的焊接开始,逐步完成对单片机端口的输入、输出编程控制。总体来说,如何进行正确的软件编程并完成仿真模拟运行是本次实验的重点也是难点,花费时间和精力也最多。

思考问题:1、想想为什么在更改程序前强调要先暂停程序?

          2、分析参考程序实现延时功能的原理。

3、如何用最少条数的指令实现闪灯程序?

4、能不能让小灯有更多、更复杂的动作方式。

 

第二篇:单片机跑马灯(流水灯)控制实验报告

单片机实验报告

姓名:      学号:

一、      实验实现功能:

1:计数器功能

2:流水灯

二、            具体操作:

1、计数器功能

    数码管的动态显示。每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。

2、流水灯

    当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms。

三、      程序流程图

单片机跑马灯(流水灯)控制实验报告                                                                                    

四、      程序

#include

typedef  unsigned char   uint8;    

typedef  unsigned int    uint16;    //类型定义

sbit P2_1 = P2^1;

sbit P2_2 = P2^2;

sbit P2_3 = P2^3;

sbit P2_4 = P2^4;          //位声明四个数码管开关

sbit Key2 = P3^2;

sbit Key3 = P3^3;                     //位声明2个按键K2和K3

sbit Ledk = P2^0 ;             //LED 开关

void delay(uint16 i);          //延时函数声明

void refresh ();              // 数码管刷新函数声明

void liushuideng();                 //流水灯函数声明

uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

               0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};   

                          //数码管的真值表

uint8 out[4] = {0};            // 数组变量

uint16 counter=0;                //用作计数器的变量

uint16 Time_counter=0;       //用作定时器的变量

void main()                 //主函数

       {

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

              TH0 = 0xFC; 

              TL0 = 0x18;            //定时器初值使每次循环为1ms

              TR0 = 0;              //定时器0开始作

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

           EA = 0;            // 关中断

              while(1)                    //计数器模式

                     {      

                            Ledk =1 ;                                             //led开关关

                            out[0]=number[counter%10];          //取个位

                            out[1]=number[counter%100/10];      //十位

                            out[2]=number[counter%1000/100];    //百位

                            out[3]=number[counter/1000];         //千位

                            if (!Key2)                                    //计数器加1

                                   {

                                            ++counter;                //自加

                                            out[0]=number[counter%10];        //取个位

                                            out[1]=number[counter%100/10];    //十位

                                            out[2]=number[counter%1000/100];  //百位

                                            out[3]=number[counter/1000];      //千位

                                            while(!Key2)                 //等待键盘抬起

                                            refresh();                   //刷新数码管

                                   }

                            refresh();                   //刷新数码管

                         if (!Key3)                   // 进入跑马灯模式

                          liushuideng();

                     }

         }                                            //主函数结束

/*******************延时*************/

void delay(uint16 i)

       {

           uint8 j;                           // 定义局部变量

           for(i;i>0;i--)                 //循环 i*240 次

               for(j=240;j>0;j--);

       }

/************数码管刷新******************/

void refresh ()

       {

             uint8 j;

              for (j=0;j<4;j++)     //四次循环刷新数码管

                   {

                            switch(j)

                                   {

                                      case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;

                                          case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;

                                          case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;

                                          case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;

                     //每次循环只选中一个数码管

                                         default:break;

                                   }

                            P0 = out[j];     // 位选,给数码管送值

                            delay (20);      //延时消抖

                     }

       }

/*************定时器的中断服务函数**************/

void Timer0_Overflow() interrupt 1   //定时器0溢出中断,这个语句1ms执行一次

       {

              TH0 = 0xFC;

              TL0 = 0x18;                //每1ms重新赋定时器初值  

              Time_counter++;          //计数,看经过了几个1ms  

       }

/***********************流水灯子函数****************************/   

void liushuideng()

   {      

                uint8 j = 0 ;             //定义局部变量

                P0 = 0xff;          // 小灯全关

                TR0 = 1;            //定时器1开始计时

             EA = 1;                   //中断开放

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

             while(1)

                {

                     Ledk = 0 ;      //打开LED开关

                       P2 = P2|0x1E;        //关掉数码管

                 if(50 == Time_counter)    //50个毫秒

                          {  

                                 P0=~(1<

                                     Time_counter = 0;       //清零开始下一次循环定时 

                          }  

                 if (8==j)           //移完8次再重新移

                              {

                                  j=0;

                              }

                      

                }

       }

相关推荐