我最早接触MSP430时候,看到书的第一页就是一张水果电池的图片,一直以来想做一个低功耗的可以水果电池供电的系统,毕业之后的下半年选择MSP430F413单片机来画了一个低功耗的板子,一直没有调试成功,液晶显示太暗几乎看不到,最近又拿出来调试,更换偏压电阻,最终更换液晶后才可以正常显示,先看下最终效果:

最终效果

电路图:

调试过程

  最初调试时,先准备好苹果一个,电池正负极(铜锌),程序是显示一个数字,效果如下:

  突发奇想,用自来水试了一下,效果也是杠杠的(程序中间修改过,这是显示较多的液晶段):

  时钟调试效果(这里电池没有接入电路,调试时所用,当时没有拿下来,用跳线帽接到水果供电的电路上):

  刚刚调试时,万用表测试水果电池电压接近0.9V,短路电流25-30uA,接上电路仅显示数字7的时候,电流12uA,4节水果电池电压从3.4降到2.6V;水(普通自来水,每个地方水中含有离子数量不一样,获得电压电流都有区别)每节电池0.8V,短路电流接近40uA。

  程序换为时钟时,水果电池3.4V降到2.2V,大约维1个多小时,液晶完全没有显示,电极片换个位置重新插一下,时钟可以继续运行,测试电压和新做水果电池一样,苹果都要变干的时候,电压低一些,液晶明显变暗。

  后来,电路中提供液晶偏压电压的电阻有330K改为1M后,系统电流降到大约10uA,水果电池大约可以维持3-4小时,用水做的电池可以维持24小时以上

功耗分析

  这个低功耗的电路还有优化空间,单片机的不用的引脚可以再做优化,现有线路中有一般的液晶段引脚没有使用,却也提供的驱动波形,这里相对现有系统应当是浪费电流最大的一部分;另外一个优化空间是4个按键的上拉电阻太小,10K,3V的时候,按键按下瞬间,电流可以达到300uA,用水果电池的时候,按键功能不能使用,现在调试的时候,都是先拿CR2302供电,调节好时间后,再用水果(水)电池供电。
  进一步优化功耗后,电流应当可以降到5uA以下。

