本人电信专业大三在读,老师讲的汇编太复杂,就自己弄了个板子来学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 没有初值 不过一样是你显示都不好用。
#define wei P2
#define duan P1
unsigned char ls151_a,ls151_b,ls151_b;
unsigned long int f;
unsigned int a,tt;
unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay_us(unsigned int us)
{
while(us--);
}
void display(unsigned char len,unsigned long int num)
{
unsigned char n;
unsigned char temp[8];
temp[7]=num%100000000/10000000;
temp[6]=num%10000000/1000000;
temp[5]=num%1000000/100000;
temp[4]=num%100000/10000;
temp[3]=num%10000/1000;
temp[2]=num%1000/100;
temp[1]=num%100/10;
temp[0]=num%10/1;
if(len<8) len=8;
for(n=0;n<len;n++)
{
P2=weima[n];
P1=~duanma[temp[n]];
delay_us(100);
}
}
void main()
{
TMOD |=0X15;
TH0=0;
TL0=0;
TH1=(65536-46083)/256;
TL1=(65536-46083)%256;
ET1=1;
TR1=1;
ET0=1;
TR0=1;
EA=1;
while(1)
{
ls151_a=1;ls151_a=0;ls151_a=0;
display(8,f);
}
}
void time0() interrupt 1
{
TH0=0;
TL0=0;
a++;
}
void time1() interrupt 3
{
TH1=(65536-46083)/256;
TL1=(65536-46083)%256;
tt++;
if(tt==20)
{
tt=0;
TR0=0;
f=a*65536+TH0*256+TL0;
a=0;
TH0=0;
TL0=0;
TR0=1;
}
}
这是我编的,但是74ls151有abc有三个通道的,有八种可能的,能不能帮我编好其余的其中呢,用三个三个按键就可以,一个按键的功能时菜单功能的,就是说有多少种模式的,其余的两个按键时模式加减。
一周热门 更多>