8587|17

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

LC测量小工具规整贴第四,整合第一步:让1602显示LM311的频率 [复制链接]

[media=ra,400,300,0][/media]到上一周为止,三个子任务基本完成。
于是就到了最具挑战性的整合。
周六倒班,直到周六晚上8点半我到宿舍,我才开始看anqi90给我的程序代码,然后做了一定修改。
——我只是对主程序流程做了一些改动,针对我手上的硬件情况,以方便测量而已。我尊重anqi90的工作,所以没有改过他的思路。
只是根据我自己的2052的IO口状况改动了1602的头文件。

我拍了个视频,因为效果比较一般,不过还能看清。正在土豆上传着,速度比较痛苦,但毕竟大半夜,还对得起观众,已经60%多了。


先简单说说结果:
可以在1602上显示测量出来的频率(因为时间关系,我还没加入计算成电容电感的部分程序,所以只是显示频率),但是,很可惜,显示的结果与上次在示波器上看到的结果,跟理论值相差太远。
示波器上显示是506K前后,这与我当时简单心算出来的结果500K左右是大致相符的。
但是,1602显示的结果却只有180K左右,而且很不稳定。时不时飘到几十K,有一次最恐怖,甚至出现过6M多.......
然后我就一直在折腾这件事,因为在网上看到DIY的人说加个缓冲器会好很多。
我也就加了个4069,可是,不加还好,加了压根没起振。感觉4069没坏,想不通为什么。
后来又想试图用9018搭一个射级追随器,可惜很久没碰三极管了,除了开关电路,这些压根忘记了。
在那本日本人的书上找到一个图,就弄了,结果直流点都不对。诶,这回就到了半夜1点多了,我也没辙了,只好撤了。

[ 本帖最后由 辛昕 于 2011-4-6 18:59 编辑 ]

效果视频.zip

11.71 MB, 下载次数: 223

此帖出自51单片机论坛

最新回复

奥我们是学校安排的,在学校的机电学院的工厂里哈哈哈 [ 本帖最后由 鑫海宝贝 于 2011-4-11 20:48 编辑 ]  详情 回复 发表于 2011-4-11 20:46
点赞 关注(1)
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

56

TA的资源

裸片初长成(中级)

沙发
 

发一个我改动后的主程序(在anqi90给我的程序基础上)

#include "STC12C5A.h"               
#include "LCD1602.h"
#include "Delay_12M.h"
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int

#define KEY P32
#define SIGNAL P37

uint test(void);
float calculate(uint);
void transfer(uchar Dis[],long value);

void main(void)
{
   uint  time = 0;  //用于记录校准结果
        uint  time1 = 0; //用于记录测量结果                  
        uchar char1[16]="             Hz";
        float frequency = 0;

         //IE = 0x88;                                //开总中断和定时器1中断
       
        //TMOD=0x11;                        //计数器0、1作为16位定时器
        //AUXR|=0x80;                        //计时器1工作在1T模式,计时器0工作在12分频
                                
        P3M0=0x80;
       
        P3M1=0x00;                        //设P37为高阻

    Lcd_Ini();
    Lcd_Write_String(1,1,"Please adjusting");
        Lcd_Write_String(2,1,"Pressing the key");

         while(1)
        {
            time = 0;
                if(!KEY)
                {
                //清屏操作
                                Lcd_Clear_Line(1);
                        Lcd_Clear_Line(2);
                //提示在校准中
                        Lcd_Write_String(1,1,"it's adjusting");
                //调用测量程序
                time = test();
                }
                if(time)                    //如果已经测得测量值则退出
        {
                    frequency = calculate(time);
            transfer(char1,5746);
                        //清屏操作
                        Lcd_Clear_Line(1);
                    Lcd_Clear_Line(2);
                    Lcd_Write_String(2,1,char1);
                    break;
                }
        }

/*---------------------频率计算显示----------------------*/
        while(1)
        {         
                Delay_ms(200);
                Delay_ms(200);
                //
                time1 = test();
                frequency = calculate(time1);
         transfer(char1,frequency);
                //清屏操作
                Lcd_Clear_Line(1);
                Lcd_Clear_Line(2);
                Lcd_Write_String(1,1,char1);
        }


}


