⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实验程序.txt

📁 io430x22x4控制超低功耗温度计
💻 TXT
字号:
#include "io430x22x4.h"
#include "in430.h"

#define uchar unsigned char  
#define uint  unsigned int

/********************** LCD ********************************/
#define BIAS 0x24  
#define SYSEN 0x01 
#define LCDOFF 0x02 
#define LCDON 0x03  
uchar clear_1621[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//清屏数组

/********************** 1621 ********************************/
/********************** 使用P1口 ********************************/
#define cs_out P1OUT_bit.P1OUT_0  //31 p1_0
#define wr_out P1OUT_bit.P1OUT_1  //32 p1_1
#define dat_out P1OUT_bit.P1OUT_2 //33 p1_2

/********************** 18b20 ********************************/
/********************** 使用P2.0口 ********************************/
/**********************  蜂鸣器接到p1.7  *******************/
#define DQ1 P2OUT |= BIT0 //18b20的DQ位接到了p2_0 8脚
#define DQ0 P2OUT &= ~BIT0
uchar Temp_Flag=0;
int b=0;//在中断中为蜂鸣器计数

//*************************************************************************
uchar Time_Flag=1,Second_Flag=0;
int Time[5]={9,21,14,20,15};
int a;//在中断中为秒计数,每进一次中断,a+1

/******************************   key      *********************************/
/******************************   key_1   p4.0   17 *********************************/
/******************************   key_2   p4.1   18 *********************************/
/******************************   key_3   p4.2   19 *********************************/
/******************************   key_4   p4.3   20 *********************************/
/********************** 使用P4口 ********************************/
#define key_DIR P4DIR
#define key_IN  P4IN

/**********************************************************************************/
int DelaySleepFlag=0;//延时计数

/**********************************************************************************/
uchar mode=0;

/**********************************************************************************/
/*****************************  延时程序   *****************************************/
/**********************************************************************************/
//延时的时间为 us*5+6个指令周期,1MHz时为1us
void TempDelay(uint us)
{
  while(us--);
}
/**********************************************************************************/
/*****************************  1621  *********************************************/
/**********************************************************************************/
void SendBit_1621(uchar date,uchar cnt)//data的高cnt位写入HT1621,高位在前 
{
  uchar i; 
  for(i=0;i<cnt;i++) 
    { 
		  if((date&0x80)==0) dat_out=0; 
		  else dat_out=1; 
		  wr_out=0; 
		  TempDelay(8);
                  wr_out=1; 
		  date<<=1; 
    } 
}  

void SendDataBit_1621(uchar date,uchar cnt)//data的低cnt位写入HT1621,低位在前 
{ 
	  uchar i; 
	  for(i=0;i<cnt;i++) 
		 { 
			  if((date&0x01)==0) dat_out=0; 
			  else dat_out=1; 
			  wr_out=0; 
			  TempDelay(8);
                          wr_out=1;
			  date>>=1;
		 } 
} 

void SendCmd_1621(uchar command) 
{ 
	 cs_out=0; 
	 SendBit_1621(0x80,3);  //写入标志码"100" 
	 SendBit_1621(command,9);  //写入 9 位数据,其中前 8 位为 command 命令,最后 1 位任意 
	 cs_out=1; 
} 

void Write_1621(uchar addr,uchar date) 
{ 
	 cs_out=0; 
	 SendBit_1621(0xa0,3);  //写入标志码"101" 
	 SendBit_1621(addr<<2,6); //写入 6 位 addr 
	 SendDataBit_1621(date,4); //写入 date 的低 4 位 
	 cs_out=1; 
}

void WriteAll_1621(uchar addr,uchar *p,uchar cnt) 
{ 
	 uchar i; 
	 cs_out=0; 
	 SendBit_1621(0xa0,3);  //写入标志码"101" 
	 SendBit_1621(addr<<2,6); //写入 6 位 addr 
	 for(i=0;i<cnt;i++,p++)  //连续写入数据 
	   { 
	       SendDataBit_1621(*p,8); 
	   } 
	 cs_out=1; 
}

void Initial_1621()
{
  cs_out=0;
  wr_out=1;
  dat_out=1;
  TempDelay(2000);
  SendCmd_1621(BIAS);   //设置偏压和占空比 
  SendCmd_1621(SYSEN);  //打开系统振荡器 
  SendCmd_1621(LCDON);  //打开 LCD偏压发生器 
  WriteAll_1621(0x01,clear_1621,12); 
}

void All_on_1621()
{
    uchar i,addr=0x01;
    for(i=0;i<12;i++)
    {
      Write_1621(addr,0xff);
      addr+=2;
    }
}

void All_off_1621()
{
    uchar addr=0x01,i;
    for(i=0;i<12;i++)
    {
      Write_1621(addr,0x00);
      addr+=2;
    }
}

void write_digital_1621(uchar addr1, uchar addr2, uchar addr3, uint a)
{
  switch(a)
  {
  case 0:   {Write_1621(addr1,0x03);  Write_1621(addr2,0x05); Write_1621(addr3,0x03); break;}
  case 1:   {Write_1621(addr1,0x00);  Write_1621(addr2,0x00); Write_1621(addr3,0x03); break;}
  case 2:   {Write_1621(addr1,0x02);  Write_1621(addr2,0x07); Write_1621(addr3,0x01); break;}
  case 3:   {Write_1621(addr1,0x00);  Write_1621(addr2,0x07); Write_1621(addr3,0x03); break;}
  case 4:   {Write_1621(addr1,0x01);  Write_1621(addr2,0x02); Write_1621(addr3,0x03); break;}
  case 5:   {Write_1621(addr1,0x01);  Write_1621(addr2,0x07); Write_1621(addr3,0x02); break;}
  case 6:   {Write_1621(addr1,0x03);  Write_1621(addr2,0x07); Write_1621(addr3,0x02); break;}
  case 7:   {Write_1621(addr1,0x00);  Write_1621(addr2,0x01); Write_1621(addr3,0x03); break;}
  case 8:   {Write_1621(addr1,0x03);  Write_1621(addr2,0x07); Write_1621(addr3,0x03); break;}
  case 9:   {Write_1621(addr1,0x01);  Write_1621(addr2,0x07); Write_1621(addr3,0x03); break;}
  default: break;
  }
}
/**********************************************************************************/
void Clr_Lcd()
{
  WriteAll_1621(0x01,clear_1621,12);
}
void Clr_Front_Lcd()
{
  WriteAll_1621(0x0d,clear_1621,6);
}
void Clr_Behind_Lcd()
{
  WriteAll_1621(0x01,clear_1621,6);
}
/**********************************************************************************/
/*****************************  18b20  *********************************************/
/**********************************************************************************/

//对18b20进行初始化复位,对18b20进行操作之前必须进行
void Initial_18b20 (void)
{
  P2DIR |=BIT0;
  DQ0;
  TempDelay(80); //delay 530 uS//847
  DQ1;
  TempDelay(30);    //delay 100 uS//14
}

//向18B20写入一个字节
void Write_18b20 (uchar wr)  //单字节写入
{
  uchar i;
  P2DIR |=BIT0;
  for (i=0;i<8;i++)
  {
    DQ0;
    if(wr&0x01) DQ1;
    TempDelay(9);   //delay 50 uS以上 //85
    DQ1;
    wr >>= 1;
  }
}

//从18b20读一个字节
uint Read_18b20 (void)     //读取单字节
{
  uchar i;
  uint u=0;
  P2DIR |=BIT0;
  for(i=0;i<16;i++)
  {
    u >>= 1;
    DQ0;
    DQ1;
    P2DIR &=~BIT0;
    if(P2IN_bit.P2IN_0)
    {
      u = u|0x8000;
    }
    _NOP();
    P2DIR |=BIT0;
    DQ1;
  }
  return u;
}
//读取温度并显示
float ReadTemp(void)
{
  float Temper=0.0;
  uint Temperature;
  Temperature = Read_18b20();
  Temper = Temperature*0.0625;
  return Temper;
}

//显示温度
void Display_Temp()
{
  float Temperature_final;
  uint Temperature_x,Temperature_xx,Temperature_xxx;//温度的个位、十位与百位
  Initial_18b20();
  Write_18b20(0xcc);
  Write_18b20(0x44);
  _NOP();
  Initial_18b20();
  Write_18b20(0xcc);
  Write_18b20(0xbe);
  Temperature_final=ReadTemp();
  if(Temperature_final>=30)  P1OUT_bit.P1OUT_7=1;
  else P1OUT_bit.P1OUT_7=0;
  Temperature_x = ((int)(Temperature_final*10))%10;
  Temperature_xx = ((int)Temperature_final)%10;
  Temperature_xxx = ((int)(Temperature_final/10))%10;
  WriteAll_1621(0x01,clear_1621,12);
  write_digital_1621(0x13,0x15,0x17,Temperature_x);//显示温度的小数位
  write_digital_1621(0x0d,0x0f,0x11,Temperature_xx);//显示温度的个位
  write_digital_1621(0x07,0x09,0x0b,Temperature_xxx);//显示温度的十位
  Write_1621(0x13,0x04);//显示小数点
}

//********************************************************************************
//显示时间
//********************************************************************************
void Display_Front(uint i)
{
  write_digital_1621(0x01,0x03,0x05,(i/10)%10);
  write_digital_1621(0x07,0x09,0x0b,i%10);
}
void Display_Behind(uint i)
{
  write_digital_1621(0x0d,0x0f,0x11,(i/10)%10);
  write_digital_1621(0x13,0x15,0x17,i%10);
}

//***********************************************
void Display_Month()  //月
{
  Display_Front(Time[0]);
}
void Display_Day()  //日
{
  Display_Behind(Time[1]);
}
//***********************************************
void Display_Hour() //时
{
  Display_Front(Time[2]);
}
void Display_Min()  //分
{
  Display_Behind(Time[3]);
}
//***********************************************
void Display_Second() //秒
{
  Display_Front(Time[4]);
}
//***********************************************
void Display_Time()
{
  switch(Time_Flag)
  {
  case 1: {Clr_Lcd(); Display_Month();  Display_Day(); break;}
  case 2: {Clr_Lcd(); Display_Hour(); Display_Min(); break;}
  case 3: {Clr_Lcd(); Display_Second(); break;}
  default:{Time_Flag=0; break;}
  }
}
/**********************************************************************************/
/*****************************  Initial 430   *************************************/
/**********************************************************************************/
void Initial_430()
{
  WDTCTL=WDTPW+WDTHOLD;                 //关看门狗
  BCSCTL1 = CALBC1_1MHZ;                 //设定DCO为8MHZ
  DCOCTL = CALDCO_1MHZ;
  TACTL=TASSEL+TACLR;
  CCTL0|=CCIE;
  CCR0=50000;
  TACTL|=TAMC;
  _BIS_SR(GIE);
  P1DIR |=BIT0+BIT1+BIT2+BIT3+BIT7;                         //P1.0 P1.1 P1.2为输出方式
  P1OUT |=BIT0+BIT1+BIT2+BIT3;
  P2DIR |=BIT0+BIT1;
  P2OUT |=BIT0+BIT1;
  P3DIR |=BIT0+BIT1+BIT2;
}

#pragma vector = TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{
  a++;
  DelaySleepFlag++;
  if(a==17)
  {
    a=0;
    if(Second_Flag==1)  Time[4]=Time[4];
    else Time[4]++;
    if(Time[4]==60) 
    {
      Time[4]=0;
      Time[3]++;
      if(Time[3]==60)
      {
        Time[2]++;
        Time[3]=0;
        if(Time[2]==24)
        {
          Time[2]=0;
        }
        
      }
    }
  }
  if(DelaySleepFlag==540)
  {
    mode=3;
    DelaySleepFlag=0;
  }
}


