找回密码
 立即注册

QQ登录

只需一步,快速开始

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

十年来第一个单片机成果

[复制链接]
跳转到指定楼层
楼主
ID:71235 发表于 2014-12-28 00:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是运行照片


这是去掉显示器后的线路板


终结:
    1:元件选择;全部选用低功耗低电压的串行模块,包括一总线温度传感器DS18B20,串行时钟DS1302,串行8位笔划液晶显示器SMS0801b(长沙太阳人公司产),及89C2051单片机,原本要增加一个频率输出的湿度传感器,因89C2051代码空间有限而作罢.

    2:开发工具,51开发板,KEIL C51,自己用试验板焊的板子(开发完成,试验板就成了成品板了),EP51PRO编程器,XL1000主要用来测试DS18B20及重新熟悉C51程序,因开发板输出端子接触不牢靠,影响DS1302正常读数,故而DS1302其实是在试验板上用烧片的方式完成测试(没有仿真器很苦)

    3:程序,全部用C51书写编译(搞习惯了高级语言.写不来汇编了),编译后大约占用了1.84K的代码空间,56字节的XDATA空间,一片89C51正好装下,程序采用模块化设计,显示,数据写入读出,键盘处理全部是集中处理的,使用了一定的编程技巧.

    4:功能,参照本人的卡西欧手表的按键操作方式设计了功能模块的显示,调整,切换,
      按键一:开机复位后显示时间界面,按一下切换到日期显示,再按是温度,再按是闹钟,再按返回时间界面,若在调整界面则用于调整项目的循环切换;
      按键二:在时间,日期,闹钟显示界面下按2秒,出现各自的调整界面,再按2秒退出调整界面,进入调整界面后,要调整的项目0.5秒间隔闪烁;
      按键三:调整---数字加1,或启停闹钟(暂不支持连续按键)
      按键四:调整---数字减1,或启停闹钟

    5:精度,时间精确到秒(具体精度由32.768K晶振决定),闹钟以分为单位响闹,每次响闹20秒,按任意键停止.温度精确到0.5度,分辨率是0.1度

    6:电源问题:起初用DC-DC升压模块+两节镍氢电池供电,后测试电池输出电流达20毫安,2400毫安时的电池5天不到就完了, 而89C2051本身只耗7毫安电流,其他模块加起来耗电还不到1毫安,可见DC-DC升压模块的效率实在太低,不具备实用的价值,起码用在电池供电电路要求长期供电的成品中是不行的,后来去掉DC-DC模块,直接用3.7v锂电池供电,则电流减小到3毫安,比原来足足少了6倍之多.
    采用3.7v供电后产生了一个问题,到现在还不知道原因,就是板上的模块理论上都支持2.7v的低压,DS1302支持2.5V,但是在实际使用中发现供电电源小于3.6V时,DS1302读数就出现混乱了,离器件手册所说的2.5v相差很大,以至于用锂电池供电都有一定的困难了,因为锂电的放电终止电压有2.75v,用3节镍氢供电存在同样的问题,3节电池总电压是1.35*3=4.05v,放电到1.2*3=3.6v就不能正常工作,但是他的终止电压有1.1v,加起来才3.3v,除非用碱性电池,这样问题是解决了,成本也上去了.

     7:改进,未来想更换12M的晶振为4M的,进一步减少耗电,但是要改动程序,因为DS18B20对时序要求很严格,为了保证DS18B20的正常读数,甚至要暂时关闭中断.还可以试验用让系统进入空闲方式的方法减少耗电.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:71235 发表于 2014-12-28 00:48 | 只看该作者
    从下午开始搞起一直到晚上一直在测试这个来自网上的驱动程序,程序很不稳定,按复位键后经常显示不出来,最后从网上找了其他的程序,比较后发现是液晶初始化程序有问题,大部分程序都是根据一个1602的数据手册写的,大致如下:
1.LCM_WriteCommand(0x38,0);
delaytime(5);
2.LCM_WriteCommand(0x38,0);
delaytime(5);
3.LCM_WriteCommand(0x38,0);
4.LCM_WriteCommand(0x38,1);
5.LCM_WriteCommand(0x08,1);
6.LCM_WriteCommand(0x01,1);
7.LCM_WriteCommand(0x06,1);
8.LCM_WriteCommand(0x0c,1);
有问题的就是第五个调用,是关闭显示的操作!!!
回复

使用道具 举报

板凳
ID:71235 发表于 2014-12-28 00:49 | 只看该作者
  下午禁不住手痒痒,做了一条DS18B20的探头线,是用鼠标线、电容铝壳、3P接插件及热缩管做成的,质量还是不错的,就是线粗了点。程序重新写了一下,加入了读取探头温度的程序,编译后了以后89C2051只剩下了80字节的空间,今后想做点其他功能也是没办法了,除非换用89C4051,不过有没有这个必要要看自己的心情了。整个模块完成后,到厨房冰箱那里测试了一下零下温度显示功能程序,基本正常。
回复

使用道具 举报

地板
ID:71235 发表于 2014-12-28 00:49 | 只看该作者


    当初做好那个温控器的时候,就已经打算好要增加个通讯功能的,时间已经过去一年多,可还是什么都没做,因为最近在DIY上动作挺多,不如干脆也把这个功能实现了吧。

    上周六,开始准备工作,首先要实现的是单向通讯功能,单片机只定时发送温度数据到串口,PC机接收后显示在软件窗口上,PC控制单片机就不打算实现了,没这个必要了。这样只需要一个单向的RS232接口就行了,刚好夏天的时候去买了一个M8电子负载的套件,其中就有这个单向的RS232接口,是用分立元件实现的,很简单(3电阻,1三极管),于是把这个电路给抄了下来,在焊接线路板前,先用这个现成的电路测试一下。

    单片机软件部分,比较费劲的看了一下有关文档,还好只需要简单的发送功能,没有复杂的通讯协议,这样就先用CVAVR的代码向导生成了串口参数,然后加入到工程中,发送函数直接使用putchar函数发送4位温度值,每隔500ms发送一次,

    PC程序使用c#编写,也很简单,用串口事件接收4个字节,转成字符串后写入LABEL控件就可以了,不过要注意的是,要先设置串口控件的ReceivedBytesThreshold属性为要接收数据的字节数,否则不能正确区分前后发过来的数据,还有就是在.net下串口控件工作在辅助线程,不能直接向主线程发送数据,比如将数据写入label控件,这是只要设置Label(类名,不是具体的控件名称).CheckForIllegalCrossThreadCalls = false就可以了;

    费了点劲儿,打通了通讯环节,然后就是在线路板上搭建RS232转换接口,经测试完全没问题,接下了就是安装到服务器上测试了,串口线是用普通的电线绞成的,因为通讯距离不太远,也没什么问题。安装好后,程序全部正常工作,只是界面有一点问题,家里用的是WIN7,有微软雅黑字体,而服务器上只有黑体,所以温度数字显示的有点别扭,重新修改了一下界面,顺便加上了发送温度上限的功能。

    至此这次改造获得成功!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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