程序

  按键程序继续使用之前程序库中的按键程序;

  RTC计时使用TI的RTC软件库

  段码液晶的程序由程序库中的数码管程序移植而来:

    #include  <msp430x41x.h>#include  "segment_lcd_btl006.h"/*宏定义,数码管a-h各段对应的比特,更换硬件只用改动以下8行*/#define a       0x01                            //  AAAA#define b       0x02                            // F    B#define c       0x04                            // F    B#define d       0x80                            //  GGGG#define e       0x40                            // E    C#define f       0x10                            // E    C#define g       0x20                            //  DDDD  HH#define h       0x08        //小数点/*用宏定义自动生成段码表,很好的写法,值得学习*//*更换硬件无需重写段码表*/const char tab[] = {a + b + c + d + e + f,                  // Displays "0"b + c,                                  // Displays "1"a + b + d + e + g,                      // Displays "2"a + b + c + d + g,                      // Displays "3"b + c + f + g,                          // Displays "4"a + c + d + f +g,                       // Displays "5"a + c + d + e + f + g,                  // Displays "6"a + b + c,                              // Displays "7"a + b + c + d + e + f + g,              // Displays "8"a + b + c + d + f + g,                  // Displays "9"a + b + c + e + f + g,                  // Displays "A"c + d + e + f + g,                      // Displays "B"  a + d + e + f,                          // Displays "C"b + c + d + e + g,                      // Displays "D"a + d + e + f + g,                      // Displays "E"a + e + f + g,                          // Displays "F"a + c + d + e + f,                      // Displays "G"b + c + e + f + g,                      // Displays "H"  e + f,                                  // Displays "I"b + c + d + e,                          // Displays "J"b + d + e + f + g,                      // Displays "K"d + e + f,                              // Displays "L"  a + c + e + g,                          // Displays "M" a + b + c + e + f,                      // Displays "N"   c + e + g,                              // Displays "n"c + d + e + g,                          // Displays "o"a + b + c + d + e + f,                  // Displays "O"a + b + e + f + g,                      // Displays "P"a + b + c + f + g,                      // Displays "Q" e + g,                                  // Displays "r"a + c + d + f +g,                       // Displays "S"d + e + f + g,                          // Displays "t"a + e + f ,                             // Displays "T" b + c + d + e + f,                      // Displays "U"c + d + e,                              // Displays "v" b + d + f + g,                          // Displays "W"b + c + d + f + g,                      // Displays "Y" a + b + d + e + g,                      // Displays "Z"g,                                      // Displays "-"h,                                      // Displays "."  0                                       // Displays " "}; #undef a#undef b#undef c#undef d#undef e#undef f#undef g void lcd_init(){// Initialize LCDLCDCTL = LCDP1+LCDP0+LCD4MUX+LCDON;       // 4-Mux LCD, segments S0-S23BTCTL  = BTFRFQ1;                         // Set freqLCD = ACLK/128P5SEL  = 0xFC;                            // Set Rxx and COM pins for LCD// Clear LCD memory to clear displayfor (int i=0; i<12; i++){LCDMEM[i] = 0x00;}}void lcd_clear(){    for (int i=0; i<12; i++){LCDMEM[i] = 0x00;}}//不影响小数点或者冒号void lcd_display_char(char ch,char addr){addr = addr*2+2;LCDMEM[addr] = ((tab[ch]&0x0f)<<4)|(LCDMEM[addr]&0x80);LCDMEM[addr+1] = (tab[ch]&0xf0);//|(LCDMEM[addr+1]&0x80)}

  计时程序,每隔1s中断运行一次,计时则秒增1,设置则显示对应设置界面:

    #include  <msp430x41x.h>#include  "RTC_Calendar.h"#include  "RTC_TA.h"#include "segment_lcd_btl006.h"#include "time.h"char state = 0;  //1-6:年月日 时分秒void time_init(){lcd_init();setDate(2015,9,13);setTime( 0, 0, 0, 1);                  // initialize time to 12:00:00 AMTACCR0 = 32768-1;TACTL = TASSEL_1+MC_1;                    // ACLK, upmodeTACCTL0 |= CCIE;                          // enable TA0CCRO interrupt}//两位时间显示,格式十六进制高地位 地址0低位,1高位void time_display(char time,char addr){addr = addr*2;lcd_display_char(time>>4,addr+1);lcd_display_char((time&0x0f),addr);  }//4位时间显示,year,格式十六进制各个位 void year_display(int year){lcd_display_char(year>>12,3);lcd_display_char((year>>8)&0x0f,2);  lcd_display_char((year>>4)&0x0f,1);  lcd_display_char((year)&0x0f,0);  }//计时标志,冒号闪烁void tick(){LCDMEM[1]&=~0X80;LCDMEM[2]^=0x80;time_display(get24Hour(),1);time_display(TI_minute,0);}void setting(){LCDMEM[1]=0X80;switch(state){case 1:year_display(TI_year);break;case 2:time_display(TI_month==9?TI_month+7:TI_month+1,1);break;case 3:time_display(TI_day,0);break;case 4:time_display(get24Hour(),1);LCDMEM[2]|=0x80;break;case 5:time_display(TI_minute,0);LCDMEM[2]|=0x80;break;case 6:time_display(TI_second,0);LCDMEM[2]|=0x80;break;default:state = 0;break;}}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){incrementSeconds();if(state == 0){tick();}else{setting();}__bic_SR_register_on_exit(LPM3_bits);}

  主函数,根据按键更改操作状态,并且设置时间值:

    #include  <msp430x41x.h>#include  "RTC_Calendar.h"#include  "RTC_TA.h"#include  "segment_lcd_btl006.h"#include "time.h"#include "key.h"int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;FLL_CTL0 |= XCAP14PF;                     // Configure load capstime_init();KeyInit();__bis_SR_register(GIE);while(1){__bis_SR_register(LPM3_bits);           // enter LPM3, clock will be updatedchar key = ReadKey();if(key=='0'&&state==1){setDate(2015,TI_month>9?TI_month-5:TI_month+1,(TI_day>>4)*10+(TI_day&0x0f));}if(key=='1'){if(++state == 7){state = 0;}        }if(key=='2'){switch(state){case 1:incrementYears();break;case 2:incrementMonths();break;case 3:incrementDays();break;case 4:incrementHours();break;case 5:incrementMinutes();break;case 6:incrementSeconds();break;default:state = 0;break;}}if(state!=0){lcd_clear();setting();}else{tick();}}return 0;}

