项目经历

P89V51RD2FN的ISP下载成功
昨天下午P89V51RD2FN的ISP下载成功了,原理图按照周立功网站的提供的下载电路(直接用串口下载)。以前用51开发板不知道为什么下载不行,电路是一样的。后来自己重新焊了一块板下载就成功了(把Option->Advance Options...中的Misc页下的Disable device signature checking选上,见下图)。可是下载后的程序似乎跑不起来,写了个用P0.0控制灯闪烁的程序,但P0.0根本没有变高电平。
项目经历 - william_djj@126 - 我的博客 项目经历 - william_djj@126 - 我的博客
    改了一下程序检查一下其他口可否输出高电平,发现可以。觉得是不是p0口坏了呢?但芯片是新买的,应该不会啊。于是看看芯片datasheet的p0口介绍。
Port 0: Port 0 is an 8-bit open drain bi-directional I/O port. Port 0 pins that have ‘1’s written to them float, and
in this state can be used as high-impedance inputs
原来p0是集电极开路,也就是说要外接上拉电阻,否则写1到P0口电平是浮动的。我当时怎样测都是0.3V。
其他口都内部带上拉电阻,所以写1当然输出高电平。

晚上调试键盘和显示电路,浮点数能正确地写入AT24C08,也能正确地读出。但是前面的序号就是显示成乱码。
我想是否ZLG7290的显示缓存DpRam0~DpRam7只能按一定的方向次序写,不能先写DpRam7,6,然后再按次序写DpRam0~4?后来按从DpRam0~DpRam7方向写还是乱码,不是这个原因。在和师兄的讨论中发现原理在调用ZLG7290_WriteReg()函数的第二个参数填错了,这个参数是字型码不是显示的数字,太粗心了。

后来发现低四位数码管总是不亮,程序逻辑检查了多遍完全没错,想了很久不知道原因。后来偶尔发现在key_handle()中声明的一个len局部变量覆盖了全局的len变量。当时为什么就不用gd来检查变量呢。alas
2008-10-26

基本完成了键盘显示功能
在被ZLG7290郁闷了很久后,昨天把键盘从7290分离出来,因为这芯片作为数码管显示扫描(包括闪烁等功能)还是很好用的,但是在扫描数码管的同时接入了键盘电路后(分时扫描键盘),按键时有时会影响显示。试验了多次决定把6个按键直接接到单片机的io脚。
本来这时挺简单的硬件电路,再写写对应的软件就ok的,但是却花了一天的时间调试软件,整数能写进存储器AT24C08但读不出来,后来发现sprintf ()的格式化字符串“%ld”和“%d”是不同的,从存储器读出的占4B的长整型用“%ld”才能正确转换成字符串,用“%d”总是转换成0。
2008-10-28

T2定时器成功
昨晚用51的T2定时器,写了些代码配置T2对应的寄存器,发现T2似乎不工作,怀疑寄存器某些位没写好于是整天晚上看datasheet,想不明。第二天早上在main()函数的最后加上while(1);后就可以了。
2008-10-30

整数无法显示
硬件软件检查了一天,最后把ZLG_7290Download()改成用ZLG_WriteReg()就能显示整数了。今天竟然P89V51RD2FN又不能下载程序了,不明!!!!后来换到串口1下载又成功了。
2008-10-31

SegA又亮起来了
上次那块高低位数码管布反了的板能正常显示,开心很久,重新做了一块板把高低位反过来,其他的元件都一样,以为大功告成,谁知这几天调试发现SegA总是亮,明明跟上次那块板一个样,新做的这块就亮,上次的就不亮,真是莫名其妙!后来摇一摇各个三极管,发现竟然会影响这段是否亮,初步确定是虚焊。于是把松的三极管都再焊,这时发现A段一直亮着,my God,想它亮就不亮,想不亮它就亮。后来再细心测每个三极管的各个脚,发现A段的这个3906竟然短路,靠!!!重新换个三极管后就OK了。
2008-12-3

终于大功初成
今天晚上在初步调试DA转换时发现原来没有把ad420的clear引脚置0,失误了一小下。接着正常准确采到脉冲数,一切很顺利。最后把按键逻辑再改善了一下,加入面板负数加减显示同步,也很顺利,写程序逻辑清楚就快就完成了。至此,这台仪器除了装进机箱,其他的所有硬件和软件都基本完成,剩下的就要看时间的考验了。
2008-12-8

继电器不稳定
最后测试继电器发现报警时继电器的触点很不稳定,每过几秒会迅速跳跃一下,发现单片机的io口电平不稳定导致,但程序似乎没得再改了,为什么写too_high=0时出现不稳定,而failure不会呢?下午细心再检查一遍程序,发现把time_out这个变量添加上(此变量在计时器时间到设置为1),即在计时器时间到才判断是否报警,而原来的程序在主程序中不断地判断有没有超临界值,这会不断地写报警的io口,导致继电器不稳定。
void main()
{
....
    while(1)
    {  
        ...
        //是否有按键
        if(key_press)
        {    key_press=0;
            if(key_handle()==1)//没有此键值,或按compute键后计算错
            {    ZLG7290_WriteReg(0x15,0x2A);//在第5位显示|^|
            }
        }
        if(measure && time_out)//如果处于测量且时间到,把百分比对应65535划分值送到ad420
        {    time_out=0;
            if(pulse_num0==0)//没测到脉冲
            {    failure=0;//报警
                led_probefail=1;//probefail灯亮
            }
            else
            {    failure=1;
                led_probefail=0;
            }
            //显示计数值
            len=sprintf(flstr,"%ld",(long int)pulse_num0);
            pos=11;
            display(11);
            compute_wet((long)(pulse_num0/measure_times));//计算湿度并且判断超上下限报警
            AD420Write(wet*65535);//输出湿度百分比对应的电流值
           
        }
    }
}
....
void compute_wet(long plses)//{{{
{
    if(plses<N0)
    {
        wet=0.0;
        empty=0;//empty报警
        too_high=1;
        too_low=1;
    }   
    else
    {    empty=1;//没报警
        wet=eA*pow((plses-N0),M);
        if(wet>FgH)
        {    too_high=1;//超最大值报警
            too_low=0;
        }
        else if(wet<FgL)
        {    too_low=1;//lowalert,超最小值报警
            too_high=0;
        }
        else//如果不小于又不大于域值则不报警
        {    too_high=1;
            too_low=1;
        }
    }
}//}}}
....
2008-12-11
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值