微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机新手~!频率计程序,proteus仿真木有响应,求指点!

单片机新手~!频率计程序,proteus仿真木有响应,求指点!

时间:10-02 整理:3721RD 点击:
本人电信专业大三在读,老师讲的汇编太复杂,就自己弄了个板子来学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 没有初值  不过一样是你显示都不好用。

已下载,待我去验证444

其实我也需要这个程序的,我也是下载到单片机中就不得了,

#include <REG51.H>
#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有三个通道的,有八种可能的,能不能帮我编好其余的其中呢,用三个三个按键就可以,一个按键的功能时菜单功能的,就是说有多少种模式的,其余的两个按键时模式加减。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top