/*-----------------------------------------------
名称:脉冲宽度测量
编写:93037897
日期:2014.11.20
修改:无
内容:可以测量外部中断引脚INT0上高电平的时间,
当GATE0=1,TR0=1时,只有INT0引脚为高电平,T0才开始计数
------------------------------------------------*/
#include《REG52.H》
#include《intrins.h》
sbit INT0_PIN=P3^2;
unsigned char count_high, count_low;
unsigned int count;
unsigned char code duanma[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
// 显示段码值0123456789
unsigned char code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
read_count();
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void delay_nms(unsigned int i)
{
unsigned char a;
while(i--)for(a=0;a《80;a++);
}
/*------------------------------------------------
数码管显示函数,显示范围是0~65535
------------------------------------------------*/
void display(unsigned int temp)
{
unsigned char j,a[5];
a[4]=temp%10; //12345%10=5 个位
a[3]=temp/10%10; //12345/10=1234,1234%10=4 十位
a[2]=temp/100%10; //12345/100=123,123%10=3 百位
a[1]=temp/1000%10;//12345/1000=12,12%10=2 千位
a[0]=temp/10000; //12345/10000=1 万位
for(j=0;j《5;j++)
{
P1=weima[j];
P2=duanma[a[j]];//
delay_nms(1);
}
}
void main()
{
TMOD|=0x09; //定时器0工作于方式1,16位长度,
TH0=0; //初值高8位,初值为0
TL0=0; //初值低8位,初值为0
TR0=0; //关闭定时器T0
while(1) //重复测量
{
while(INT0_PIN==1); //等待高电平结束
TR0=1; //打开定时器T0
while(INT0_PIN==0); //等待低电平结束
while(INT0_PIN==1); //等待高电平结束
TR0=0; //关闭定时器T0
read_count(); //调用读取数据
display(count); //显示
}
}
read_count() //读取T0计数结果
{
count_high=TH0; //读取高8位
count_low=TL0; //读取低8位
count=(count_high《《8)|count_low;//合成的16位数据
TH0=0; //清零高8位寄存器
TL0=0; //清零低8位寄存器
return count; //返回合成的16位数据
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !