一.实验目的
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时,红灯持续闪烁