当前位置:首页 > MSP430G2553 - DS18B20 - 串口通信
//****************************************************************************** // 功能描述:该程序以msp430 launchpad为平台,用ds18b20单总线测量温度,通过串口可 // 可以显示在串口助手上,注意要发送一个数据就会开始显示。 // DZX
// February 2015
// Built with IAR Embedded Workbench Version: 5.50
//****************************************************************************** #include \
typedef unsigned char uchar; typedef unsigned int uint;
#define DQ1 P2OUT |= BIT4 #define DQ0 P2OUT &= ~BIT4 #define DQ_in P2DIR &= ~BIT4 #define DQ_out P2DIR |= BIT4 #define DQ_val (P2IN & BIT4)
#define CPU_F ((double)1000000)
#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))
/******************************************************************************* 函数名称:Init_18B20
功 能:对DS18B20进行复位操作 参 数:无
返回值 :初始化状态标志:1--失败,0--成功
*******************************************************************************/ uchar Init_18B20(void) {
uchar Error; DQ_out; DQ0;
delay_us(500); DQ1;
delay_us(55); DQ_in;
if(DQ_val) {
Error = 1; //初始化失败 } else {
Error = 0; //初始化成功
}
DQ_out; DQ1;
delay_us(400);
return Error; }
/******************************************************************************* 函数名称:Write_18B20
功 能:向DS18B20写入一个字节的数据 参 数:wdata--写入的数据 返回值 :无
*******************************************************************************/ void Write_18B20(uchar wdata) {
uchar i;
for(i = 0; i < 8;i++) {
DQ0;
delay_us(6); //延时6us if(wdata & 0X01) DQ1; else DQ0; wdata >>= 1;
delay_us(50); //延时50us DQ1;
delay_us(10); //延时10us } }
/******************************************************************************* 函数名称:Read_18B20
功 能:从DS18B20读取一个字节的数据 参 数:无
返回值 :读出的一个字节数据
*******************************************************************************/ uchar Read_18B20(void) {
uchar i;
uchar temp = 0;
for(i = 0;i < 8;i++) {
temp >>= 1; DQ0;
delay_us(6); //延时6us DQ1;
delay_us(8); //延时9us DQ_in;
if(DQ_val) temp |= 0x80;
delay_us(45); //延时45us DQ_out; DQ1;
delay_us(10); //延时10us }
return temp; }
/******************************************************************************* 函数名称:Skip
功 能:发送跳过读取产品ID号命令 参 数:无 返回值 :无
*******************************************************************************/ void Skip(void) {
Write_18B20(0xcc); }
/******************************************************************************* 函数名称:Convert
功 能:发送温度转换命令 参 数:无 返回值 :无
*******************************************************************************/ void 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 = (temp<<8) | temp_low;
return temp; }
/******************************************************************************* 函数名称:Do1Convert
功 能:控制DS18B20完成一次温度转换 参 数:无
返回值 :测量的温度数值
*******************************************************************************/ uint Do1Convert(void) {
uchar i; do {
i = Init_18B20(); }
while(i); Skip(); Convert();
delay_ms(1000); do {
i = Init_18B20();
}
while(i); Skip(); Read_SP();
return ReadTemp()*0.0625; }
/******************************************************************************* 函数名称:void main( void ) 功 能:主函数
*******************************************************************************/ void main( void ) {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT if(CALBC1_1MHZ==0xFF) // If calibration constant erased {
while(1); // do not load, trap CPU!! }
DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled }
// Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) {
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = Do1Convert(); // TX -> RXed character }
共分享92篇相关文档