找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于SHT10+MSP430F449设计的电子钟和湿温度计

[复制链接]
跳转到指定楼层
楼主
这是我基于MSP430F449设计的电子钟和湿温度计

单片机源程序如下:
  1. #include <time.h>
  2. #include "io430.h"
  3. #include "display.h"
  4. #include "rtc.h"
  5. #include "sht10.h"
  6. #include "key.h"

  7. void KeyProcess(void);
  8. void AdjustDateTime(void);

  9. enum __dis_state{DATETIME, TEMPERATURE, HUMIDITY, VOLTAGE};
  10. enum __bl_state{OFF, ON};
  11. enum __adj_state{ADJ_YEAR, ADJ_MON, ADJ_DAY, ADJ_HOUR, ADJ_MIN, ADJ_SEC};

  12. struct tm datetime;
  13. float temp, humi;
  14. int display_state = DATETIME;

  15. void ReverseBacklight(void)
  16. {
  17.     static int backlight_state = OFF;
  18.     //P3.7, output HIGH --> ON, LOW --> OFF
  19.     P3SEL &= ~BIT7;
  20.     P3DIR |= BIT7;
  21.     if (backlight_state == OFF)
  22.     {
  23.         backlight_state = ON;
  24.         P3OUT &= ~BIT7;
  25.     }
  26.     else
  27.     {
  28.         backlight_state = OFF;
  29.         P3OUT |= BIT7;
  30.     }
  31. }
  32. void InitClock(void)
  33. {
  34.     FLL_CTL0 &= 0x0F;
  35.     FLL_CTL1 = XT2OFF;
  36.     SCFI0 = FN_2;
  37.     SCFQCTL = 121;  //DOC ~ 4M
  38. }

  39. void lpm_delay(unsigned char second)
  40. {
  41.     int i;
  42.     for(i=0; i<second; i++)
  43.     {   
  44.         if (KeyIsPress())
  45.             return;
  46.         WDTCTL = WDT_ADLY_1000;
  47.         LPM3;
  48.     }
  49.     WDTCTL = WDTPW + WDTHOLD;
  50. }

  51. int GetVoltage(void)
  52. {
  53.     int volt;
  54.     int i, sample=0;
  55.     //Enable Internal Voltage Reference
  56.     ADC12CTL0 = SHT1_8 + REF2_5V + REFON + ADC12ON;
  57.     ADC12CTL1 = SHP;      
  58.     ADC12MCTL0 = 0x1B;
  59.     ADC12CTL0 |= ENC;  
  60.     __delay_cycles(100);    //wait for Vref stable;
  61.     for(i=0; i<8; i++)
  62.     {
  63.         ADC12CTL0 |= ADC12SC;
  64.         while(!(ADC12IFG & BIT0));
  65.         sample += ADC12MEM0;
  66.     }
  67.     ADC12CTL0 = 0;
  68.     sample >>= 3;
  69.     volt = (int)(sample * 1.221);  //*1.221
  70.     return volt;
  71. }

  72. void InitUnusedPin(void)
  73. {
  74.     //P6.0 ~ P6.7
  75.     //P1.0 ~ P1.6
  76.     //P2.4 ~ P2.5
  77.     //P3.2 ~ P3.6
  78.     //P4.0 ~ P4.7 except P4.3
  79.     P6DIR |= 0xFF;
  80.     P1DIR |= 0x7F;
  81.     P2DIR |= BIT4+BIT5;
  82.     P3DIR |= BIT2+BIT3+BIT4+BIT5+BIT6;
  83.     P4DIR |= 0xF7;
  84.     P6OUT &= 0;
  85.     P1OUT &= 0x80;
  86.     P2OUT &= ~(BIT4+BIT5);
  87.     P3OUT &= 0x83;
  88.     P4OUT &= 0x08;
  89. }

  90. int main( void )
  91. {
  92.     // Stop watchdog timer to prevent time out reset
  93.     WDTCTL = WDTPW + WDTHOLD;
  94.     InitUnusedPin();
  95.     IE1 |= WDTIE;
  96.    
  97.     InitClock();
  98.     InitRTC();
  99.     InitKey();
  100.     //LCD Init
  101.     LCDCTL = LCDON + LCD4MUX + LCDSG0_5;      // LCD on, 4-Mux, segments S0-S27
  102.     BTCTL = BT_fLCD_DIV128;                   // LCD clock freq is ACLK/256
  103.     P5SEL |= 0xFF;
  104.    
  105.     ResetMem();
  106.    
  107.     __enable_interrupt();

  108.     while(1)
  109.     {
  110.         switch (display_state)
  111.         {
  112.         case DATETIME:
  113.             RTCGetDateTime(&datetime);
  114.             DisplayDate(datetime.tm_year, datetime.tm_mon, datetime.tm_mday);
  115.             DisplayTime(datetime.tm_hour, datetime.tm_min, datetime.tm_sec);
  116.             lpm_delay(1);
  117.             break;
  118.         case TEMPERATURE:
  119.             if (GetTemperature(&temp))
  120.             {
  121.                 DisplayTemperature(temp);
  122.                 lpm_delay(3);
  123.             }
  124.             break;
  125.         case HUMIDITY:
  126.             if (GetTempAndHumi(&temp, &humi))
  127.             {
  128.                 DisplayHumidity(humi);
  129.                 lpm_delay(3);
  130.             }
  131.             break;
  132.         case VOLTAGE:
  133.             DisplayVoltage(GetVoltage());
  134.             lpm_delay(2);
  135.             break;
  136.         default:
  137.             display_state = DATETIME;
  138.             break;
  139.         }
  140.         
  141.         KeyProcess();
  142.     }
  143. }

  144. //
  145. void KeyProcess(void)
  146. {
  147.     unsigned char key;
  148.     long i;
  149.     key = GetKey();
  150.     switch(display_state)
  151.     {
  152.     case DATETIME:
  153.         if (key & UP) display_state = VOLTAGE;
  154.         else if (key & DOWN) display_state = TEMPERATURE;
  155.         else if (key & OK) {
  156.             for(i=0; i<500000; i++) if (P2IN & BIT3) break; //release.
  157.             if (i == 500000)
  158.             {   //Long Press
  159.                 AdjustDateTime();
  160.             }
  161.             else
  162.             {
  163.                 ReverseBacklight();
  164.             }
  165.         }
  166.         break;
  167.     case TEMPERATURE:
  168.         if (key & UP) display_state = DATETIME;
  169.         else if (key & DOWN) display_state = HUMIDITY;
  170.         else if (key & OK) { //SWITCH BACKLIGHT
  171.             ReverseBacklight();
  172.         }
  173.         break;
  174.     case HUMIDITY:
  175.         if (key & UP) display_state = TEMPERATURE;
  176.         else if (key & DOWN) display_state = VOLTAGE;
  177.         else if (key & OK) { //switch backlight
  178.             ReverseBacklight();
  179.         }
  180.         break;
  181.     case VOLTAGE:
  182.         if (key & UP) display_state = HUMIDITY;
  183.         else if (key & DOWN) display_state = DATETIME;
  184.         else if (key & OK) ReverseBacklight();
  185.         break;
  186.     default: display_state = DATETIME; break;
  187.     }
  188. }

  189. void AdjustDateTime(void)
  190. {
  191.     int state = ADJ_YEAR, exit_code = 1;
  192.     unsigned char key;
  193.     struct tm dt;
  194.     RTCGetDateTime(&dt);
  195.     dt.tm_year += 2000;
  196.     while(exit_code)
  197.     {
  198.         switch (state)
  199.         {
  200.         case ADJ_YEAR:
  201.             do{
  202.                 DisplayNum(dt.tm_year);
  203.                 key = GetKey();
  204.                 if (key & UP)
  205.                     dt.tm_year ++;
  206.                 else if (key&DOWN)
  207.                     dt.tm_year --;
  208.                 else if (key & RIGHT)
  209.                 {
  210.                     state = ADJ_MON;
  211.                     break;
  212.                 }
  213.                 if (dt.tm_year == 2100) dt.tm_year = 2000;
  214.                 if (dt.tm_year == 1999) dt.tm_year = 2099;
  215.             }while(1);
  216.             break;
  217.         case ADJ_MON:
  218.             do{
  219.                 DisplayNum(dt.tm_mon);
  220.                 key = GetKey();
  221.                 if (key & UP)
  222.                     dt.tm_mon++;
  223.                 else if (key & DOWN)
  224.                     dt.tm_mon--;
  225.                 else if (key & LEFT)
  226.                 {
  227.                     state = ADJ_YEAR;
  228.                     break;
  229.                 }
  230.                 else if (key & RIGHT)
  231.                 {
  232.                     state = ADJ_DAY;
  233.                     break;
  234.                 }
  235.                 if (dt.tm_mon == 13) dt.tm_mon = 1;
  236.                 if (dt.tm_mon == 0) dt.tm_mon = 12;
  237.             }while(1);
  238.             break;
  239.         case ADJ_DAY:
  240.             do{
  241.                 DisplayNum(dt.tm_mday);
  242.                 key = GetKey();
  243.                 if (key & UP)
  244.                     dt.tm_mday++;
  245.                 else if (key & DOWN)
  246.                     dt.tm_mday--;
  247.                 else if (key & LEFT)
  248.                 {
  249.                     state = ADJ_MON;
  250.                     break;
  251.                 }
  252.                 else if (key & RIGHT)
  253.                 {
  254.                     state = ADJ_HOUR;
  255.                     break;
  256.                 }
  257.                 //
  258.             }while(1);
  259.             break;
  260.         case ADJ_HOUR:
  261.             do{
  262.                 DisplayNum(dt.tm_hour);
  263.                 key = GetKey();
  264.                 if (key & UP)
  265.                     dt.tm_hour++;
  266.                 else if (key & DOWN)
  267.                     dt.tm_hour--;
  268.                 else if (key & LEFT)
  269.                 {
  270.                     state = ADJ_DAY;
  271.                     break;
  272.                 }
  273.                 else if (key & RIGHT)
  274.                 {
  275.                     state = ADJ_MIN;
  276.                     break;
  277.                 }
  278.                 if (dt.tm_hour == 24) dt.tm_hour = 0;
  279.                 if (dt.tm_hour == -1) dt.tm_hour = 23;
  280.             }while(1);
  281.             break;
  282.         case ADJ_MIN:
  283.             do{
  284.                 DisplayNum(dt.tm_min);
  285.                 key = GetKey();
  286.                 if (key & UP)
  287.                     dt.tm_min++;
  288.                 else if (key & DOWN)
  289.                     dt.tm_min--;
  290.                 else if (key & LEFT)
  291.                 {
  292.                     state = ADJ_HOUR; break;
  293.                 }
  294.                 else if (key & RIGHT)
  295.                 {
  296.                     state = ADJ_SEC;
  297.                     break;
  298.                 }
  299. ……………………

  300. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
449_clock.rar (18.63 KB, 下载次数: 26)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:374899 发表于 2018-7-19 16:18 | 只看该作者
请问您指导怎么用串口显示ADC的采样值吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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