/*--------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------*/
uint test(void)
{
        uchar i = 0;

        TL0 = 0;
        TH0 = 0;
        TL1 = 0;
        TH1 = 0;
        TR1 = 1;                                //开计时器1
/*-----------------------------------------------------*/
/*----------------------检测跳变-----------------------*/
    while(!SIGNAL);               
        while(SIGNAL);
        TR0 = 1;                                //启动计时器0
/*--------------计数一百个脉冲---------------------------*/
        do
        {         
                while(!SIGNAL);
                i++;
                while(SIGNAL);
        }while(i != 99);
/*--------------------------------------------------------*/
          
        while(!SIGNAL);
        while(SIGNAL);
        TR0 = 0;                                //关闭计时器0
        TR1 = 0;                                //关闭计时器1               
       
        return (256 * TH0 + TL0);
}

/*------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------*/
float calculate(uint time)
{
#define TIMES 100                      //计数次数
#define BASE  1000000                  //对应一条机器周期的倒数,12M的晶振
#define SUM   (TIMES * BASE)           //先计算该常数,提高速度

float frequency = 0.0;
    frequency = SUM / time;            //time为主函数传递来的100个脉冲的时间长度
return frequency;
}

/*------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------*/
void transfer(uchar Dis[],long value)
{
   uchar i = 0;

   
      for(i = 12; ;i--)          //从数组末开始存储
      {   
                          Dis = value % 10 + 0x30;   //从末位开始取
                      value /= 10;                     //截取末位
            if(!value)
                            break;
          }

   //未用的位一律补空格
   //while(i >= 0)
        //Dis[i--] = 0x20;
}
/*------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------*/
void Timer1() interrupt 3 using 0
{
    uchar i=0;

        i++;                                                  //计时器1溢出中断作为测量时的看门狗
        TH1=0;                                                     //65536us=65.6ms       
        TL0=0;                                                  //15次溢出约1s
        if(i>15)
        {
                Lcd_Write_String(2,1," OUT OF RANGE!!");  
                while(KEY);
                Lcd_Clear_Line(2);
                while(!KEY);
                i=0;
        }
}

[ 本帖最后由 辛昕 于 2011-4-4 01:42 编辑 ]

改动后的程序.zip

34.47 KB, 下载次数: 31

此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 

思路有点乱,补一份我早上动手前写的一份提要

利用anqi90提交的很完整的单片机频率计程序(带有1602显示部分),根据个人对操作和测量过程的设想,调整了一下程序。
先说一下我设想的一个测量流程。

/*---------------------------------------完整测量流程与操作说明-----------------------------------------------*/

1 首先,上电(开机或者复位)之初,必须让它先进行 自校准。
LCD1602显示提示信息“Please Adjusting”
为了让用户无须仓皇按动标准电容支路上的校准开关,我们用把这个步骤包在一个死循环里,最后通过校准值不为零(初始化为零)为判断条件break出死循环。
在该循环里,一经检测到按下校准开关,即调用子程序test()进行测量,同时记录在变量time里。

/*-----------------------------------关于测电感或测电容的一点说明------------------------------------------*/
现阶段的LM311测量电路的开关切换电路暂时是通过一个带锁机械开关完成的,非电子开关,所以,按下或松开该开关将通知单片机本次的测量项目是电感还是电容。所以,复位之前,请按下或松开开关。
/*---------------------------------------------------------------------------------------------------------------------------*/

