CHANGZHOU INSTITUTE OF TECHNOLOGY
题目7:计数器
二级学院(直属学部):延陵学院
专业:电气工程及其自动化班级:10电Y3 学生姓名:学号:
1、学习80C51单片机计数器的使用和编程
2、熟悉计数器中断处理程序的编程
二、实验电路
四、实验操作和调试
通过引脚T0从外部输入3个计数脉冲后触发中断,在T0的计数中断服务程序中,接在P0口的绿色LED闪烁3次,返回主程序。
引脚T1从外部输入6个计数脉冲后触发中断,在T1的计数中断服务程序中,接在P2口的红色LED闪烁6次,返回主程序。
T0和T1总的中断次数在P1口的7段BCD数码管中显示。
五、实验程序
#include<intrins.h>
#include<REGX52.H>
#define TRUE 1
#define uchar unsigned char
uchar time0IntCounter=0; //定时器0溢出计数
uchar time1IntCounter=0; //定时器1溢出计数
uchar totalIntTimes=0; //总中断次数
void time(unsigned int ucMs); //延时单位:ms
void main(void)
{
TMOD=0x066; //设置外部中断0和1为外部脉冲输入计数器,设工作方式1,16位计数器
TH0=0xFF;TL0=0xFD; //设置计数器0的初值FFFDH,3个计数脉冲产生中断
TH1=0xFF;TL1=0xFA; //设置计数器1的初值FFFAH,6个计数脉冲产生中断
TR0=1; //开启定时器0
TR1=1; //开启定时器1
IE=0x8a; //开启定时器0和1中断
P1=totalIntTimes; //总中断次数送P1
while(1){} //等待定时器0和1中断
}
/************定时器0中断服务程序*****/
void timer0(void) interrupt 1
{
unsigned char counter; //循环次数计数
EA=0; //关总中断
TR0=0; //停止计时
totalIntTimes++; //总中断次数加1
P1= totalIntTimes; //总中断次数送P1
for(counter=0;counter<255;counter++)
{
P0=0; //点亮P0口LED1
time(300); //延时300ms
P0=0xff; //熄灭P0口LED1
time(300); //延时300ms
}
TH0=0xFF;TL0=0xFD; //设置计数器0的初值FFFDH,3个计数脉冲产生中断
TR0=1; //开启定时器0
EA=1; //开总中断
}
/************定时器1中断服务程序*****/
void timer1(void) interrupt 3
{
unsigned char counter; //循环次数计数
EA=0; //关总中断
TR1=0; //停止计时
totalIntTimes++; //总中断次数加1
P1=totalIntTimes; //总中断次数送P1
for(counter=0;counter<10;counter++)
{
P2=0; //点亮P2口LED1
time(300); //延时300ms
P2=0xff; //熄灭P2口LED1
time(300); //延时300ms
}
TH1=0xFF;TL1=0xFA; //设置计数器1的初值FFFAH,6个计数脉冲产生中断
TR1=1; //开启定时器1
EA=1; //开总中断
}
void delay_5us(void) //延时5us,晶振改变时只改变这一个函数
{
_nop_();
_nop_();
//_nop_();
// _nop_();
}
/*delay_50us*/
void delay_50us(void) //延时50us
{
unsigned char i;
for(i=0;i<4;i++)
{
delay_5us();
}
}
/******************延时100us********************/
void delay_100us(void) //延时100us
{
delay_50us();
delay_50us();
}
/*延时单位:ms*/
void time(unsigned int ucMs)
{
unsigned char j;
while(ucMs>0)
{
for(j=0;j<10;j++)
delay_100us();
ucMs--;
}
}
六、实验效果图。