一、实验内容
采用12MHZ时钟频率的单片机,通过一个开关输入,触发定时计数。按下开关10次,计算按键的平均时间,并通过数码管显示出来。
二、实验目的
了解定时器的各种工作方式
掌握定时器/计数器的使用和编程方法
三、实验设备
DELL台式机 、keilC51版本7、proteus版本6
四、实验电路图
五、程序流程图
六、程序源码
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Dot=P0^7;//小数点
sbit P3_5=P3^5;//按钮
uchar Count=0;//循环次数
uchar flag=0;//判断标志
uchar Times=0;
//数码管段码定义
uchar code DSY_CODE[]=
{ 0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
//延时
void DelayMS(uint x)
{
uchar i;
while(--x)for(i=0;i<120;i++);
}
//6只数码管上显示的数字
uchar Digit[]={0,0,0,0,0,0};
void main()
{
uchar i,j;
P0=0xff;
P2=0x00;
P3_5=1;
TMOD=0x01;//设T0为定时方式1
EA=1;ET0=1;//开总控,INT0
TH0=(65536-50000)/256;//设置50ms定时
TL0=(65536-50000)%256;
while(Count!=10){
if(P3_5==1)//开关高电平
{
if(flag==1)//判断标志位
{
flag=0;Count++;//修改标志位,循环次数+1
}
TR0=0;//关中断
}
else if(P3_5==0)//开关低电平
{
flag=1; TR0=1;//修改标志位,关中断
}
}
//显示数码管
while(1)
{
j=0x80;
for(i=0;i<6;i++)
{
j=_crol_(j,1);
P2=j;
P0=DSY_CODE[Digit[i]];
if(i==2)//因为是平均时间,所以小数点左移一位
Dot=0;
DelayMS(2);
}
}
}
void Time0()interrupt 1
{
uchar i;
TH0=(65536-50000)/256;//定时
TL0=(65536-50000)%256;
if((++Times)==2)//50ms*2=0.1s
{
Times=0;
Digit[0]++;//0.1s累加
for(i=0;i<=5;i++)//进位处理
{
if(Digit[i]==10)
{
Digit[i]=0;
if(i!=5)
Digit[i+1]++;
}
}
}
}