《单片机原理与应用》课程实验报告:定时计数中断综合控制实验

           

《单片机原理与应用》课程

课程实验报告

实验三  定时/计数+中断综合控制实验

  • 实验目的
    1. 学习AT89S51内部定时器/计数器的使用和编程方法;
    2. 掌握中断处理程序的编程方法。
    3. 学习蜂鸣器的使用方法
  • 实验内容与步骤
    1. 将定时器/计数器T0作定时器使用,编制程序用T0控制P1.0端口线输出1

    Hz的方波,使LED闪烁。(参考例7-1,仿真实现)

    2. 实物实现上述功能(实验开发板实现,连接8只LED灯的输出端口需改成P2口)

    (现场验收点1:仿真和实物同时演示结果。)

    3. 计数器+中断综合应用实验:采用T1的计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1.0口的LED闪烁不停(图如下,程序参考例题7-2 ,基于KEIL+Proteus仿真实现)。

    4. 基于开发板以实物方式实现步骤3中的功能,此时需将连接8只LED灯的输出端口改成P2口,计数输入引脚T1(P3.5)实际对应开发板上的K5(即不变)。

    (现场验收点2:仿真和实物同时演示结果。)

    1. 蜂鸣器运用:用单片机驱动蜂鸣器,发出0.5KHz的声音,仿真图可参考例题7-3。(1)先用示波器仿真输出,程序参考例题7-3;(2)然后用开发板蜂鸣器输出,开发板蜂鸣器连接关系见下面的开发板蜂鸣器连接关系图;(3)然后参照PPT中例题7-4的前半部分,即“参照7-3修改得到的1KHz单音程序”部分,实现开发板的1kHz的输出,并比较出与0.5KHz声音的差别。

    提醒:开发板实物实现时,需将仿真时连到P1.0端口的蜂鸣器改成P2.1端口。

    仿真参考图: 

    开发板蜂鸣器连接关系图:

         

    三、 实验环境

    Keil软件,proteus仿真软件,51开发板,PC机。

  • 实验系统的总体设计
  • //1

    2//

    4//

    5//

                

    五、 实验系统的详细设计与实验过程

    1. 仿真部分:

    1. 用仿真软件proteus画原理图;

    //定时器/计数器T0作定时器

    //计数器+中断综合应用实验

    //示波器

    //蜂鸣器

    //门铃

    (原始版本)

    (修改版本)可运行,有声音

    1. 用keil软件编写功能程序并生成hex文件

    (4)加载(烧写)程序,调试并记录实验现象;

    1. 实物开发板部分:

    //定时器/计数器T0作定时器

    //计数器+中断综合应用实验(GIF文件)

    //示波器(已演示)

    //蜂鸣器(已演示)

  • 程序代码
  • //定时器/计数器T0作定时器

    #include <REGX51.H>

    unsigned char i=100;

    void Delay(unsigned int xms)

    {

    unsigned char i,j;

      while(xms–)

      {

            i=2;

            j=239;

            do

            {

            while(–j);

            }while(–i);

      }

    }

    void main()

    {

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

      TH0=0xee;//设置定时器初始值

      TL0=0x00;//

      P1=0x00;//P1口八个LED灯点亮

      EA=1;//总是中断允许

      ET0=1;//允许定时器T0中断

      TR0=1;//启动定时器

      while(1)//循环等待

      {

     

      }

    }

    void timer0() interrupt 1  //T0中断

    {

      TH0=0xee;//重新赋值

      TL0=0x00;//

      i–;//循环减1

      for(;;)

      {

            P1=~P1;//取反

            Delay(500);

            P1=~P1;

            Delay(500);

            i=100;//重复循环次数

      }

    }

    //计数器+中断综合应用实验

    #include <REGX52.H>

    void Delay(unsigned int i)

    {

      unsigned int j;

      for(;i>0;i–)

      for(j=0;j<125;j++)

      {;}

    }

    void main()

    {

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

      TH1=0xff;//设置定时器初始值

      TL1=0xfc;//

      //P2=0x00;//P1口八个LED灯点亮

      EA=1;//总是中断允许

      ET1=1;//允许定时器T0中断

      TR1=1;//启动定时器

      while(1)//循环等待

      {

     

      }

    }

    void T1_int(void) interrupt 3  //T1中断

    {

     

      for(;;)

      {

            P2=0xff;

            Delay(500);

            P2=0;

            Delay(500);

     

      }

    }

    //示波器

    #include <reg51.h>

    sbit P1_0=P1^0;

    void main(void)

    {

         TMOD=0x01;

         TR0=1;

         while(1)

         {

         TH0=0xfc;

         TL0=0x18;

         do{}

               while(!TF0);

         P1_0=!P1_0;

         TF0=0; 

         }

    }

    //蜂鸣器

    #include <reg51.h>

    sbit sound=P2^1;

    #define f1(a) (65536-a)/256

    #define f2(a) (65536-a)%256

    unsigned int i = 500;

    unsigned int j = 0;

    void main(void)

    {

         EA=1;

         ET1=1;

         TMOD=0x10;

         TH1=f1(i);

         TL1=f2(i);

         TR1=1;

         while(1)

         {

               i=460;

               while(j<2000);

               j=0;

               i=360;

               while(j<2000);

               j=0;

         }

    }

    void Tl(void) interrupt 3 using 0

    {

         TR1= 0;

         sound=~sound;

         TH1=f1(i);

         TL1=f2(i);

         j++;

         TR1=1;

    }

    //门铃

          #include <REGX51.H>

    typedef unsigned char u8;

    typedef unsigned int u16;

    sbit BEEP=P2^5;

    sbit K1=P3^1;

     u8 ding,dong,flag,stop;

     u16 n;

     void delay(u16 i)

     {

         while(i–);

          

     }

     void time0init()//定时器初始化

     {

         TMOD=0x01;//方式0

          TH0=0xff;

          TL0=0x06;//定时250us

                           //TR0=1

          EA=1;

          ET0=1;

     }

     void biaohaoinit()

     {

         ding=0;

         dong=0;

         n=0;

         flag=0;

         stop=0;

     }

     void main()

     {

         time0init();

         biaohaoinit();

         while(1)

          {

            if(K1==0)//按下按键

               {

                     delay(1000);//消抖

                     if(K1==0)

                     {

                           TR0=1;//打开定时器

                           while(!stop);

                      }

                }  

          }

     }

     void time0() interrupt 1

     {

          n++;

          TH0=0xff;

          TL0=0x06;//250us

          if(n==2000)//定时0.5m,ding 0.5, dong 0.5

          {

               n=0;

                if(flag==0)

                {

                flag=~flag;

                }

                else

                {

                     flag=0;

                     stop=1;

                     TR0=0; //close 计时器

                }

         }

          if(flag==0)

          {                     //改变定时器计数时间来改变声音

                     ding++;

                     if(ding==1)

                {

                           ding=0;

                           BEEP=~BEEP;

                }

          }

          else

          {

                     dong++;

                if(dong==2)//咚

                {

                     dong=0;

                      BEEP=~BEEP;

                }

          }

     }

        

  • 实验结果
  • //定时器/计数器T0作定时器

       LED八个灯闪烁交替亮灯

    //计数器+中断综合应用实验

       按下按钮K5 ,四次之后LED八个灯开始亮灯

    //示波器

       模拟显示示波器频率波动

    //蜂鸣器

       单片机蜂鸣器以1Khz/0.5Khz的频率交替鸣响

    //门铃

       蜂鸣器发出叮咚的声音

  •  实验分析与总结
    1. LED交替闪烁中,给LED中断中加入延时500ms,以达到交替闪烁,刚开始没有看清实验,导致时间有点久。
    2. 此实验中,仿真实验和真实的开发板有一定的差距,仿真中按4次K按键,灯开始亮灯,开发板中按键3次就亮灯,可能程序没有消抖的原因。
    3. 示波器A接口中频率波动产生。实验中需要熟悉代码的作用。
    4. 0.5KHZ与1KHZ的区别在于前者声音低,后者声音高。
    5. 代码问题:运行无错误。门铃仿真中存在问题:各个线路正常,高低电平正常,门铃不会鸣响。开发板中问题:门铃未响。解决中发现仿真中的喇叭使用错误,仿真图中有改正。

    总结:此次实验对中断寄存有了一定的了解,但对一些错误的点还是不能熟练的找到,对于后期的练习还是非常有必要的,同时原理和对开发板的熟悉是必不可少的。

    《单片机原理与应用》课程

    课程实验报告

    实验三  定时/计数+中断综合控制实验

    物联沃分享整理
    物联沃-IOTWORD物联网 » 《单片机原理与应用》课程实验报告:定时计数中断综合控制实验

    发表评论