void main()
{ 
  int key;//i为个位,j为十位
  uchar flag=0,tag=0;
  Initial_430();
  Initial_1621();
  key_DIR &=~(BIT0+BIT1+BIT2+BIT3);
  while(1)
  {
   while((P4IN&0x0f)==0x0f)
      {
        if(mode==1) Display_Time();
        if(mode==2) Display_Temp();        
        if(mode==3) Clr_Lcd();
      }
      TempDelay(4000);  //延时20ms
      while((P4IN&0x0f)!=0x0f)
      {
        key=P4IN;
        if((key&0x01)==0) //******************************  0键按下
        { 
          if((key&0x02)==0) //0键按下同时1键按下
          {       
            mode=1; //模式1,显示时钟
            Second_Flag=0;
            while(!(P4IN&0x02));
            Time_Flag++;
            if(Time_Flag==4)  Time_Flag=1;
            Display_Time(); //flag=3时正常显示
           }
          else if((key&0x04)==0)  //0键按下同时2键按下
          {
            mode=2;//模式2,显示温度
            while(!(P4IN&0x04));
            Display_Temp();//显示温度
          }
        }
        else if(((key&0x02)==0)&&(mode==1))  //******************************  1键按下
        {
          while(!(P4IN&0x02)); //等待1起来
          tag++;
          if(tag==20) tag=0;
          flag=tag%2;   //判断flag,如果flag是0则只显示前两位,flag是1则只显示后两位
          if(flag==0)
          {
            Clr_Lcd();
            if(Time_Flag==1)  Display_Month();
            else if(Time_Flag==2) Display_Hour();
            else if(Time_Flag==3) {Display_Second();  Second_Flag=1;}
          }
          else if(flag==1)
          {
            Clr_Lcd();
            if(Time_Flag==1)  Display_Day();
            else if(Time_Flag==2) Display_Min();
          }
        }
        else if(((key&0x04)==0)&&(mode==1)) //******************************  2键按下
        {
          while(!(P4IN&0x04));
          if(flag==0)
          {
            if(Time_Flag==1)  {Time[0]++;  if(Time[0]==13)  {Time[0]=1;}  Display_Month();}
            else if(Time_Flag==2) {Time[2]++;   if(Time[2]==25) {Time[2]=1;}  Display_Hour();}
            else if(Time_Flag==3) {Time[4]++;   if(Time[4]==60) {Time[4]=0;}  Display_Second();}
          }
          else if(flag==1)
          {
            if(Time_Flag==1)  {Time[1]++; if(Time[1]==31) {Time[1]=1;}  Display_Day();}
            else if(Time_Flag==2) {Time[3]++; if(Time[3]==61) {Time[3]=1;}  Display_Min();}
            else if(Time_Flag==3) {Time[4]++;   if(Time[4]==60) {Time[4]=0;}  Display_Second();}
          }
        }
        else if(((key&0x08)==0)&&(mode==1)) //******************************  3键按下
        {
          while(!(P4IN&0x08));
          if(flag==0)
          {
            if(Time_Flag==1)  {Time[0]--;  if(Time[0]==-1)  {Time[0]=12;}  Display_Month();}
            else if(Time_Flag==2) {Time[2]--;   if(Time[2]==0) {Time[2]=24;}  Display_Hour();}
            else if(Time_Flag==3) {Time[4]--;   if(Time[4]==0) {Time[4]=59;}  Display_Second();}
          }
          else if(flag==1)
          {
            if(Time_Flag==1)  {Time[1]--; if(Time[1]==0) {Time[1]=30;}  Display_Day();}
            else if(Time_Flag==2) {Time[3]--; if(Time[3]==-1) {Time[3]=59;}  Display_Min();}
            else if(Time_Flag==3) {Time[4]--; if(Time[4]==-1) {Time[4]=59;}  Display_Second();}
          }
        }
     }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -