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

本文详细描述了单片机定时器/计数器的使用、中断处理及蜂鸣器应用的实验过程,包括T0定时器控制LED闪烁、T1计数器中断应用和蜂鸣器声音控制,涉及Keil软件、Proteus仿真及硬件开发板的实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           

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

课程实验报告

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

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

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

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

课程实验报告

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

单片机原理应用实验报告(中北大学大数据学院) 啊哈,需要用到proteus的可能要根据自己的情况修改一下,换了机子可能就不能运行。。。 实验一 简单程序设计 1. 学会实验系统的使用,掌握KEIL软件仿真调试方法。 2. 编制一个计算x=a2+b2 3. 验证上述结果的正确 实验二 程序设计 1.将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现‘$’字符 2.计算双字节无符号数的乘法R0R1R2R3=R4R5*R6R7,计算1234*5678的值。要求乘法程序用子程序实现。 实验 中断实验 1.将微动开关接到INT0,P1口接到8个发光二极管,利用外部中断电平触发方式,每按一次微动开关,使得发光二极管显示的二进制数字加1 2.将微动开关接到INT0,P1口接到8个发光二极管,利用外部中断下降沿触发方式,每按一次微动开关,使得发光二极管显示的二进制数字加1 3.体会两种不同触发类型中断的区别。 实验定时器实验 1.将P1口接到8个发光二极管 2.编程使得发光二极管显示的二进制数,每一秒加1 3.将微动开关接到T0,利用计数器功能,每按一次微动开关,使得发光二极管显示的二进制数字加1 4.可考虑采用计数器的不同工作模式 5.验证上述操作的正确性,对实验结果进行解释 实验五 存储器扩展使用 1. 利用试验箱中的器件,给单片机扩展一片随机读写存储器 2. 确定扩展的存储器的地址范围 3. 编写程序,将扩展的存储器中填写内容,每个单元中填写其地址码低8位的“非值” 4. 验证扩展存储器的可用性 5. 对实验结果进行说明 实验六 接口实验 1. 连接实验箱上的数码管,编程在上面显示数字2017 2. 连接实验箱上的键盘和数码管,编写程序,将键盘输入值写在数码管的最右端,原来的数值,向左端移动。 3. 输入多次的情况 实验综合实验 1. 连接实验箱上的键盘和数码管 2. 编程,将实验箱做成一个能显示时间的电子表 3. 该表能修改时间 4. AD实验,通过AD转换器,显示当前的输入电压值,要求精确到小数点后2位数(选做)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TvT<

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

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

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

打赏作者

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

抵扣说明:

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

余额充值