您的位置:首页 > 编程语言

定时器/计数器设计实验

2013-12-12 12:38 197 查看
要求:了解定时器的各种工作方式, 掌握定时器/计数器的使用和编程方法

 实验题目:采用12MHZ时钟频率的单片机,通过一个开关输入,触发定时计数。按下开关10次,计算按键的平均时间,并通过数码管显示出来。



#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar code DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77};//0-10的数值编码
uchar Digits_of_6DSY[]={0,0,0,0,0,0};
uint Count=0;//中断次数
sbit Dot=P1^7;//小数点

void Delay()
{
uchar n=10,i;
while(n--)
for(i=0;i<120;i++);
}

void Show_Count_ON_DSY()
{
P0=~DSY_CODE[Count];//数码管上显示中断的次数
Delay();
}

void EX_INT0() interrupt 0
{
char i = 0;
Count++;//统计中断次数
if(Count>11) //大于十置零
{
while(i < 6)
{
Digits_of_6DSY[i]=0;
++i;
}
Count=0;
TH0=-1000/256;//1MS定时
TL0=-1000%256;
TR0 = 1;
}
Show_Count_ON_DSY();
}

void Time0() interrupt 1
{
uchar i,j,n;
TR0 = 0;
TH0=-1000/256;//1MS定时
TL0=-1000%256;
if(Count<=10)
{
Digits_of_6DSY[0]++;//0.1ms累加
for(i=0;i<5;i++) //处理进位问题
{
if(Digits_of_6DSY[i]==10)
{
Digits_of_6DSY[i]=0;
if(i<5)
Digits_of_6DSY[i+1]++;
}
}
j=0x7f;
for(n=5;n!=-1;n--)
{
j=_crol_(j,1);
P2=j;
P1=DSY_CODE[Digits_of_6DSY
];//显示数位
if(n==1)
Dot=1;
Delay();
}
}
else
return ;
TR0 = 1;
}

void main()
{
uchar j,n;
P0=0xFF;
P1=0x00;
P2=0xFF;
IE=0x83; //允许INT0中断以及定时器0中断
IT0=1; //下降沿触发
TMOD=0x01;
TH0=-1000/256;
TL0=-1000%256;
TR0=1;

while(1)
{
if(Count>10) {
TR0=0;
while(1)
{
j=0x7f;
for(n=5;n!=-1;n--)
{
j=_crol_(j,1);
P2=j;
P1=DSY_CODE[Digits_of_6DSY
];//显示数位
if(n==2)
Dot=1;
Delay();
}
}}
//Show_Count_ON_DSY();//显示中断次数
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息