单片机实验-定时中断

一.实验目的

1.掌握51单片机定时器工作原理。

2.掌握51单片机中断系统工作原理。

3.掌握定时器初始化编程。

4.掌握中断程序的编写和调试。

二.实验设备和器件

1.KEIL软件

2.PROTEUS仿真软件   

3.伟福实验箱

三.实验内容

(1)编程实现:在单片机外中断0引脚接一个单脉冲源作为外部输入信号,通过发光二极管显示中断次数,发光二极管初始状态为全灭

  • 电路图:

 

单片机实验-定时中断

  • 代码:

#include<reg52.h>  

#include<intrins.h>    

#define uint unsigned int  

#define uchar unsigned char

uchar b=0;  

void delay()//延时函数

{

 uint a=30000;

 while(a--)_nop_();

}

void main()//主函数

{

     P0=0xff; //初始化灯

     INT0==1;//打开外部中断0

     EA=1;   //开总中断

     EX0=1;   //允许中断0

 IT0=1;  //设置外部中断0边沿触发

 while(1);

 }

void srv_INT0() interrupt 0    //中断服务程序

{

   b=b+1;   

   P0=0xff-b;   

   delay();

 }

  • 分析:

1、外部中断0为边沿触发,则初始化时需要将IT0置1;

2、在proteus仿真中,因为低电平灯才会亮,则P0不能直接等于计数的b,需要用0xff-b,才能是相应的灯亮灭

 

(2)模拟一个交通灯时序,要求绿灯6s,红灯4s,黄灯2s,循环实现

  • 电路图:

 

单片机实验-定时中断

  • 代码:

#include <reg51.h>

#include <intrins.h>

void delay1s(unsigned char k);

void main()

{

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

TH0=0x3C;

TL0=0xB0;//定时器初值15536,定时100ms

while(1)

{

P0=0xfe; //green ,D0作为绿灯

delay1s(6);//延时6s

P0=0xfd;   //red ,D1作为红灯

delay1s(4);//延时4s

P0=0xfb;   //yellow,D2作为黄灯

delay1s(2);//延时2s

}

}

 

void delay1s(unsigned char m)  //定时器0采用查询的方式

{

unsigned char k1,k2;

TH0=0x3C;TL0=0xB0;//2^16-100x10^3/2=65536-50000=15536-3cb0,定时100ms

TR0=1;//开启定时器0

for(k1=0;k1<m;k1++) // 定时每次是1s,根据m值的不一样,决定总定时时间

{

for(k2=0;k2<10;k2++)//定时器0定时100ms,循环10次,1s

{

while(!TF0);   //查询方式

TF0=0;   //清除

TH0=0x3C;TL0=0xB0;

}

}

}

  • 分析:

1、定时器处理方式有中断、查询

2、实验箱设置的系统时钟为12MHz--1us

   Proteus仿真设置的系统时钟为6MHz--2us

3、定时器0定时100ms,循环10次之后定时1s,根据相应的m值,决定延时多长时间

(3)编程实现:在实验2基础上,加一个外中断请求信号来处理紧急情况,当外中断请求发生时,进入紧急状态,红灯闪烁5s,之后退出,继续原来的状态执行。

  • 电路图:

 

单片机实验-定时中断

  • 代码:

#include <reg51.h>

#include <intrins.h>

void delay1s(unsigned char k);

void main()

{

TMOD =0x01;

TH0=0x3C;

TL0=0xB0;

IE=0x81;  //允许总中断,允许外部中断0

TCON=0x01; //允许外部中断0

while(1)

{

P0=0xfe; //green

delay1s(6);

P0=0xfd;   //red

delay1s(4);

P0=0xfb;   //yellow

delay1s(2);

}

}

void int_0(void) interrupt 0

{

  while(1)

{

  P0 =0xfd;

  delay1s(5);

  P0=0xff;

  delay1s(5);

   }

 }

void delay1s(unsigned char m)  //定时器0采用查询的方式

{

unsigned char k1,k2;

TH0=0x3C;TL0=0xB0;//2^16-100x10^3/2=65536-50000=15536----3cb0,定时00ms

TR0=1;//开启定时器0

for(k1=0;k1<m;k1++) // 定时每次是1s,根据m值的不一样,决定总定时时间

{

for(k2=0;k2<10;k2++)//定时器0定时100ms,循环10次,1s

{

while(!TF0);   //查询方式

TF0=0;   //清除

TH0=0x3C;TL0=0xB0;

}

}

}

  • 分析:

1、其他同实验二

2、用到外部中断0,需要允许中断0,当执行中断0时,红灯持续闪烁