论坛风格切换切换到宽版
  • 3814阅读
  • 5回复

请各位大侠帮忙解释频率计程序 [复制链接]

上一主题 下一主题
离线dongyl20037
 
发帖
324
只看楼主 倒序阅读 0楼 发表于: 2004-02-14
彩色部分为不懂之处,企盼!
离线xiongjunfeng
发帖
1220
只看该作者 1楼 发表于: 2004-02-14
电路图和hex我都放上了啊
离线dongyl20037
发帖
324
只看该作者 2楼 发表于: 2004-02-14
最初由 xiongjunfeng 发表
电路图和hex我都放上了啊

你的电路图我打不开,有时间青帮我修改那个程序,连同你电路图,程序给我发个电子邮件,万分感谢。
离线QQLove
只看该作者 3楼 发表于: 2007-06-05
xxx
《用at89c51制作八位数字频率计》程序清单及注释
org     00h           ;指定下条指令的地址
ajmp   main         ;跳转至main
;//////////////////////这是什么呀///////////////////////////
50m
    inc     23h
    reti
////////////////中断入口只有几个字节而已,下面你的程序早跑飞了////////////////////////////////////////
    org     001bh         ;定时器t1中断入口,t1作定时,t0作计数
    push   a             ;累加器a压入堆栈
    push   psw           ;状态寄存器压入堆栈
    djnz   40h,jj         ;产生1s定时时标
    mov     40h,#0c8h
    djnz   41h,jj
    clr     p3.1           ;关闭闸门
    anl     88h,#0afh       ;1s末,关闭t0和t1
    mov     20h,p1
    mov     21h,tl0       ;t0计数值送21h和22h
mov     22h,th0
setb   p3.0           ;ls393清零
acall   count         ;调用二进制转bcd码程序
jj:   pop     psw
    pop     a
    reti
    org     50h           ;以下程序从地址50h开始
main: mov     sp,#50h       ;将初始值赋予sp
离线QQLove
只看该作者 4楼 发表于: 2007-06-15
频率计主程序,功能函数自己写吧!
#include<reg52.h>
#include<intrins.h>
#include"port.h"
#include"lcdmodule.h"
#include"delay.h"
// lcd1602 asiic码,功能清屏一个字节
#define clear_char      0xfe

void delay_1s(void);
void delay_25ms(void);

union

{
  unsigned long int tal;
  unsigned char cont[4];
}
timer0_cont;
unsigned char data ddatabuffer[10];
void main(void)
{
  unsigned char i;
  union
  {
    unsigned int a;
    unsigned char b[2];
  }
  temp;
  p0 = 0xff;
  p1 = 0xff;
  p2 = 0xff;
  p3 = 0xff;
  lceinit();
  displaylistchar(0, 0, "frequencycounter");
  displaylistchar(13, 1, "hz");
  tmod=0x05;                   //to模式1,外部计数模式
  while (1)
  {
    timer0_cont.tal = 0;
    temp.a = 0;
    // lcd显示缓冲区清零
    for (i=0; i<10; i++)
    {
      ddatabuffer = 0;
    }
    // 清t0计数器
    tl0 = 0;
    th0 = 0;
    cont_gate=0;               //关闸门,关闭计数器通路
    hc4040mr=1;                 //清零脉冲计数器
    hc4040mr=0;                 //hc4040可以计数
    tr0=1;                   //t0计数器开始计数
    //////////////////////////////////////////////////////////////////
    cont_gate=1;               //开闸门,接通计数脉冲通路
    // 延时1秒
    delay_1s();
    _nop_();
    _nop_();_nop_();
    _nop_();_nop_();
    cont_gate=0;               //关闸门
    ///////////////////////////////////////////////////////////////////
    tr0=0;                   //关t0计数器
    // 读入12位计数器值
    temp.b[1] = p0;
    temp.b[0] = p2;
    temp.b[0] &= 0x0f;
    // 读入计数器内的数
    timer0_cont.cont[3] = tl0;
    timer0_cont.cont[2] = th0;
    timer0_cont.tal = timer0_cont.tal * 4096;
    timer0_cont.tal |= temp.a;
    /*---------四字节十六进制数转换成bcd码(从高位到低位)-------------*/
    ddatabuffer[0] = timer0_cont.tal / 1000000000;
    timer0_cont.tal = timer0_cont.tal % 1000000000;
    ddatabuffer[1] = timer0_cont.tal / 100000000;
    timer0_cont.tal = timer0_cont.tal % 100000000;
    ddatabuffer[2] = timer0_cont.tal / 10000000;
    timer0_cont.tal = timer0_cont.tal % 10000000;
    ddatabuffer[3] = timer0_cont.tal / 1000000;
    timer0_cont.tal = timer0_cont.tal % 1000000;
    ddatabuffer[4] = timer0_cont.tal / 100000;
    timer0_cont.tal = timer0_cont.tal % 100000;
    ddatabuffer[5] = timer0_cont.tal / 10000;
    timer0_cont.tal = timer0_cont.tal % 10000;
    ddatabuffer[6] = timer0_cont.tal / 1000;
    timer0_cont.tal = timer0_cont.tal % 1000;
    ddatabuffer[7] = timer0_cont.tal / 100;
    timer0_cont.tal = timer0_cont.tal % 100;
    ddatabuffer[8] = timer0_cont.tal / 10;
    ddatabuffer[9] = timer0_cont.tal % 10;
    // bcd码转换成ascii码送lcd1602
    for (i=0; i<10; i++)
    {
      ddatabuffer |= 0x30;
    }
      i = 0;
      // 判断计数器高位是否为零且在数组范围内
      while ( (ddatabuffer == 0x30) && (i<10) )
      {      
           // 如果为零,则该位清屏
           displayonechar(2+i, 1, clear_char);
           i++;
      }
     
      if (i == 10)
      {
           displaylistchar(2, 1, "no signal");
      }
      for (; i<10; i++)
      {
           displayonechar(2+i, 1, ddatabuffer);
      }
  }
}
void delay_25ms(void)
{
  unsigned int x = 45438;
  while (--x)
  {
    _nop_();
  }
}
void delay_1s(void)
{
  delay_25ms();
  delay_25ms();
  delay_25ms();
  delay_25ms();
}
离线QQLove
只看该作者 5楼 发表于: 2007-06-15
程序运行界面