发布时间 : 星期四 文章DS18B20--MSP430--4位数码管显示温度更新完毕开始阅读444991416e85ec3a87c24028915f804d2b168795
DS18B20 MSP430 4位数码管显示温度
//实验材料:MSP430F149开发板,DS18B20一个,杜邦线15条,3元普通4位共阴极数码管一个
//由于本人没有排阻,没有采用灌电流方式给4位共阴极数码管供电,MSP430的I/O口直接接4位共阴极数码管的12个脚
//接线说明:DS18B20数据口接P17,电源接3.3V直流;P40~P47接数码管a、b、c、d、e、f、g、dp // P50~P53接位1、位2、位3,位4,数码管接线图请百度 //Made By Zhong Sir From Wuhan University #include
#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 //DS18B20控制脚,单脚控制
#define DQ_IN P1DIR &= ~BIT7 // DS18B20接单片机P17口 #define DQ_OUT P1DIR |= BIT7 //设置输出
#define DQ_CLR P1OUT &= ~BIT7 //置低电平 #define DQ_SET P1OUT |= BIT7 //置高电平 #define DQ_R P1IN & BIT7 //读电平 int temp_value;
int temp; //定义的变量,显示数据处理 int A1,A2,A3;
//*********************************************************************** // 系统时钟初始化,外部8M晶振
//*********************************************************************** void Clock_Init() {
uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{
IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); }
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; }
//*********************************************************************** // MSP430内部看门狗初始化
//***********************************************************************
void WDT_Init() {
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 }
//************************************************************************* // 初始化IO口子程序
//************************************************************************* void Port_Init() {
P5DIR = 0xFF; //设置IO口方向为输出 P4DIR = 0xFF; //P2口初始设置为FF }
//************************************************************************* // DS18B20初始化
//************************************************************************* unsigned char DS18B20_Reset(void) //初始化和复位 {
unsigned char i; DQ_OUT; DQ_CLR;
delay_us(500); //延时500uS(480-960) DQ_SET; DQ_IN;
delay_us(80); //延时80uS i = DQ_R;
delay_us(500); //延时500uS(保持>480uS)
if (i) {
return 0x00; } else {
return 0x01; } }
//************************************************************************* // DS18B20读一个字节函数
//*************************************************************************
unsigned char ds1820_read_byte(void) {
unsigned char i;
unsigned char value = 0; for (i = 8; i != 0; i--) {
value >>= 1;
DQ_OUT; DQ_CLR;
delay_us(4); //*延时4uS DQ_SET; DQ_IN;
delay_us(10); //*延时10uS if (DQ_R) {
value|=0x80; }
delay_us(60); //*延时60uS }
return(value); }
//************************************************************************* // 向18B20写一个字节函数
//*************************************************************************
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
for (i = 8; i != 0; i--) {
DQ_OUT; DQ_CLR;
delay_us(4); //延时4uS if (value & 0x01) {
DQ_SET; }
delay_us(80); //延时80uS DQ_SET; //位结束 value >>= 1; } }
//************************************************************************* // 发送温度转换命令
//*************************************************************************
/*启动ds1820转换*/
void ds1820_start(void) {
DS18B20_Reset();
ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0x44); //启动转换 }
//************************************************************************* // DS8B20读取温度信息
//*************************************************************************
unsigned int ds1820_read_temp(void) {
unsigned int i;
unsigned char buf[9];
DS18B20_Reset();
ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0xBE); //读取温度 for (i = 0; i < 9; i++) {
buf[i] = ds1820_read_byte(); }
i = buf[1]; i <<= 8; i |= buf[0]; temp_value=i;
temp_value=(uint)(temp_value*0.625);
//不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据 return i; }
//************************************************************************* // 温度数据处理函数
//************************************************************************* void data_do(int temp_d) {
int A2t;
A1=temp_d/100; //分出百,十,和个位 A2t=temp_d0; A2=A2t/10; A3=A2t; }
//*********************************************************************** // 主程序
//*********************************************************************** void main(void) {
const unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; const unsigned char zww[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; uchar j;
WDT_Init(); //看门狗初始化 Clock_Init(); //时钟初始化
Port_Init(); //端口初始化,用于控制IO口输入或输出 DS18B20_Reset(); //复位D18B20