msp430f149单片机
读取ds18b20温度,显示到数码管,串口发送温度到电脑
cpp展开代码/*************************************************
*  程序功能:用DS18B20测量室温并在数码管上显示。
*  -------------------------------------------------
*  测试说明:观察显示温度数值。
*************************************************/
#include <msp430x14x.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* 延时函数,IAR自带,经常使用到 */
#define CPU_F ( (double) 8000000)   /* 外部高频晶振8MHZ */
/* #define CPU_F ((double)32768)   //外部低频晶振32.768KHZ */
#define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
/* 自定义数据结构,方便使用 */
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/****************主函数****************/
void main( void )
{
 /*下面六行程序关闭所有的IO口*/
 P5DIR = 0xff;
 P5OUT = 0xff; P1DIR = 0XFF; P1OUT = 0XFF;
 P2DIR = 0XFF; P2OUT = 0XFF;
 P3DIR = 0XFF; P3OUT = 0XFF;
 P4DIR = 0XFF; P4OUT = 0XFF;
 P5DIR = 0XFF; P5OUT = 0XFF;
 P6DIR = 0XFF; P6OUT = 0XFF;
 WDTCTL = WDTPW + WDTHOLD;
 Clock_Init();
 UART_Init();
 P6DIR |= BIT6; P6OUT |= BIT6; /* 关闭电平转换 */
 P5DIR |= BIT5; P5OUT |= BIT5; /* 关闭电平转换 */
 P6DIR |= BIT7; P6OUT |= BIT7; /* 关闭蜂鸣器 */
 /* 设置看门狗定时器,初始化控制数码管的IO */
 WDTCTL = WDT_ADLY_1_9;
 IE1 |= WDTIE;
 /* 计数时钟选择SMLK=8MHz,1/8分频后为1MHz */
 TACTL |= TASSEL_2 + ID_3;
 /* 打开全局中断 */
 _EINT();
 /* 循环读数显示 */
 while ( 1 )
 {
  wendu = Do1Convert();                   /* 读取温度s */
  Disp_Numb( wendu );                     /* 显示温度 */
  /* 串口发送温度 wendu */
  memset( fasong, 0, sizeof(fasong) );    /* 清空发送数组 */
  sprintf( fasong, "%d%d.%d  \r\n", (int)dN[5],(int)dN[4] ,(int)dN[3]  );
  Print_Str( fasong );
 }
}
/*******************************************
 * 函数名称:watchdog_timer
 * 功    能:看门狗定时器中断服务函数,进行数码
 *        管动态扫描
 * 参    数:无
 * 返回值  :无
 ********************************************/
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer( void )
{
 /*
  * P4OUT = 0xFF;
  *  wei_h;
  * wei_l;
  */
 P4OUT = scandata[dN[5 - cnt]];
 if ( cnt == 1 )
  P4OUT &= ~BIT7;  /* 在第二位显示小数点 */
 duan_h;
 duan_l;
 P4OUT = ~(1 << cnt);
 wei_h;
 wei_l;
 cnt++;
 if ( cnt == 3 )
  cnt = 0;
}
/*******************************************
 * 函数名称:Disp_Numb
 * 功    能:将从DS18B20读取的11bit温度数据转换
 *        成数码管显示的温度数字
 * 参    数:temper--11bit温度数据
 * 返回值  :无
 ********************************************/
void Disp_Numb( uint temper )
{
 uchar i;
 for ( i = 0; i < 6; i++ )
  dN[i] = 0;          /* 初始化显示变量 */
 /* 数值转换 */
 if ( temper & BIT0 )
 {
  dN[0] = 5;
  dN[1] = 2;
  dN[2] = 6;
 }
 if ( temper & BIT1 )
 {
  dN[1] += 5;
  dN[2] += 2;
  dN[3] += 1;
 }
 if ( temper & BIT2 )
 {
  dN[2] += 5;
  dN[3] += 2;
  if ( dN[2] >= 10 )
  {
   dN[2] -= 10;
   dN[3] += 1;
  }
 }
 if ( temper & BIT3 )
 {
  dN[3] += 5;
 }
 if ( temper & BIT4 )
 {
  dN[4] += 1;
 }
 if ( temper & BIT5 )
 {
  dN[4] += 2;
 }
 if ( temper & BIT6 )
 {
  dN[4] += 4;
 }
 if ( temper & BIT7 )
 {
  dN[4] += 8;
  if ( dN[4] >= 10 )
  {
   dN[4] -= 10;
   dN[5] += 1;
  }
 }
 if ( temper & BIT8 )
 {
  dN[4] += 6;
  dN[5] += 1;
  if ( dN[4] >= 10 )
  {
   dN[4] -= 10;
   dN[5] += 1;
  }
 }
 if ( temper & BIT9 )
 {
  dN[4] += 2;
  dN[5] += 3;
  if ( dN[4] >= 10 )
  {
   dN[4] -= 10;
   dN[5] += 1;
  }
 }
 if ( temper & BITA )
 {
  dN[4] += 4;
  dN[5] += 6;
  if ( dN[4] >= 10 )
  {
   dN[4] -= 10;
   dN[5] += 1;
  }
  if ( dN[5] >= 10 )
  {
   dN[5] -= 10;
  }
 }
}
cpp展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!