2 再次调用子程序test(),进行真正的测量工作,记录在time1里。
3 调用运算程序,根据time,time1换算出被测频率。
4  调用LCD1602显示子程序,实时(每次测量显示一次)测量结果。
5 在复位或上电以前,以上动作不断重复。也就是,这是第二个死循环。

要进行新的一次测量,请按动复位开关(请根据被测项目切换开关),届时,将重复上述的(1)~(5).
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1469

帖子

0

TA的资源

五彩晶圆(中级)

4
 
顶一下,和辛昕讨论的过程中发现了很多忽视了的东西,还有很多要学啊
此帖出自51单片机论坛
 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

5
 
辛苦了,不知道我能不能给点什么力所能及的小帮助
此帖出自51单片机论坛
 
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

6
 
你们都很棒啊,来顶顶实习累屁我了,跟不上大家进度,抱歉了啊
此帖出自51单片机论坛
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

7
 
原帖由 鑫海宝贝 于 2011-4-4 21:20 发表
你们都很棒啊,来顶顶实习累屁我了,跟不上大家进度,抱歉了啊

我也脱离大队很久了呢,不知道现在能帮得上些什么。
鑫海宝贝去哪里实习啦?我最近也想找实习的说。
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

8
 
我那天弄了一天,是弄糊涂了。
我第二天,也就是4号早上刚上公车没多久,就悲剧的想起一个问题。
我估计这就是问题所在!!
我没设置使用外部晶振,娘的,,,,
我当时就想这数据也错的太有规律了,刚好相差3倍左右,不多不少。
弟兄们,等我,我吃完饭,今天我果断试试。
顺带做一个集合到一起的完整电路板。反正下载用的最小系统也不够用,老拆卸,太麻烦。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

9
 

回复 5楼 zjjone1023 的帖子

当然有,你的事情还没完呢,继续继续......
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 

回复 7楼 jaych 的帖子

那就赶紧归队吧,你们两个臭小子,,,哥需要你们啊
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

11
 

昨晚的进展

昨晚回宿舍有点晚,8点过了大半才坐下来,首先把板子认真检查了检查,然后把一些线给补上,好了。
然后再烧一次程序,不过第一回我还是忘了选外部晶振(现在想想,其实这个疏忽是好事。)
插上做好的目标板,额,好像有的地方接触不太好,应该是LCD1602的那个插座,自己用排母和排针做的,真恶劣。
不过还好,显示的内容很正常,只是还是计算值地三分之一。
这时我才想起,我忘了选晶振。
于是,于是就挂了。
我再次烧程序,选了外部晶振,哇塞,压根不行,LCD屏第一排是黑的。
期间因为怀疑接触问题,我反复压了好几回板子上的几个有接插地地方,依然不行。
到最后,我想起一个问题,于是我把51拿了下来,OMYLADYGAGA,我的天,LCD居然还是一排黑,也就是说,,,刚才51压根没起过反应。
我想了想,想了很久,跟最小系统对比,心想,如果还有什么差别,那就是我的P1口没有外接上啦电阻了,于是我把P1口设成强推挽,嗨,一个样。

这时,我就不折腾了,因为既然第一次是好的——在我改用外部晶振以前好一段时间,它虽然接触不良吧,但一直是好的,也就是说不存在别的什么太随机性地问题。

最后我只好检查51系统了。先检查晶振,问题就出在这里,我惊奇的发现,它两端地压差居然在4、5V,额滴神,就是说,整个系统压根没启动过。

当时已经是10点多。我坐在电脑前,对着这个板子愣了好久的神,还是没想出什么法子。
仔细看了看晶振电路,也没接错啊。

后来突然感到很困,因为刚才已经洗澡了,头发也干了。心想爬床上躺一会好了。
谁知道,不知道是太困还是怎么回事,我居然睡着了,大半夜被蚊子咬醒了(幸好天不冷,不然估计就是被冷醒的),上了个厕所,发现电脑没关,这才想起自己怎么会半夜发现自己穿着衣服爬在棉被上睡觉。
拿出手机一看,2点,而且彼时其困无比,顺手合上笔记本,然后继续睡......

