找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2566|回复: 1
打印 上一主题 下一主题
收起左侧

简易频率计问题

[复制链接]
跳转到指定楼层
楼主
最近在做数字频率计,用的AT89C51单片机,选用的系统时钟为24M,T0定时,T1计数。不知道为什么出不来,麻烦大家帮看看。以下是程序和图:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;                                       //引脚定义
sbit RW=P2^1;
sbit E=P2^2;
sfr LCDDATA=0x80;                           //LCD数据总线定义为P0
sbit RDY=LCDDATA^7;                            //就绪BF线,低电平有效
extern void lcd_cmd(uchar cmd)          //写指令到LCD
      {
      LCDDATA=cmd;
      RS=0;
      RW=0;
      E=1;
      _nop_();
      E=0;
      while(1)
             {LCDDATA=0xff;
             RS=0;
             RW=1;
             E=0;
             _nop_();
             E=1;
             if(RDY==0)  break;
             }
      }
extern void lcd_data(uchar dat)                         //写数据到LCD
      {LCDDATA=dat;
      RS=1;
      RW=0;
      E=1       ;
      _nop_();
      E=0;
      while(1)
             {LCDDATA=0xff;
             RS=0;
             RW=1;
             E=0;
             _nop_();
             E=1;
             if(RDY==0)  break;
             }
      }
extern void init_lcd(void)                     //初始化LCD
      {lcd_cmd(0x01);
      lcd_cmd(0x3c);
      lcd_cmd(0x0C);
      }
extern void disp_str(uchar x, uchar y,uchar *p)               //字符串显示
      {if(x==0)
      lcd_cmd(0x80+ y);
      else
             lcd_cmd(0xc0+ y);
      while(*p)
      lcd_data(*p++);
      }
#include <reg51.h>
unsigned char time1_H,time1_L;    //T1定时初值
unsigned char cont_25;            //25ms计数器
unsigned char time0_H,time0_L;    //T0当前计数值
unsigned char T0_num = 0;        //T0溢出计数器
unsigned long fdata;                      //频率
unsigned char flag_1s=0x00;        //1s到标志
void delay_s (unsigned char n)             //延时函数
      {     unsigned char i;
             for( i=0;i<n;i++);
      }
void Time1_int(void) interrupt 3
      {
             TH1=time1_H;                 //T1定时25ms到,重装初值
             TL1=time1_L;
             cont_25++;                        //25ms计数器+1
             if(cont_25>39)
                    {     cont_25=0;          //25ms计数器清0
                           TR0=0;               
                           time0_H=TH0;    //1s到读出当前计数值
                           time0_L=TL0;     
                           TH0=0;TL0=0;    //T0重新清0
                           TR0=1;
                           fdata=(time0_H*256+time0_L)+T0_num*65536;     //计算频率
                           T0_num=0;          //T0溢出次数清0
                           flag_1s=1;
                    }
             }
void Time0_int(void)interrupt 1
      {T0_num++;                            //溢出计数器增1
      }
void t0_t1_init(void)                            //定时器T0T1初始化函数
      {floatx;
      unsigned int y,z;
      TMOD=0x15;                          //T1定时,T0计数
      x=12/24.00;
y=25000/x;
      z=65536-y;
      time1_H=z/256;
      time1_L=z%256;
      TH1=time1_H;
      TL1=time1_L;
      TR1=1;
      TH0=0;
      TL0=0;
      TR0=1;
      }
void main(void)
      {unsignedchar i;
      unsignedchar str[6]={0,0,0,0,0,0,};
      init_lcd();
      t0_t1_init();
      ET1=1;
      ET0=1;
      EA=1;
      cont_25=0;
      T0_num=0;
      flag_1s=0;
      disp_str(0,5,"Frequencyis:");
      while(1)
             {if(flag_1s== 1)
                    {for(i=6;i>0;i--)
                           {str[i-1]=fdata%10+0x30;
                           fdata=fdata%10;
                           }
                    disp_str(1,5,str);
                    flag_1s=0;
                    }
             delay_s(200);
             }
      }

0414.PNG (24.02 KB, 下载次数: 101)

0414.PNG

0413xin.rar

16.41 KB, 下载次数: 20

proteus电路图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:72643 发表于 2015-4-14 11:06 | 只看该作者
LCD1602频率计+PROTEUS仿真+51单片机源程序
http://www.51hei.com/bbs/forum.p ... 0&fromuid=72643
(出处: 单片机论坛)
楼主可以参考一下这资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表