1、 /*下面六行程序关闭所有的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; uchar i; WDTCTL=WDTPW+WDTHOLD; /*-选择系统主时钟为8MHz-*/ BCSCTL1 &= XT2OFF; /打开XT2高频晶体振荡器 do IFG1
2、&= OFIFG; /清除晶振失败标志 for (i = 0xFF; i 0; i-); /等待8MHz晶体起振 while (IFG1 & OFIFG); /晶振失效标志仍然存在? BCSCTL2 |= SELM_2 + SELS; /MCLK和SMCLK选择高频晶振 P6DIR |= BIT6;P6OUT |= BIT6; /关闭电平转换 P5DIR |= BIT5;P5OUT |= BIT5; P6DIR |= BIT7;P6OUT |= BIT7; /关闭蜂鸣器 / 设置看门狗定时器,初始化控制数码管的IO WDTCTL = WDT_ADLY_1_9; IE1 |= WDTIE; /
3、P4DIR = 0xff; / P5DIR = 0xFF; / P5OUT = 0xff; /P4OUT = 0xff; /P6DIR = 0xff; /P6OUT = 0xFF; /计数时钟选择SMLK=8MHz,1/8分频后为1MHz TACTL |= TASSEL_2 + ID_3; /打开全局中断 _EINT(); /循环读数显示 while(1) Disp_Numb(Do1Convert(); /不停地转换显示/*函数名称:watchdog_timer功 能:看门狗定时器中断服务函数,进行数码 管动态扫描参 数:无返回值 :*/#pragma vector = WDT_VECTOR_
4、interrupt void watchdog_timer(void) / P4OUT = 0xFF; / wei_h; / wei_l; P4OUT = scandatadN5-cnt; if(cnt=1) P4OUT |= BIT7; /在第二位显示小数点 duan_h; duan_l; P4OUT = (1cnt); wei_h; wei_l; cnt+; if(cnt = 6) cnt = 0;Disp_Numb将从DS18B20读取的11bit温度数据转换 成数码管显示的温度数字temper-11bit温度数据void Disp_Numb(uint temper) for(i = 0
5、;i = 10) dN2 -= 10;BIT3) dN3 += 5; BIT4) dN4 += 1; BIT5) dN4 += 2; BIT6) dN4 += 4; BIT7) dN4 += 8; if(dN4 dN4 -= 10; dN5 += 1; BIT8) dN4 += 6; BIT9) dN5 += 3; BITA) dN5 += 6; if(dN5 dN5 -= 10;/*18b20.C*/typedef unsigned char uchar;typedef unsigned int uint;#define DQ1 P1OUT |= BIT6#define DQ0 P1OUT
6、define DQ_in P1DIR define DQ_out P1DIR |= BIT6#define DQ_val (P1IN &DelayNus实现N个微秒的延时n-延时长度说明 :定时器A的计数时钟是1MHz,CPU主频8MHz 所以通过定时器延时能够得到极为精确的 us级延时void DelayNus(uint n) CCR0 = n; TACTL |= MC_1; /增计数到CCR0 while(!(TACTL & BIT0); /等待 TACTL &= MC_1; /停止计数= BIT0; /清除中断标志Init_18B20对DS18B20进行复位操作初始化状态标志:1
7、-失败,0-成功uchar Init_18B20(void) uchar Error; DQ_out; /拉高 _DINT(); /关闭中断 DQ0; /拉低 DelayNus(500); DQ1; DelayNus(55); DQ_in; /方向设置输入 _NOP(); if(DQ_val) /输入值为1 Error = 1; /初始化失败 else /输入值为0 Error = 0; /初始化成功 /设为输出 /中断使能 DelayNus(400); return Error;Write_18B20向DS18B20写入一个字节的数据wdata-写入的数据void Write_18B20(u
8、char wdata) i = 1; DelayNus(50); /延时50us DelayNus(10); /延时10usRead_18B20从DS18B20读取一个字节的数据读出的一个字节数据uchar Read_18B20(void) uchar temp = 0; temp DelayNus(8); /延时9us if(DQ_val) temp |= 0x80; DelayNus(45); /延时45us return temp; /读到的一个字节Skip发送跳过读取产品ID号命令void Skip(void) Write_18B20(0xcc);Convert发送温度转换命令void
9、 Convert(void) Write_18B20(0x44);Read_SP发送读ScratchPad命令void Read_SP(void) Write_18B20(0xbe);ReadTemp从DS18B20的ScratchPad读取温度转换结果读取的温度数值uint ReadTemp(void) uchar temp_low; uint temp; temp_low = Read_18B20(); /读低位 temp = Read_18B20(); /读高位 temp = (tempi-) DelayNus(60000); /延时800ms以上 Read_SP(); /发送读ScratchPad命令 return ReadTemp();/*/*18b20.h*/void DelayNus(unsigned int n);unsigned char Init_18B20(void);void Write_18B20(unsigned char wdata);unsigned char Read_18B20(void);void Skip(void);void Convert(void);void Read_SP(void);unsigned int ReadTemp(void);unsigned int Do1Convert(void);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1