|
//******************************************************************************
#include <msp430g2452.h>
#include"LCMXX.H"
#define CLR_R100 P2OUT &=~(BIT0) //R100
#define SET_R100 P2OUT |= (BIT0)
#define CLR_R100K P2OUT&=~(BIT1) //100K
#define SET_R100K P2OUT|= (BIT1)
#define CLR_RT10K P2OUT&=~(BIT2) //T10K
#define SET_RT10K P2OUT|= (BIT2)
#define CLR_fmq P1OUT &=~(BIT1)
#define SET_fmq P1OUT |= (BIT1)
unsigned char inou_t,count_s ,count_5s,time_1s,usim_js,usim_ip; //秒计时秒及1秒
unsigned char time_0_5s,implement,implement_5s; //0.5秒计时秒及程序执行标志,5秒标志
unsigned int Rt_Value,Temp_Value;
unsigned char MODE,AMPM,Temper; //工作模式
unsigned char date,hour,cent,second,time_key;
unsigned char play_data[4]; //数据显示用数组(S9-S18,5d-1d)
long IntDegC;
unsigned char const SEG7_1[]={
0xBE,/*0*/
0xA0,/*1*/
0x7C,/*2*/
0xF8,/*3*/
0xE2,/*4*/
0xDA,/*5*/
0xDE,/*6*/
0xB0,/*7*/
0xFE,/*8*/
0xFA,/*9*/
0x52,/*c*/
0x40,/*-*/
};
/**SEG_1为LCM045a的段码*/
unsigned int const Temp_Table1[]={3275,3430,3630,3825,4031,4245,4480,4726,4987,5265,5560,
5873,6206,6560,6938,7340,7768,8224,8711,9230,9783,10375,11006}; //-1~-22
unsigned int const Temp_Table[]={3177,3025,2882,2745,2616,2494,2377,2267,2162,2063,1968,
1878,1793,1712,1635,1562,1493,1426,1363,1304,1247,1192,1141,1091,1045,1000,958,917,878,
842,806,773,741,710,682,653,627,602,577,554,532,511,491,472,453,436,419,403,388,373,
359};// 0~50度
void Rc_Ad(void); //rc测温程序
void bit_bcd (unsigned char Data_h,unsigned char Data_c) ;//时间bcd转换
void T_bit_bcd (unsigned int ADC_data); //转换内温度BCD码
void delay ( unsigned char time ) //长延时函数
{ unsigned char m,tk;
do
{
for (m=20;m>0;m--)
{ for (tk=100;tk>0;tk--) ;}
}
while (--time);
}
//获取AD转换的值
long Get_ADCVal(void)
{
long tt=0;
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
_NOP();_NOP();_NOP();_NOP();
//while((ADC10CTL0 &ADC10IFG)==0); //等待ADC10IFG标志变高(转换完成) // Disable ADC conversion
// ADC10CTL0 &= ~(REFON + ADC10ON); // Ref and ADC10 off
while (ADC10CTL1 & ADC10BUSY != 0); //判断是否转换完毕
tt = ADC10MEM;
// Read conversion value
return tt;
}
//获得温度值
/*void ADC_T (void)
{ unsigned char i;
for(i=0;i<8;i++)
IntDegC += ((Get_ADCVal() - 673) * 4230) / 1024;
//oC = ((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
IntDegC >>=3;
}*/
void main(void)
{ //unsigned char i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL3=XCAP_1 ; //6pf
if (CALBC1_8MHZ != 0xFF)
{
delay(2);
DCOCTL = 0x00;
BCSCTL1 = CALBC1_8MHZ; /* Set DCO to 8MHz */
DCOCTL = CALDCO_8MHZ;
}
BCSCTL2 = SELM_0 + DIVM_1+DIVS_2 ;// MCLK==>4MHZ,SMCLK==>2MHZ
//=========================
//ADC10CTL1 = INCH_10 + ADC10DIV_4; // Temp Sensor ADC10CLK/4+CONSEQ_2
P1DIR |= 0x07; // P1.0 output
P1REN=0x30; //p1.5,p1.6上拉
P1OUT &= 0xf0;
P2DIR |= 0x7f;
P2OUT |= 0x7f;
delay ( 10 ) ;
LCMInit();
hour=6;
cent=58;
WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer
IE1 |= WDTIE; //看门狗中断使能
_EINT(); //使能中断
while(1)
{
if(MODE==0)
{ if(implement_5s)
{ if(time_1s)
{ if(usim_js>0) //整点报时
{
usim_js--;
SET_fmq;
}
Rc_Ad(); //rc充放电测电阻
WRLCD_4(0x15,0x00) ; //模式指示
WRLCD_4(0x1f,0x20) ; //模式指示
WRLCD_8(0x1d,play_data[0]);
WRLCD_8(0x1b,play_data[1]);
WRLCD_4(0x1a,0x00) ;
WRLCD_8(0x18,play_data[2]);
WRLCD_8(0x16,0x53);
time_1s=0;
implement_5s--;
}
}
else if(implement)
{ if(time_1s) //整点报时
{ time_1s=0;
if(usim_js>0)
{
usim_js--;
SET_fmq;
}
}
bit_bcd(hour,cent); //调时间表
WRLCD_4(0x15,0x00) ; //模式指示
WRLCD_4(0x1f,0x20) ; //模式指示
WRLCD_8(0x1d,play_data[0]);
WRLCD_8(0x1b,play_data[1]);
if(time_0_5s)
{WRLCD_4(0x1a,0xf0) ;}
else
{WRLCD_4(0x1a,0x00) ;}
WRLCD_8(0x18,play_data[2]);
WRLCD_8(0x16,play_data[3]);
implement=0;
}
}
else if(MODE==1) // 只显示温度
{ if(time_1s)
{ if(usim_js>0) //整点报时
{
usim_js--;
SET_fmq;
}
Rc_Ad(); //rc充放电测电阻
WRLCD_4(0x15,0x00) ; //模式指示
WRLCD_4(0x1f,0x40) ; //模式指示
WRLCD_8(0x1d,play_data[0]);
WRLCD_8(0x1b,play_data[1]);
WRLCD_4(0x1a,0x00) ;
WRLCD_8(0x18,play_data[2]);
WRLCD_8(0x16,0x53);
time_1s=0;
}
}
else if(MODE==2) // 只显示时钟
{ if(implement)
{bit_bcd(hour,cent); //调时间表
WRLCD_4(0x15,0x00) ; //模式指示
WRLCD_4(0x1f,0x80) ; //模式指示
WRLCD_8(0x1d,play_data[0]);
WRLCD_8(0x1b,play_data[1]);
if(time_0_5s)
{WRLCD_4(0x1a,0xf0) ;}
else
{WRLCD_4(0x1a,0x00) ;}
WRLCD_8(0x18,play_data[2]);
WRLCD_8(0x16,play_data[3]);
implement=0;
if(time_1s)
{ time_1s=0;
if(usim_js>0)
{
usim_js--;
SET_fmq;
}
}
}
}
else if(MODE==3) // 调整分钟
{ if(implement)
{ if((P1IN&0x20)==0)
{cent++;second=0;}
if(cent>=60) cent=0;
bit_bcd(hour,cent); //调时间表
WRLCD_4(0x15,0x80) ; //模式指示
WRLCD_4(0x1f,0x00) ; //模式指示
WRLCD_8(0x1d,play_data[0]);
WRLCD_8(0x1b,play_data[1]);
if(time_0_5s)
{WRLCD_4(0x1a,0xf0) ;
WRLCD_8(0x18,play_data[2]);
WRLCD_8(0x16,play_data[3]);
}
else
{WRLCD_4(0x1a,0x00);
WRLCD_8(0x18,0x00);
WRLCD_8(0x16,0x00);
}
implement=0;
}
}
else if(MODE==4) // 调整小时
{ if(implement)
{ if((P1IN&0x20)==0)
{hour++;}
if(hour>=24) hour=0;
bit_bcd(hour,cent); //调时间表
WRLCD_4(0x15,0x20) ; //模式指示
WRLCD_4(0x1f,0x00) ; //模式指示
if(time_0_5s)
{ WRLCD_4(0x1a,0xf0) ;
WRLCD_8(0x1d,play_data[0]);
WRLCD_8(0x1b,play_data[1]);
}
else
{ WRLCD_4(0x1a,0x00) ;
WRLCD_8(0x1d,0x00);
WRLCD_8(0x1b,0x00);
}
WRLCD_8(0x18,play_data[2]);
WRLCD_8(0x16,play_data[3]);
implement=0;
}
}
LPM2; //进入低功
}
}
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P1OUT ^= BIT0; //取反,观测用
count_s++;
count_5s++;
if((P1IN&0x10)==0) //调工作模式
{ if(MODE==4) {MODE=0;}
else MODE++;
if(MODE==0)
{
WRLCD_4(0x15,0x00) ; //模式交替
WRLCD_4(0x1f,0x20) ; //模式指示
}
else if(MODE==1)
{
WRLCD_4(0x15,0x00) ; //模式指示
WRLCD_4(0x1f,0x40) ; //模式温度
}
else if(MODE==2)
{
WRLCD_4(0x15,0x00) ; //模式指示
WRLCD_4(0x1f,0x80) ; //模式时间
}
else if(MODE==3)
{
WRLCD_4(0x15,0x80) ; //模式指示
WRLCD_4(0x1f,0x00) ; //模式调分钟
}
else if(MODE==4)
{
WRLCD_4(0x15,0x20) ; //模式指示
WRLCD_4(0x1f,0x00) ; //模式调小时间
}
}
/*if(MODE==3) //模式调分钟
{if((P1IN&0x20)==0)
cent++;
if(cent>=60) cent=0;
}
if(MODE==4) //模式调小时间
{ if((P1IN&0x20)==0)
hour++;
if(hour>=24) hour=0;
}*/
if (count_5s>19)
{
implement_5s=5;
}
if(count_5s>39)
{
count_5s=0;
implement_5s=0;
}
if(count_s==2 )
{
time_0_5s=1; //每1秒闪烁标志
time_1s=0;
implement=1; //0.5秒时间到标志执行程序用
LPM2_EXIT;
}
if(count_s>3 )
{ count_s = 0;
time_1s=1;
time_0_5s=0;
implement=1; //0.5秒时间到标志执行程序用
second++;
if(second<60); // 时钟计时开始
else{
second=0;
cent++;
if(cent<60);
else
{
cent=0;
hour++;
if((hour>2)&&(hour<23))
{ // usim_ip=1;
usim_js=hour;
if(hour>12){usim_js=usim_js-12;}
}
if(hour<24);
else
hour=0;
}
// if((P1IN&0x10)==0) //调工作模式
// MODE++;
// if(MODE==5) MODE=0;
}
LPM2_EXIT;
}
CLR_fmq; //
}
/****温度电阻测量*************/
void Rc_Ad(void)
{
float T1 = 0,T2 = 0,T_Sum = 0;
unsigned char i,flag; //温度标志位;
unsigned int Rt_Value,Temp_Value;
TACTL = TASSEL_2 + MC_0+TACLR; //SCLK +停止计数
for(i=0;i<5;i++)
{
P2DIR &= 0xf8;
_NOP();_NOP();
P2DIR |= 0x01;
CLR_R100; //放电
delay(2);
P2DIR &= 0xfe; //设置P2.0 高阻 设置p2.1为输出设置P2.2为高阻
P2DIR |= 0x02;
TACTL = TASSEL_2 + MC_2+TACLR;//清零并开始计数
SET_R100K ; //通过100K电阻对电容充电
while(!(P2IN&0x01)); //等待高电平
TACTL = TASSEL_2 + MC_0; //停止计数//关闭计数器
T1 = TAR; //得到100K放电时间T1
P2DIR &= 0xf8;
_NOP();_NOP();
P2DIR |= 0x01;
CLR_R100; //放电
delay(2);
P2DIR &= 0xfe; //设置P2.0 高阻 设置P2.1为高阻设置p2.2为输出
P2DIR |= 0x04;
TACTL = TASSEL_2 + MC_2+TACLR; //清零并开始计数
SET_RT10K ; //通过热敏电阻充电;
while(!(P2IN&0x01)); //等待低电平
TACTL = TASSEL_2 + MC_0; //停止计数//关闭计数器
T2 = TAR; //得到热电阻放电时间T2
T_Sum += T2/T1;
}
T_Sum =(T_Sum/5)*100; //;
Rt_Value=(unsigned int)(T_Sum*100);
if(Rt_Value>3177) //温度0度以下
{ flag=1; //温度0度以下
for(i=1;i<22;i++)
{
Temp_Value=Temp_Table1[i];
if(Rt_Value<=Temp_Value) break;
}
if(Rt_Value!=Temp_Value) i--;
Temp_Value=i; //保存温度值
}
else if(Rt_Value>359)//温度50度以下
{ flag=0 ; //温度0度以上
for(i=0;i<50;i++)
{
Temp_Value=Temp_Table[i];
if(Rt_Value>=Temp_Value) break;
}
if(Rt_Value!=Temp_Value) i--;
Temp_Value=i; //保存温度值
}
if(flag)
play_data[0]=0x40;
else
play_data[0]=0x00;
play_data[1]=SEG7_1[Temp_Value/10];
play_data[2]=SEG7_1[Temp_Value%10];
}
void bit_bcd (unsigned char Data_h,unsigned char Data_c) //转换时间_BCD码
{
play_data[0]= SEG7_1[Data_h/10%10];
play_data[1]= SEG7_1[Data_h%10];
play_data[2]= SEG7_1[Data_c/10%10];
play_data[3]= SEG7_1[Data_c%10];
}
void T_bit_bcd (unsigned int ADC_data) //转换内温度码
{
play_data[0]= SEG7_1[ADC_data/100];
play_data[1]= SEG7_1[ADC_data/10%10];
play_data[2]= SEG7_1[ADC_data%10];
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|