概述
A信号1000Hz左右,B信号1Hz左右,B信号的上升沿对齐A信号的上升沿。用两个信号发生器进行仿真。数码管左4位,为B信号高电平时,A的脉冲数;右4位为B一个周期内,A的脉冲数。
B信号为方波(高电平和低电平等长,1Hz),A信号频率可调。仿真会有些许误差。
完整代码:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管段码表
void delay(uint t) //延时函数
{
uchar i;
while(t--) for(i=0;i<200;i++);
}
uint val1; //B高电平,计数值
uint val2; //B一个周期,计数值
uchar FlagInt0;
uchar i,j=0x80;
void display(void)
{
uint dis1, dis2;
uchar a[8]; //数码管从左到右的每一位数值
dis1=val1;
dis2=val2;
// dis1=1234;
// dis2=1234;
a[3]=dis1%10;
dis1=dis1/10;
a[2]=dis1%10;
dis1=dis1/10;
a[1]=dis1%10;
dis1=dis1/10;
a[0]=dis1%10;
a[7]=dis2%10;
dis2=dis2/10;
a[6]=dis2%10;
dis2=dis2/10;
a[5]=dis2%10;
dis2=dis2/10;
a[4]=dis2%10;
for(i=0;i<8;i++)
{
j=_crol_(j,1); //_crol_(j,1)为将对象j循环左移1位
P0=dis_code[a[i]]; //P0口输出段码
P2=j; //P2口输出位控码
delay(1); //延时,控制每位显示的时间
P0=0xff; //清零。如果没有这句,仿真时,数码管数据会闪烁
}
}
void main()
{
val1=0;
val2=0;
FlagInt0=0;
TMOD=0x05; //T0为16位计数模式
TH0=0;
TL0=0; //计数值重置
EX0=1; // 外中断0使能;
IT0=1; // 外中断0下降沿触发
IT1=1; // 外中断1下降沿触发
EA=1; //总中断使能;
while(1)
{
display();
}
}
void int0(void) interrupt 0 //外中断0中断函数
{
if(FlagInt0==0){
TH0=0;
TL0=0; //计数值重置
TR0=1; //启动T0计数。此时为B信号的上升沿
EX1=1; // 外中断1使能;
FlagInt0=1;
}else{
TR0=0; //停止T0计数。B信号的第二个上升沿
EX1=0; // 外中断1禁止;
val2=TH0*256+TL0; //B一个周期,计数值
FlagInt0=0;
}
}
uint temp;
void int1(void) interrupt 2 //外中断1中断函数
{
if(FlagInt0==1){
temp=TH0*256+TL0; //B高电平,计数值。此时为B信号的下降沿
if(temp!=0) //有时候会变成0,很奇怪
val1=temp;
}
}
完整资料打包(含仿真):
STC51单片机49-51单片机测量脉冲周期/频率并加以计算、显示-单片机文档类资源-CSDN下载
最后
以上就是健忘凉面为你收集整理的STC 51单片机49——51单片机测量脉冲周期/频率并加以计算、显示的全部内容,希望文章能够帮你解决STC 51单片机49——51单片机测量脉冲周期/频率并加以计算、显示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复