早上醒来,7点了,刷完牙本想晚上回来再说,可是心里很不爽。
我不晓得我是什么时候开始意识到问题就出在晶振上。

一开始好好的,那是因为我压根没用晶振,所以好好的。而且如此说来它应该也没短路。
刚想刷牙,心里实在闷不过,于是跑回房间上了电烙铁。
然后刷完牙,试着换了个晶振,依然不行,依然5V。
看看手机,没办法,时间不够了,快8点了。

其实在我换晶振的时候,我只是在排除问题,我并不很认为是晶振的问题,以我最近这种思维状态,我很担心我今晚回去会发现我什么地方的线路接错了。
不管怎么说,这就是昨晚的进展。
我本以为我至少可以把目标板弄好,就算我还是没发现问题所在。

PS:另外说一下,关于我之前认为的那个使用外部晶振和内部RC源的问题,在我作目标板以前我试过一下,不行,事实上,我计算了也发现,用12M的晶振,比起内部4到8M的RC源而言,显示的结果其实是更小,不是3倍,而是3分之一。
所以现在,我暂时也没啥法子了,不管咋说,今晚我回去力争把目标板——也是我们最终的成品电路板调好来再说,周六还得倒班,没准只能等周日了,再去一下同学的实验室。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

12
 

补两张图片,早上拍的

图片和完整的项目文件

[ 本帖最后由 辛昕 于 2011-4-8 09:11 编辑 ]

图片 001.jpg (47.05 KB, 下载次数: 0)

图片 001.jpg

图片 002.jpg (30.06 KB, 下载次数: 0)

图片 002.jpg

封装包.zip

104.61 KB, 下载次数: 12

这个里头也包含了图片,不过我传它是传完整的KEIL项目文件

此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

13
 

2011.4.8晚 进展

今天晚上,在好一会的折腾后,把LCD1602的EN线的接触不良解决后,通过使用RC源和外部晶振源,确定了问题就出在 晶振电路上。
我看了好一会没看出什么问题,于是,我就把那部分电路重新拆了,重新焊了一次,因为用了0805,我把距离拉远了一些。
接上后,发现,起码正常了,晶振正常了,也能跑程序了。
只是,数值还是不对。
530K多也罢,550K多也罢,但是,当我按下标准电容校准时,却发现,频率基本没变,这是很不合理的。
因为这里应该变化接近0.7倍,2的开方根嘛。
-------------------
我没怎么看电路,只是习惯性把4069接上去,依然不行,真可恶,它如果出现了错误的结果也就罢了,可恶的是,它压根不起振。

[ 本帖最后由 辛昕 于 2011-4-9 00:27 编辑 ]

图片 004.jpg (35.05 KB, 下载次数: 0)

图片 004.jpg

图片 003.jpg (32.54 KB, 下载次数: 0)

图片 003.jpg
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

14
 
辛昕,顶你。
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

15
 
明天再倒一天班。
马上就周末了。
我想去再买一块LM311,另外就是找同学,去去实验室上上示波器。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

16
 
早上醒来等公车的时候,我想起一件很诡异的事情。
如果说是LM311的问题,那为啥用内部RC源的时候,虽说人家的数值也不对,但好歹人家按下标准电容校准时,那频率还真的是变化了三分之一,这个数值,比例差不多对了。
为啥用外部晶振源就不行呢?
我忽然觉得很恐怖,难道这个晶振电路真的这么成问题?
因为它一直是500多K啊......
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

17
 
辛昕辛苦了!
此帖出自51单片机论坛
 
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

18
 

回复 7楼 jaych 的帖子

奥我们是学校安排的,在学校的机电学院的工厂里哈哈哈

[ 本帖最后由 鑫海宝贝 于 2011-4-11 20:48 编辑 ]
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表