一.实验目的、内容、仪器
实验目的:
- 了解单片机的定时器系统,定时器1和定时器0的功能及工作方式。
- 了解中断服务程序的写法。
- 了解定时器每个引脚的功能。
实验内容:使用定时器0的工作方式一,采用中断方式,控制led(数码管显示)的闪烁(1s),同时led2的闪烁(0.5s)。
实验仪器:AT89C51:51单片机,RES:电阻,BUTTON:按键、CAP:电容、CRYSTAL:晶振、RES:电阻、Led:发光二极管
二.硬件原理
三.程序流程图
四.代码实现
#include <reg51.h>
sbit led1=P0^0;
sbit led2=P1^0;
int count0,count1;
//定时器0溢出中断程序
void timer0() interrupt 1
//定时器0中断标志位为1
{
//重新装载定时器0计数初值
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(count0==10)
//T0*10=1s LED1闪烁
{
led1=~led1;
count0=0;
}
count0++;
} //定时器1溢出中断程序
void timer1() interrupt 3 //定时器1中断标志位为3
{
//重新装载定时器1计数初值
TH1=(65536-25000)/256;
TL1=(65536-25000)%256;
if(count1==10) //T1*10=0.5s LED2闪烁
{
led2=~led2;
count1=0;
}
count1++;
}
int main()
{
EA=1; //全局中断使能
ET0=1; //定时器0溢出中断使能
ET1=1; //定时器1溢出中断使能
TR0=1; //定时器0使能
TR1=1; //定时器1使能
TMOD=0x11; //00010001B,定时器0、1使用工作方式1,16位定时器
//装载定时器0计数初值
TH0=(65536-50000)/256; //内置时钟频率为6MHz,定时器0计数50000次,计数初值为15536转为16进制
TL0=(65536-50000)%256; //机械周期为2us,T0=(65536-计数初值)*2us=0.1s
//装载定时器1计数初值
TH1=(65536-25000)/256; //内置时钟频率为6MHz,定时器0计数25000次,计数初值为40536转为16进制
TL1=(65536-25000)%256; //机械周期为2us,T1=(65536-计数初值)*2us=0.05s
led1=0; //控制P0.0
led2=0; //控制P1.0
while(1)
{
}
}
五.实验步骤
(1)了解译码器的功能,以及动态显示原理
(2)搭建仿真电路,勾选debug,建立keil工程,选择单片机型号
(3)给工程创建源码文件,并以.c结尾,添加文件到源组里
(4)生成hex文件,点击魔术棒,在output中勾选Create HRX_File
(5)对代码进行编译,调试debug,点击USE,在下拉菜单里选中“Proteus VSM Monitor 一 51 ”进行设置
(6)将程序导入到单片机中运行,双击单片机,选择生成的hex文件
(7)在keil中启动调试,开始运行,观察proteus中的电路
六.结果及讨论
主要是需要掌握定时器1和定时器0的功能,EA、ET0、ET1 、TR0 、TR1都代表什么意思,在进行主函数编码时就需要对其赋值。