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

📄 main.c

📁 MSP430子程序集
💻 C
字号:
//功能:读起温度,并显示在数码管上
#include "msp430x14x.h"
#define   SHUMA_PORT_DIR  P5DIR//数码管数据口
#define   SHUMA_PORT_OUT  P5OUT
#define   SHUMA_1_LOW     P6OUT&=~BIT6//开数码管的第一位P6.6口控制数码管的第一位
#define   SHUMA_1_HIGH    P6OUT|=BIT6//灭第一位数码管
#define   SHUMA_2_LOW     P6OUT&=~BIT5//开数码管的第二位
#define   SHUMA_2_HIGH    P6OUT|=BIT5//灭数码管的第二位
#define   SHUMA_3_LOW     P6OUT&=~BIT4//开数码管的第三位
#define   SHUMA_3_HIGH    P6OUT|=BIT4//灭数码管的第三位
#define   SHUMA_4_LOW     P6OUT&=~BIT0//开数码管的第四位
#define   SHUMA_4_HIGH    P6OUT|=BIT0//灭数码管的第四位

//DS18B2O控制引脚定义
#define   DQ_OUT  P2DIR|=BIT7
#define   DQ_IN   P2DIR&=~BIT7
#define   DQ_H    P2OUT|=BIT7
#define   DQ_L    P2OUT&=~BIT7
#define   DQ_DATE (P2IN & BIT7)



void int_clk();//时钟初始化子程序声明
void delay_352us(unsigned int i);//352us延时程序声明
void int_shuma_io();//数码管数据口初始化
void delay_us(unsigned int i);//delay 2.5us at 8M
unsigned char rest_ds18b20(void);//DS18B20复位程序
void ReadTemp1820(void);//读取温度 
void WriteOneChar(unsigned char value);//写一个字节 
unsigned char ReadOneChar(void);


const unsigned char tabl1[11]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0X20,0x38,0xff};
                // ;0  ,1   ,2   ,3  , 4,   5,   6    ,7   ,8  ,9 ,灭}数码管段码表
const unsigned char tabl2[10]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x18};
                //数码管段码表2,带小数点的
static unsigned char templ,temph;

//****************************************************
//读取温度 
void ReadTemp1820(void) 
{ 
   unsigned char c=0; 
   c=rest_ds18b20();
   if(c==0)
   {
     WriteOneChar(0xcc); //跳过读序列号的操作 
     WriteOneChar(0x44); //启动温度转换
     delay_us(10);
     c=rest_ds18b20();
     WriteOneChar(0xcc); //跳过读序列号的操作 
     WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 
     templ=ReadOneChar();
     temph=ReadOneChar();
   }  
}
//读一个字节 
unsigned char ReadOneChar(void) 
{
  unsigned char i=0; 
  unsigned char value = 0; 
  for (i=0;i<8;i++) 
  {
  value>>=1;
  DQ_OUT;
  DQ_L;
  DQ_IN; //DQ = 1
  if(DQ_DATE) value|=0x80; 
  delay_us(16); //延时40us
}
return value;
}

//写一个字节 
void WriteOneChar(unsigned char value) 
{ 
   unsigned char i=0; 
   for(i=0;i<8;i++)
   {
    DQ_OUT;
    DQ_L;
    if (value&0x01) DQ_IN; //DQ = 1
    delay_us(30); //延时50us 以上
    DQ_IN; //DQ = 1
    value>>=1;
   }
 
}

//;**************************************************
//ds18b20复位子程序
unsigned char rest_ds18b20(void) 
{ 
  unsigned char ds18b20_rest_flag; 
  delay_us(4); //稍做延时
  DQ_OUT;
  DQ_L; 
  delay_us(200); //480us<T<960us
  DQ_IN; //拉高总线
  delay_us(36); //延时90us
  ds18b20_rest_flag=DQ_DATE;
  delay_us(40); //延时100us
  return ds18b20_rest_flag; //如果stDQ=0则初始化成功 stDQ=1则初始化失败 
}
        
//***************************************************
//2.5us延时程序        
void delay_us(unsigned int i)//delay 2.5us at 8M
{  
   unsigned int ii;
   for(ii =i;ii > 0;ii--)
   { 
      _NOP();_NOP();_NOP();_NOP();   
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();   
   }    
}
//******************************************
//子程序名:int_clk()
//功能:   时钟初始化子程序
void int_clk()
{
  unsigned char i;//定义局部变量i
  BCSCTL1&=~XT2OFF;//打开高频晶体震荡器
  BCSCTL2|=SELM1+SELS;//MCLK和SMCLK的时钟源都选择XT2CLK,即都是8MHZ
  do//(至少执行一次DO循环)
  {
    IFG1&=~OFIFG;//清除晶体震荡出错标志位
    for(i=0;i<100;i++)
      _NOP();//简单的延时等待
  }while((IFG1&OFIFG));//判断晶体震荡是否出错,如果还是出错,则继续执行DO循环
  IFG1&=~OFIFG;
}
//IO口初始化子程序
void int_shuma_io()
{
  SHUMA_PORT_DIR|=0XFF;//set P5 is out  设置控制数码管数据口的IO口为输出模式
  P6DIR|=BIT0+BIT4+BIT5+BIT6;
  P3DIR|=BIT0;//P3.0控制74HC573的OE,把这个口设置为输出
  P3OUT&=~BIT0;//使能74573,使得74573的输出随输入变化
} 
//******************************************************
//352微秒延时程序
void delay_352us(unsigned int i)//352us延时程序,延时时间的计算在前面已经讲过
{ 
  unsigned char j;
  
  while(i--)
  {
   for(j=0;j<255;j++)
   {  
    _NOP();
    _NOP();
    _NOP();
    _NOP();   
    }
  } 
}  
//*************************************
int main( void )
{ 
  unsigned long temp32; 



  unsigned char DISPLAY1=1,DISPLAY2=2,DISPLAY3=3,DISPLAY4=4;
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  int_clk();//初始化时钟
  int_shuma_io();//初始化数码管控制口
  while(1)
  {
   ReadTemp1820();
   temp32=temph*256+templ;//执行这句程序后,temp32/16就是温度
   DISPLAY1=temp32/16/100%10;//计算温度的百位数据
   DISPLAY2=temp32/16/10%10;//计算温度的十位数据
   DISPLAY3=temp32/16%10;//计算温度的个位数据
   DISPLAY4=(temp32*10)/16%10;//计算温度小数点的后一位
   SHUMA_PORT_OUT=tabl1[DISPLAY1];//求取BCD码对应的数码管段码,并送到控制数码管的数据扣
   SHUMA_1_LOW;//开第一位数码管
   delay_352us(10);//简单延时
   SHUMA_1_HIGH;//灭第一位数码管
   SHUMA_PORT_OUT=tabl1[DISPLAY2];//送数码管第二位显示的段码
   SHUMA_2_LOW;//开显示第二位数码管
   delay_352us(10);//延时
   SHUMA_2_HIGH;//灭第二位数码管,接下去重复1二
   SHUMA_PORT_OUT=tabl2[DISPLAY3];
   SHUMA_3_LOW;
   delay_352us(10);
   SHUMA_3_HIGH;
   SHUMA_PORT_OUT=tabl1[DISPLAY4];
   SHUMA_4_LOW;
   delay_352us(10);
   SHUMA_4_HIGH;
  }  
}

⌨️ 快捷键说明

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