打印

这个程序怎么不能生成HEX文件啊,求大侠哥哥请教,急。。

[复制链接]
1925|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
impenger|  楼主 | 2011-11-19 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define Segment P2
#define sl P0

unsigned char cnt;      //定时1s计数
unsigned char d[];     //对应数码管的各位
unsigned char level;    //档位
unsigned int tN;        //不同档位计时值
unsigned int fCnt;      //脉冲下降沿次数
unsigned int regCnt;    //脉冲次数暂存
unsigned int pCnt;      //频率显示
unsigned char Num[10]={0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void Delay(unsigned int DelayTime)
{
while(DelayTime--) ;
}

void disp()
{  if(level==0)                 //B位档
{
  d[3]=0;
  d[2]=pCnt/100;
  d[1]=(pCnt%100)/10;
  d[0]=pCnt%10;

  sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);
  sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
  sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);
  sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
}
else if(level==1)
{
  d[3]=pCnt/1000;
  d[2]=(pCnt%1000)/100;
  d[1]=(pCnt%100)/10;
  d[0]=pCnt%10;

  sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);
  sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
  sl=0xfb;Delay(1);Segment=Num[d[1]]+0x80;Delay(300);  //带小数点
  sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
}
else if(level==2)
{
  d[3]=pCnt/1000;
  d[2]=(pCnt%1000)/100;
  d[1]=(pCnt%100)/10;
  d[0]=pCnt%10;

  sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);
  sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
  sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);
  sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
  }
    }
else

{ d[3]=0;
  d[2]=0;
  d[1]=0;
  d[0]=0;

     sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);
  sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
  sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);
  sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
  }
void intial()
{
clear=1;
addr=1;                 //分频器初始化
    tN=20;                   //档位初始化为Hz档
level=0;
ledM=1;                  //显示Hz档
ledK=1;
ledB=0;

TMOD=0x61;      //定时器0,工作方式1,计数器1,工作方式2(8位自动重装)
     //开定时器0中断
ET0=1;       //定时器0允许
TR1=1;       //开计数器1中断
ET1=1;         //允许计数器1中断
EA=1;                    //总中断允许
}

void main()
{
intial();

while(1)
{
  disp();
}
}

void timer0() interrupt 1
{
cnt++;
if(cnt==tN)
{

  regCnt=fCnt;          //更新显示
  fCnt=0;               //频率计数清零
        clear=0;              //硬件分频器清零
  clear=1;


  if(level==0)          //档位切换
  {
   pCnt=regCnt;   
   if(regCnt>999)
   {
    pCnt=0;       //显示清零
  
   }  
  }
  else if(level==1)
  {
   if(regCnt<1)
   {
    level=0;
    tN=20;       //定时1s
    addr2=1;     //不分频
   
   }
   else if(regCnt<1000) //KHz档
   {
    level=1;
    tN=1;               //定时50ms
    addr2=0;            //硬件分频处理
    TH1=0xfb;           //50分频  256-5
    TL1=0xfb;           //256-5
    pCnt=regCnt*10;     //换算成相应的显示:f=regCnt*100
       ledM=1;             //显示KHz档
    ledK=0;
    ledB=1;   
   }
   else
   {
    level=2;
          //显示MHz档
    ledK=1;
    ledB=1;
   }
  }
  else if(level==2)
  {
   if(regCnt<500)       //KHz档
   {
    level=1;
    tN=1;               //定时50ms
    addr2=0;            //分频
         //显示KHz档
    ledK=0;
    ledB=1;   
   }
   else if(regCnt<5000)
   {
    level=2;
    tN=1;               //定时50ms
    addr2=0;            //分频
    TH1=0xf6;           //100分频 256-10
    TL1=0xf6;           //256-10
    ledB=1;
   }
   else
   {
    level=3;            //超出范围
       ledM=1;             //全灭
    ledK=1;
    ledB=1;   
   }
  }
  ET1=1;                      //恢复外部计数1
  TR1=1;
}
TH0=0x3c;                       //(65536-50000)/256;
TL0=0xb0;                       //(65536-50000)%256;
}
void enterFre() interrupt 3         //外部频率输入
{
    fCnt++;
}

相关帖子

沙发
alamo2009| | 2011-11-19 21:23 | 只看该作者
不知在哪儿抄个程序,连看都不看!能编过才怪!
第50行的大括号移到第61行,然后再编译,会出现一堆变量没定义,然后自个根据程序逻辑定义去!

使用特权

评论回复
板凳
impenger|  楼主 | 2011-11-19 22:41 | 只看该作者
呜呜,我是看不懂,刚刚学,但是老师又要求做一个频率计。:(

使用特权

评论回复
地板
impenger|  楼主 | 2011-11-19 22:42 | 只看该作者
呜呜,我是刚刚学,但是最近老师要求做频率计。。。:(

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

66

帖子

1

粉丝