最新运行效果

  上午刚刚拍的,昨天(2015-10-02)晚上,发觉液晶有些暗,水里面加了一些盐,显示效果更好一些,运行时间应该也会更久:

转载于:https://www.cnblogs.com/Engin/p/4853236.html

基于MSP430F413水果电池供电的低功耗时钟相关推荐

  1. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  2. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  3. 基于51单片机的数字时钟(万年历)

    具体实现功能 系统由STC89C52单片机+DS1302时钟芯片+按键模块+LCD1602显示+电源构成. 具体功能: 1.可以显示年.月.日.时.分.秒.星期.农历: 2.按键可以设置闹钟及报警: ...

  4. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  5. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  6. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

  7. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  8. 国产CSM32RV20是基于RISC-V核的低功耗MCU芯片

    CSM32RV20是一款基于RISC-V内核的低功耗 mcu 芯片.芯片内置了一个4k字节的SRAM.它可以以字节.半字(16位) 或全字(32位)访问,支持4种低功耗模式,最低功耗小于1uA,根据最 ...

  9. 基于RT-Thread系统的迷你时钟

    基于RT-Thread系统的迷你时钟 项目目标 通过OLED显示屏显示时间与温湿度的基本功能. 准备工作 软件 RT-Thread Studio v2.1.0 I2C设备驱动(用于读取温湿度传感器) ...

最新文章

  1. 折返(Reentrancy)VS线程安全(Thread safety)
  2. Nagios 配置文件介绍
  3. python埋点自动化_iOS自动化埋点的实现
  4. boost::spirit模块利用 std::tuple 将多个属性包装成一个的测试程序
  5. python3.7官网中文官网_Python官网宣布,正式发布Python 3.7.0!
  6. Visual Studio Code现已支持Linux“快照包”安装
  7. Excel表格从指定部分重新分页打印的两种方法
  8. JDK 8功能的可疑方面
  9. linux mailbox模型
  10. 操作文件的实用类,删除目录,清空目录,删除文件
  11. 881.BoatstoSavePeople
  12. Quartus17下载程序进FPGA
  13. labview数据库查询mysql_Labview查询数据库及调试
  14. mysql数据库优化方向
  15. 大数据为你解读2017年全国出差地图
  16. MATLAB:图像水平、垂直、水平垂直镜像、转置、旋转变换(flipdim、mirror、transp、imrotate函数)...
  17. hdu5336XYZ and Drops
  18. 开学季征文 | 一位开发实习生的真情流露
  19. js vue+elementui 全屏跟退出全屏功能搬砖
  20. 加密视频(java加密视频)

热门文章

  1. opencv AKAZE 局部特征匹配算法
  2. python一个中文占几个字节_python中英文字母和中文汉字所占的字节
  3. request 和require区别_合同翻译时如何区分使用request和require
  4. 我的一些学习经验:概述
  5. integer比较_Java中的整型包装类值的比较为什么不能用==比较?原因是因为缓存
  6. 95-32-015-ChannelPipeline-DefaultChannelPipeline
  7. 【clickhouse】clickhouse clickhouse-client 使用
  8. Spark structured 记录一次kudu扩容导致无法写入数据的问题
  9. 自定义 Git - Git 钩子
  10. 案例:规则引擎Drools解决汽水问题