本人电信专业大三在读,老师讲的汇编太复杂,就自己弄了个板子来学c语言编程。但是频率计要用到脉冲信号,就只有先用
proteus仿真了,各位大神有时间就帮小妹我看一看了。不甚感激!(*^__^*) ---
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar temp,t;
uchar a,b,flg;
uchar count[6];
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();
void delay(uint z);
void display(uchar m,uchar n);
void fun(uchar x,uchar y);
uchar kkk(uchar p,uchar q);
void main()
{
uchar sum;
flg=0;
t=0;
temp=0;
init();
while(flg)
{
if(flg==1)
{
flg=0;
sum=TL1+TH1*256+temp*65536; //sum为五秒内所获得的脉冲总数
a=temp/5/1000; //获取频率数最高三位
b=temp/5%1000; //获取低三位
TR0=0;
}
display(a,b); //显示
}
}
void init()
{
TMOD=0x15;//设置定时器0为工作方式1,以及计数器1工作方式为1
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1; //开计数器1中断
TR0=1;//启动定时器0
TR1=1;//启动计数器1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0x00;
TL1=0x00;
}
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//显示函数
void display(uchar m,uchar n)
{
count[0]=m/100;
fun(count[0],0);
count[1]=m%100/10;
fun(count[1],1);
count[2]=m%100%10;
fun(count[2],2);
count[3]=n/100;
fun(count[2],2);
count[4]=n%100/10;
fun(count[2],2);
count[5]=n%100%10;
fun(count[2],2);
}
//统一化每个数码管的位选字选
void fun(uchar x,uchar y)
{
uchar w=0xfe;
dula=1;
P0=table[x];
dula=0;
wela=1;
P0=kkk(w,y);
wela=0;
delay(1);
}
//位选函数
uchar kkk(uchar p,uchar q)
{
p=_crol_(p,q);
return p;
}
//定时器工作中断内容
void
time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==100)//当计时5秒时将计数器停止工作
{
flg=1;
t=0;
TR1=0;
}
}
//计数器工作中断内容
void count1() interrupt 3
{
TH1=0x00;
TL1=0x00;
temp++;
}
程序感觉是没问题的,可是接到proteus里没有反应。本人的想法是在他T1计数器那里接方波脉冲,这样就可以凭下降沿个数来知道一秒内有多少个脉冲,从而计算脉冲频率。或者是要用外部中断接脉冲?
a=temp/5/1000; //获取频率数最高三位
b=temp/5%1000; //获取低三位
你a,b 都是uchar 0~255 你flg 没有初值 不过一样是你显示都不好用。
一周热门 更多>