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

           

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

课程实验报告

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

  • 实验目的
  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. 代码问题:运行无错误。门铃仿真中存在问题:各个线路正常,高低电平正常,门铃不会鸣响。开发板中问题:门铃未响。解决中发现仿真中的喇叭使用错误,仿真图中有改正。

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

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

课程实验报告

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

  • 65
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TvT<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值