2415|2

56

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于频率采集 [复制链接]

#include
#include

#define ulong   unsigned long
#define uint    unsigned int
#define uchar   unsigned char

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;

sbit KG = P3^0;//档位选择
sbit K = P3^2;//门控信号
sbit RES = P3^3;
sbit LCM_E = P3^5;
sbit LCM_RW = P3^6;
sbit LCM_RS = P3^7;
sbit rs        = P3^7;                //
sbit rw = P3^6;
sbit ep = P3^5;      //这三个改成控制端口

void Delays()  //1秒延时
{
    unsigned char h,i,j,k;
     for(h=5;h>0;h--)
     for(i=4;i>0;i--)
         for(j=116;j>0;j--)
     for(k=214;k>0;k--);
}


delay(BYTE ms)
{                                                        // 延时子程序
        BYTE i;
        while(ms--)
        {
                for(i = 0; i< 250; i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}

BOOL lcd_bz()
{                                                        // 测试LCD忙碌状态
        BOOL result;
        rs = 0;
        rw = 1;
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        result = (BOOL)(P1 & 0x80);
    ep = 0;
        return result;       
}

lcd_wcmd(BYTE cmd)
{                                                        // 写入指令数据到LCD
        while(lcd_bz());
        rs = 0;
        rw = 0;
        ep = 0;
        _nop_();
        _nop_();       
        P1 = cmd;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 0;               
}

lcd_pos(BYTE pos)
{                                                        //设定显示位置
        lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)       
{                                                        //写入字符显示数据到LCD
        while(lcd_bz());
        rs = 1;
        rw = 0;
        ep = 0;
        P1 = dat;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 0;       
}

lcd_init()
{                                                        //LCD初始化设定
        lcd_wcmd(0x38);                        //
        delay(1);
        lcd_wcmd(0x0c);                        //
        delay(1);
        lcd_wcmd(0x06);                        //
        delay(1);
        lcd_wcmd(0x01);                        //清除LCD的显示内容
        delay(1);
}


void sampling(ulong *freTempPtr)
{
        ulong temp;
        RES = 0;//使4040可计数
    TR0 =1;//启动计数器0
    K = 1;//开门控信号
    Delays();//1S
    K = 0;//关门控信号
    _nop_ ();        //精确延时
    _nop_ ();
    _nop_ ();
    TR0=0;

    *freTempPtr = 0;
    *freTempPtr = TH0;//单片机芯片16位计数器的高8位
    *freTempPtr = (*freTempPtr)<<20;
    temp = TL0;
    temp = temp<<12;
    *freTempPtr += temp;//读单片机芯片16位计数器
    temp = P2 && 0x0F;
    temp =temp << 8;
    *freTempPtr +=  temp;
    *freTempPtr +=  P0;
        RES = 1;
   

}


void BchangASII(ulong y,uchar *BCD)
{
    *BCD = y/1000000000+0x30; y = y%1000000000;  BCD++;   
    *BCD = y/100000000+0x30;  y = y%100000000;   BCD++;
    *BCD = y/10000000+0x30;   y = y%10000000;    BCD++;
    *BCD = y/1000000+0x30;    y = y%1000000;     BCD++;
    *BCD = y/100000+0x30;     y = y%100000;      BCD++;
    *BCD = y/10000+0x30;      y = y%10000;       BCD++;
    *BCD = y/1000+0x30;       y = y%1000;        BCD++;
    *BCD = y/100+0x30;        y = y%100;         BCD++;
    *BCD = y/10+0x30;         BCD++;
    *BCD = y%10+0x30;
}

void initialize(void)
{
        RES = 1;  
    TMOD = 0x05;//定时/计数器0,方式1,计数
    P0 = 0xFF;
    P2 = 0xFF;
    TH0 = 0x00;
    TL0 =0x00;//设置计数初值
    delay(100); //启动等待,等lcd讲入工作状态
    lcd_init(); //lcd初始化
    delay(5);  //延时片刻(可不要)
}


main()
{
        uchar result1[16]="Freq:           ";
        uchar result2[16]="Unit: Hz        ";
        uchar *p1,*p2,i;
    ulong fre,*frePtr;
    frePtr = &fre;
    initialize();          // 初始化操作
        p1=&result1;
        p2=&result2;

    while(1)
        {
               
            sampling(frePtr);
                if(KG) //150MHZ-1.1GHZ处理
                {
            fre = fre * 64;
        }
                  
              BchangASII(fre,&result1[5]);
              lcd_pos(0);                                // 设置显示位置为第1行的第1个字符
                i = 0;
                for(i=0;i<16;i++)
                        lcd_wdat(*(p1+i));
       
                lcd_pos(0x40);                        // 设置显示位置为第2行第1个字符
                i = 0;
                for(i=0;i<9;i++)
                        lcd_wdat(*(p2+i));

        }
}
这是我写的程序,但采集不到外部的频率值啊,难道采集频率的子程序错了吗????我不接外部信号发生器,LCD上就有数值显示,接上外部信号发生器后还是同样的值啊,怎么回事啊????而且显示的数值一直会自动加1或者常常自动加16。

最新回复

一时间找不出自增的原因(从代码上) 给点个人意见吧,你咱做这种监控中哈,不能直接就取一次的值就越位显示出来了,最好先建立一个数据有效性的机制,先确定有效的数据再进行显示,这样可能会好一点...   详情 回复 发表于 2007-2-10 11:34
点赞 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
Delays();//1S

其它的先不说,这个感觉有点不科学...
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一时间找不出自增的原因(从代码上)

给点个人意见吧,你咱做这种监控中哈,不能直接就取一次的值就越位显示出来了,最好先建立一个数据有效性的机制,先确定有效的数据再进行显示,这样可能会好一点...
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表