标题:
基于SHT10+MSP430F449设计的电子钟和湿温度计
[打印本页]
作者:
ZLS123666
时间:
2018-7-18 16:52
标题:
基于SHT10+MSP430F449设计的电子钟和湿温度计
这是我基于MSP430F449设计的电子钟和湿温度计
0.png
(41.47 KB, 下载次数: 66)
下载附件
2018-7-19 00:33 上传
单片机源程序如下:
#include <time.h>
#include "io430.h"
#include "display.h"
#include "rtc.h"
#include "sht10.h"
#include "key.h"
void KeyProcess(void);
void AdjustDateTime(void);
enum __dis_state{DATETIME, TEMPERATURE, HUMIDITY, VOLTAGE};
enum __bl_state{OFF, ON};
enum __adj_state{ADJ_YEAR, ADJ_MON, ADJ_DAY, ADJ_HOUR, ADJ_MIN, ADJ_SEC};
struct tm datetime;
float temp, humi;
int display_state = DATETIME;
void ReverseBacklight(void)
{
static int backlight_state = OFF;
//P3.7, output HIGH --> ON, LOW --> OFF
P3SEL &= ~BIT7;
P3DIR |= BIT7;
if (backlight_state == OFF)
{
backlight_state = ON;
P3OUT &= ~BIT7;
}
else
{
backlight_state = OFF;
P3OUT |= BIT7;
}
}
void InitClock(void)
{
FLL_CTL0 &= 0x0F;
FLL_CTL1 = XT2OFF;
SCFI0 = FN_2;
SCFQCTL = 121; //DOC ~ 4M
}
void lpm_delay(unsigned char second)
{
int i;
for(i=0; i<second; i++)
{
if (KeyIsPress())
return;
WDTCTL = WDT_ADLY_1000;
LPM3;
}
WDTCTL = WDTPW + WDTHOLD;
}
int GetVoltage(void)
{
int volt;
int i, sample=0;
//Enable Internal Voltage Reference
ADC12CTL0 = SHT1_8 + REF2_5V + REFON + ADC12ON;
ADC12CTL1 = SHP;
ADC12MCTL0 = 0x1B;
ADC12CTL0 |= ENC;
__delay_cycles(100); //wait for Vref stable;
for(i=0; i<8; i++)
{
ADC12CTL0 |= ADC12SC;
while(!(ADC12IFG & BIT0));
sample += ADC12MEM0;
}
ADC12CTL0 = 0;
sample >>= 3;
volt = (int)(sample * 1.221); //*1.221
return volt;
}
void InitUnusedPin(void)
{
//P6.0 ~ P6.7
//P1.0 ~ P1.6
//P2.4 ~ P2.5
//P3.2 ~ P3.6
//P4.0 ~ P4.7 except P4.3
P6DIR |= 0xFF;
P1DIR |= 0x7F;
P2DIR |= BIT4+BIT5;
P3DIR |= BIT2+BIT3+BIT4+BIT5+BIT6;
P4DIR |= 0xF7;
P6OUT &= 0;
P1OUT &= 0x80;
P2OUT &= ~(BIT4+BIT5);
P3OUT &= 0x83;
P4OUT &= 0x08;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitUnusedPin();
IE1 |= WDTIE;
InitClock();
InitRTC();
InitKey();
//LCD Init
LCDCTL = LCDON + LCD4MUX + LCDSG0_5; // LCD on, 4-Mux, segments S0-S27
BTCTL = BT_fLCD_DIV128; // LCD clock freq is ACLK/256
P5SEL |= 0xFF;
ResetMem();
__enable_interrupt();
while(1)
{
switch (display_state)
{
case DATETIME:
RTCGetDateTime(&datetime);
DisplayDate(datetime.tm_year, datetime.tm_mon, datetime.tm_mday);
DisplayTime(datetime.tm_hour, datetime.tm_min, datetime.tm_sec);
lpm_delay(1);
break;
case TEMPERATURE:
if (GetTemperature(&temp))
{
DisplayTemperature(temp);
lpm_delay(3);
}
break;
case HUMIDITY:
if (GetTempAndHumi(&temp, &humi))
{
DisplayHumidity(humi);
lpm_delay(3);
}
break;
case VOLTAGE:
DisplayVoltage(GetVoltage());
lpm_delay(2);
break;
default:
display_state = DATETIME;
break;
}
KeyProcess();
}
}
//
void KeyProcess(void)
{
unsigned char key;
long i;
key = GetKey();
switch(display_state)
{
case DATETIME:
if (key & UP) display_state = VOLTAGE;
else if (key & DOWN) display_state = TEMPERATURE;
else if (key & OK) {
for(i=0; i<500000; i++) if (P2IN & BIT3) break; //release.
if (i == 500000)
{ //Long Press
AdjustDateTime();
}
else
{
ReverseBacklight();
}
}
break;
case TEMPERATURE:
if (key & UP) display_state = DATETIME;
else if (key & DOWN) display_state = HUMIDITY;
else if (key & OK) { //SWITCH BACKLIGHT
ReverseBacklight();
}
break;
case HUMIDITY:
if (key & UP) display_state = TEMPERATURE;
else if (key & DOWN) display_state = VOLTAGE;
else if (key & OK) { //switch backlight
ReverseBacklight();
}
break;
case VOLTAGE:
if (key & UP) display_state = HUMIDITY;
else if (key & DOWN) display_state = DATETIME;
else if (key & OK) ReverseBacklight();
break;
default: display_state = DATETIME; break;
}
}
void AdjustDateTime(void)
{
int state = ADJ_YEAR, exit_code = 1;
unsigned char key;
struct tm dt;
RTCGetDateTime(&dt);
dt.tm_year += 2000;
while(exit_code)
{
switch (state)
{
case ADJ_YEAR:
do{
DisplayNum(dt.tm_year);
key = GetKey();
if (key & UP)
dt.tm_year ++;
else if (key&DOWN)
dt.tm_year --;
else if (key & RIGHT)
{
state = ADJ_MON;
break;
}
if (dt.tm_year == 2100) dt.tm_year = 2000;
if (dt.tm_year == 1999) dt.tm_year = 2099;
}while(1);
break;
case ADJ_MON:
do{
DisplayNum(dt.tm_mon);
key = GetKey();
if (key & UP)
dt.tm_mon++;
else if (key & DOWN)
dt.tm_mon--;
else if (key & LEFT)
{
state = ADJ_YEAR;
break;
}
else if (key & RIGHT)
{
state = ADJ_DAY;
break;
}
if (dt.tm_mon == 13) dt.tm_mon = 1;
if (dt.tm_mon == 0) dt.tm_mon = 12;
}while(1);
break;
case ADJ_DAY:
do{
DisplayNum(dt.tm_mday);
key = GetKey();
if (key & UP)
dt.tm_mday++;
else if (key & DOWN)
dt.tm_mday--;
else if (key & LEFT)
{
state = ADJ_MON;
break;
}
else if (key & RIGHT)
{
state = ADJ_HOUR;
break;
}
//
}while(1);
break;
case ADJ_HOUR:
do{
DisplayNum(dt.tm_hour);
key = GetKey();
if (key & UP)
dt.tm_hour++;
else if (key & DOWN)
dt.tm_hour--;
else if (key & LEFT)
{
state = ADJ_DAY;
break;
}
else if (key & RIGHT)
{
state = ADJ_MIN;
break;
}
if (dt.tm_hour == 24) dt.tm_hour = 0;
if (dt.tm_hour == -1) dt.tm_hour = 23;
}while(1);
break;
case ADJ_MIN:
do{
DisplayNum(dt.tm_min);
key = GetKey();
if (key & UP)
dt.tm_min++;
else if (key & DOWN)
dt.tm_min--;
else if (key & LEFT)
{
state = ADJ_HOUR; break;
}
else if (key & RIGHT)
{
state = ADJ_SEC;
break;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
449_clock.rar
(18.63 KB, 下载次数: 27)
2018-7-18 16:51 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
huan1
时间:
2018-7-19 16:18
请问您指导怎么用串口显示ADC的采样值吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1