打印

给你写的launchpad430(转)

[复制链接]
7379|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houjiakai|  楼主 | 2013-11-20 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在写launchpad430程序的时候,发现IAR下有两种可用的头文件
•#include "io430.h"
部分内容:
[cpp] view plaincopy
01.#elif defined (__MSP430G2553__)  
02.#include "io430g2553.h"  
03.  
04.#elif defined (__MSP430G2203__)  
05.#include "io430g2203.h"  
06.  
07.#elif defined (__MSP430G2303__)  
08.#include "io430g2303.h"  
09.  
10.#elif defined (__MSP430G2403__)  
11.#include "io430g2403.h"  
12.  
13.#elif defined (__MSP430G2233__)  
14.#include "io430g2233.h"  

可以看到,根据不同的处理器定义,可以包含不同的处理器的头文件,例如:io430g2553.h
[cpp] view plaincopy
01.__no_init volatile union  
02.{  
03.  unsigned char DCOCTL;   /* DCO Clock Frequency Control */  
04.  
05.  struct  
06.  {  
07.    unsigned char MOD0            : 1; /* Modulation Bit 0 */  
08.    unsigned char MOD1            : 1; /* Modulation Bit 1 */  
09.    unsigned char MOD2            : 1; /* Modulation Bit 2 */  
10.    unsigned char MOD3            : 1; /* Modulation Bit 3 */  
11.    unsigned char MOD4            : 1; /* Modulation Bit 4 */  
12.    unsigned char DCO0            : 1; /* DCO Select Bit 0 */  
13.    unsigned char DCO1            : 1; /* DCO Select Bit 1 */  
14.    unsigned char DCO2            : 1; /* DCO Select Bit 2 */  
15.  }DCOCTL_bit;  
16.} @0x0056;  
17.  
18.  
19.enum {  
20.  MOD0            = 0x0001,  
21.  MOD1            = 0x0002,  
22.  MOD2            = 0x0004,  
23.  MOD3            = 0x0008,  
24.  MOD4            = 0x0010,  
25.  DCO0            = 0x0020,  
26.  DCO1            = 0x0040,  
27.  DCO2            = 0x0080  
28.};  

由以上代码可以看出,地址在0x0056的寄存器是DCOCTL、DCOCTL_bit。由于是联合体对DCOCTL、DCOCTL_bit的操作是相同的。
不同的是DCOCTL只能是按字节来操作,例如:DCOCTL = 0x00;而DCOCTL_bit是一个结构体,可以访问结构体的单元,例如:DCOCTL_bit.MOD0 = 0;

相关帖子

沙发
houjiakai|  楼主 | 2013-11-20 23:27 | 只看该作者
最好头文件还定义了个枚举量,可以更加形象的操作,例如:将MOD0置1,即DCOCTL  |= MOD0,MOD1置0,即DCOCTL &= ~MOD1。

•#include <msp430.h>

[objc] view plaincopy
01.#elif defined (__MSP430G2153__)
02.#include "msp430g2153.h"
03.
04.#elif defined (__MSP430G2253__)
05.#include "msp430g2253.h"
06.
07.#elif defined (__MSP430G2353__)
08.#include "msp430g2353.h"
09.
10.#elif defined (__MSP430G2453__)
11.#include "msp430g2453.h"
12.
13.#elif defined (__MSP430G2553__)
14.#include "msp430g2553.h"


可以看到,根据不同的处理器定义,可以包含不同的处理器的头文件,例如:msp430g2553.h

[objc] view plaincopy
01.#define DCOCTL_             (0x0056u)  /* DCO Clock Frequency Control */
02.DEFC(   DCOCTL            , DCOCTL_)

可以看出直接将DCOCTL定义在0x0056

使用特权

评论回复
板凳
houjiakai|  楼主 | 2013-11-20 23:27 | 只看该作者
官方资料:http://www.ti.com.cn/tool/cn/msp-exp430g2

                  http://www.ti.com/ww/cn/launchpad/msp430_head.html


类似arduino的开发软件:http://energia.nu/download/

推荐文档:玩转TI MSP430 launchpad

学习时,应下载相应的电路图和数据手册待用!

使用特权

评论回复
地板
houjiakai|  楼主 | 2013-11-20 23:28 | 只看该作者
相关说明首先我们应该搞清楚G2553的内部时钟,这样方便我们以后进行定时器、串口等外设的设置。
如下如所示:

从图中我们可以看出,系统的工作时钟主要有三个:
ACLK辅助工作时钟;
MCLK系统CPU时钟;
SMCLK次工作时钟。

使用特权

评论回复
5
houjiakai|  楼主 | 2013-11-20 23:28 | 只看该作者
这三个时钟为系统的必要时钟,也就是说我们上程序开始的是应该进行相应的配置,这样系统才能按照我们的要求去工作。
ACLK
有图可以看出,主要由VLOCLK和XT1为其提供时钟,我们只需要在这直接进行选择就行了。VLOCLK约为12KHz
  • //设置ACLK为12K  
  • BCSCTL3_bit.LFXT1S0 = 0;  
  • BCSCTL3_bit.LFXT1S1 = 1;  

这两位可以对其进行配置。 MCLK和SMCLK一般选择DCO产生的时钟。
  • //1Mhz  
  • 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 range  
  • DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */  

这是TI提供的DCO配置代码,因此我们只要模仿着配置就行了! 注意该配置只限于以下的选项:
  • /*-------------------------------------------------------------------------
  • *   Calibration Data
  • *-------------------------------------------------------------------------*/  
  •   /* DCOCTL  Calibration Data for 16MHz */  
  • __no_init volatile unsigned __READ char CALDCO_16MHZ @ 0x10F8;  
  •   
  •   /* BCSCTL1 Calibration Data for 16MHz */  
  • __no_init volatile unsigned __READ char CALBC1_16MHZ @ 0x10F9;  
  •   
  •   /* DCOCTL  Calibration Data for 12MHz */  
  • __no_init volatile unsigned __READ char CALDCO_12MHZ @ 0x10FA;  
  •   
  •   /* BCSCTL1 Calibration Data for 12MHz */  
  • __no_init volatile unsigned __READ char CALBC1_12MHZ @ 0x10FB;  
  •   
  •   /* DCOCTL  Calibration Data for 8MHz */  
  • __no_init volatile unsigned __READ char CALDCO_8MHZ @ 0x10FC;  
  •   
  •   /* BCSCTL1 Calibration Data for 8MHz */  
  • __no_init volatile unsigned __READ char CALBC1_8MHZ @ 0x10FD;  
  •   
  •   /* DCOCTL  Calibration Data for 1MHz */  
  • __no_init volatile unsigned __READ char CALDCO_1MHZ @ 0x10FE;  
  •   
  •   /* BCSCTL1 Calibration Data for 1MHz */  
  • __no_init volatile unsigned __READ char CALBC1_1MHZ @ 0x10FF;  

也就说你要想实现CALDCO_4MHZ 和 CALBC1_1MHZ就得自己写。 得到了DCOCLK,然后我们只需要将DCOCLK连接到MCLK和SMCLK就可以了!
当然这连接之间还可以配置分频系数,例如DCOCLK = 16MHz,我们通过分频可以得到MCLK = 8MHz,SMCLK = 4MHz。
通过以下寄存器配置:
  • //MCLK分频  
  • BCSCTL2_bit.DIVM0 = 0;  
  • BCSCTL2_bit.DIVM1 = 1;  
  •   
  • //SMCLK分频  
  • BCSCTL2_bit.DIVS0 = 0;  
  • BCSCTL2_bit.DIVS1 = 0;  

这样我们就可配置自己的系统时钟了!
测试方法通过芯片的P1.0和P1.4脚可以输出ACLK和SMCLK
  • P1DIR |= 0x11;                            // P1.0,4 outputs  
  • P1SEL |= 0x11;                            // P1.0,4 ACLK, SMCLK output  



使用特权

评论回复
6
houjiakai|  楼主 | 2013-11-20 23:29 | 只看该作者
技术说明

因此我们在设计电路的时候,只需要连接这两个引脚到MAX3232电平转换芯片上就可以进行通信。
在通信之前我们应做一些设置,例如管脚、时钟等。




波特率设置技巧
查看datasheet:可以在chapter15找到下表


                                                                         图1



例如:我们设置SMCLK、MCLK = 1MHz,UARTA输入时钟为SMCLK,波特率 = 115200,开启读中断。
管脚设置查看数据手册,连接UARTA的管脚是P1.1,P1.2
  • P1SEL  = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD  
  • P1SEL2 = BIT1 + BIT2;  

时钟及波特率设置
查看数据手册,找到设置波特率的表格,如上图1所示:
  • UCA0CTL1 |= UCSSEL_2;                     // SMCLK  
  • UCA0BR0 = 8;                              // 1MHz 115200  
  • UCA0BR1 = 0;                              // 1MHz 115200  
  • UCA0MCTL = UCBRS2 + UCBRS1;               // Modulation UCBRSx = 6  




使用特权

评论回复
7
houjiakai|  楼主 | 2013-11-20 23:30 | 只看该作者
初始化及中断设置
  • UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**  
  • IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt  

完整例程
  • #include <msp430.h>  
  •   
  • int 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;  
  •    
  •   UCA0CTL1 |= UCSSEL_2;                     // SMCLK  
  •   UCA0BR0 = 8;                              // 1MHz 115200  
  •   UCA0BR1 = 0;                              // 1MHz 115200  
  •   UCA0MCTL = UCBRS2 + UCBRS1;               // Modulation UCBRSx = 6  
  •    
  •   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 = UCA0RXBUF;                    // TX -> RXed character  
  • }  


函数扩展编写个发送字符的函数
  • void SendChar(unsigned char c_data)  
  • {  
  •   UCA0TXBUF = c_data;  
  •   while(!(IFG2&UCA0TXIFG));  
  • }




使用特权

评论回复
8
houjiakai|  楼主 | 2013-11-20 23:30 | 只看该作者
技术说明


如图所示。。。在使用定时器之前,我们首先应该清楚我们将用这个定时器干什么,430的定时器功能比较丰富,
有定时、比较、捕获。
定时很好理解,就是设定好输入时钟以及计数个数后,定时器就会在输入时钟周期个数达到设定个数后发生中断,
你可以在中断中添加自己的处理程序。

使用特权

评论回复
9
houjiakai|  楼主 | 2013-11-20 23:31 | 只看该作者
定时器的模式有几种方式:STOP、UP、Continuous、UP/DOWN

这种模式就是定时器计数个数达到TACCR0寄存器中的数目时,发生TACCR0 CCIFG中断。
注意:此模式在定时器从TACCR0到0转变时也会发生TAIFG中断。

其他模式类似。

提示:建议在修改寄存器前,停止定时器。
          定时器在设置除STOP外都立即开始计数。
信号源的选择
•硬件

•软件
如果使用外部输入信号,在硬件设计上就应该连接这个引脚。
相关设置

[objc] view plaincopy
01.CCTL0 = CCIE;                             // CCR0 interrupt enabled  
02.CCR0  = 50000;  
03.TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode  
从代码来看,我们应先设置相关的寄存器,然后启动定时器,也就是说定时的启动应该在最后。
多个中断的写法

查看头文件TAIV = TA0IV,这里只有CCR1、CCR2的中断,CCR0有自己的中断。
具体一点说
CCR0对应中断TIMER0_A0_VECTOR;CCR1、CCR2、TA0溢出对应TIMER0_A1_VECTOR。

[objc] view plaincopy
01.// Timer_A3 Interrupt Vector (TA0IV) handler  
02.#pragma vector=TIMER0_A1_VECTOR  
03.__interrupt void Timer_A(void)  
04.{  
05. switch( TA0IV )  
06. {  
07.   case  2:   
08.            // CCR1_hander();  
09.            break;                          // CCR1 not used  
10.   case  4:   
11.            // CCR2_hander();  
12.            break;                          // CCR2 not used  
13.   case 10: P1OUT ^= 0x01;                  // overflow  
14.            break;  
15. }  
16.}  

使用特权

评论回复
10
houjiakai|  楼主 | 2013-11-20 23:31 | 只看该作者
技术说明摘录1:MSP430x2xx Family User's Guide Version.SLAU144J page.363


以上是datasheet中对定时器比较功能的说明,意思是在计数器TAR和TACCR0发生匹配时,会有以下动作:
  • CCIFG中断标志置位
  • 相应的匹配符EQUx置位
  • 和EQUx对应的输出模式发生动作
  • CCI信号被锁存到SCCI



摘录2:MSP430G2x53/MSP430G2x13用户手册中文 Version.SLAS735E page.7
比较功能有对应的输出管脚,例如:


TA0.0表示当TACCR0发生匹配的时候,该管脚发生设置的转换动作。


代码1:
  • CCTL0 = OUTMOD_4;                         // CCR0 toggle mode  
  • CCR0  = 500-1;  
  • TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode  

以上配置,CCR0设置为500个时钟周期且工作模式是开关模式,即TAR每计数到500个时钟P1.1就会翻转一次,也就是输出的方波周期是1000个时钟周期,outclk = SMCLK/1000。


代码2:


  • CCR0 = 512-1;                             // PWM Period  
  • CCTL1 = OUTMOD_7;                         // CCR1 reset/set  
  • CCR1 = 384;                               // CCR1 PWM duty cycle  
  • TACTL = TASSEL_2 + MC_1;                  // SMCLK, up mode  


结合程序比较器模式为reset/set模式、CCR0配置为511、CCR1配置为384,结合图形可知属于Output Mode 7。
即在0--383时钟周期内P1.1为高、384 -- 511时钟周期内P1.1为低。



使用特权

评论回复
11
houjiakai|  楼主 | 2013-11-20 23:32 | 只看该作者
完整例程说明:P2.1经TA1产生一个周期为400Hz、占空比为25%的方波,并将P2.1 ----连接到--- P1.2作为TA0的捕获输入,
P1.0接LED灯,在P1.2测得输入的方波是25%占空比的方波时,LED将会点亮否则是灭的!!!!


  • #include <msp430.h>  
  •   
  • unsigned char Count, First_Time;  
  • unsigned int REdge1, REdge2, FEdge;  
  •   
  • int main(void)  
  • {  
  •   unsigned int Period, ON_Period;  
  •   unsigned char DutyCycle;  
  •   
  •   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer  
  •   
  •   //  P1SEL |= BIT0;  
  •   P1DIR |= BIT0;                            // P1.0/LED Output  
  •   P1OUT &= ~BIT0;                           // LED off  
  •   if (CALBC1_8MHZ==0xFF)                    // If calibration constant erased  
  •   {                                          
  •     while(1);                               // do not load, trap CPU!!   
  •   }  
  •   DCOCTL = 0;                               // Select lowest DCOx and MODx settings  
  •   BCSCTL1 = CALBC1_8MHZ;                    // Set DCO to 8MHz  
  •   DCOCTL = CALDCO_8MHZ;  
  •   
  •   // Configure Port Pins  
  •   P2DIR |= BIT1;                            // P2.1/TA1.1 Output  
  •   P2SEL |= BIT1;                            // TA1.1 Option select  
  •   P1DIR &= ~BIT2;                           // P1.1/TA0.1 Input Capture  
  •   P1SEL |= BIT2;                            // TA0.1 option select  
  •   
  •   // Configure TA1.1 to output PWM signal  
  •   // Period = 82/32khz = 2.5ms ~ 400Hz Freq  
  •   TA1CCR0 = 82-1;                          // Period Register  
  •   TA1CCR1 = 21;                            // TA1.1 25% dutycycle  
  •   TA1CCTL1 |= OUTMOD_7;                    // TA1CCR1, Reset/Set  
  •   TA1CTL = TASSEL_1 + MC_1 + TACLR;        // ACLK, upmode, clear TAR  
  •   
  •   // Configure the TA0CCR1 to do input capture  
  •   TA0CCTL1 = CAP + CM_3 + CCIE + SCS + CCIS_0;  
  •                                             // TA0CCR1 Capture mode; CCI1A; Both  
  •                                             // Rising and Falling Edge; interrupt enable  
  •   TA0CTL |= TASSEL_2 + MC_2 + TACLR;        // SMCLK, Cont Mode; start timer  
  •   
  •   // Variable Initialization  
  •   Count = 0x0;  
  •   First_Time = 0x01;  
  •   
  •   while(1)  
  •   {  
  •       __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0  
  •       __no_operation();                     // For debugger  
  •       // On exiting LPM0  
  •       if (TA0CCTL1 & COV)                   // Check for Capture Overflow  
  •           while(1);                         // Loop Forever  
  •   
  •       Period = REdge2 - REdge1;             // Calculate Period  
  •       ON_Period = FEdge-REdge1;             // On period  
  •       DutyCycle = ((unsigned long)ON_Period*100/Period);  
  •       if(DutyCycle!= 25)  
  •       {  
  •           P1OUT |= BIT0;  
  •       }  
  •       else  
  •       {  
  •           P1OUT &= ~BIT0;  
  •       }  
  •   }  
  • }  
  •   




使用特权

评论回复
12
houjiakai|  楼主 | 2013-11-20 23:32 | 只看该作者
  • // TA0_A1 Interrupt vector  
  • #pragma vector = TIMER0_A1_VECTOR  
  • __interrupt void TIMER0_A1_ISR (void)  
  • {  
  •   switch(__even_in_range(TA0IV,0x0A))  
  •   {  
  •       case  TA0IV_NONE: break;              // Vector  0:  No interrupt  
  •       case  TA0IV_TACCR1:                   // Vector  2:  TACCR1 CCIFG  
  •         if (TA0CCTL1 & CCI)                 // Capture Input Pin Status  
  •         {  
  •             // Rising Edge was captured  
  •             if (!Count)  
  •             {  
  •                 REdge1 = TA0CCR1;  
  •                 Count++;  
  •             }  
  •             else  
  •             {  
  •                 REdge2 = TA0CCR1;  
  •                 Count=0x0;  
  •                 __bic_SR_register_on_exit(LPM0_bits + GIE);  // Exit LPM0 on return to main  
  •             }  
  •   
  •             if (First_Time)  
  •                 First_Time = 0x0;  
  •         }  
  •         else  
  •         {  
  •             // Falling Edge was captured  
  •             if(!First_Time)  
  •             {  
  •                 FEdge = TA0CCR1;  
  •             }  
  •         }  
  •         break;  
  •       case TA0IV_TACCR2: break;             // Vector  4:  TACCR2 CCIFG  
  •       case TA0IV_6: break;                  // Vector  6:  Reserved CCIFG  
  •       case TA0IV_8: break;                  // Vector  8:  Reserved CCIFG  
  •       case TA0IV_TAIFG: break;              // Vector 10:  TAIFG  
  •       default:  break;  
  •   }  
  • }  
注释:14 -- 15 :设置P1.0为输出,作为LED的控制信号
16 -- 22 :设置DCO的时钟为8MHz,因此SMCLK = MCLK = 8MHz,前面已经学习了!!!
25 -- 28 :设置P2.1为输出、P1.2为输入
32 -- 35 :设置TA1为reset/set,这样TA1CCR1代表高电平、TA1CCR0代表低电平。和代码2类似!!!
38 -- 41 :设置捕获
49 -- 65 :等待检测完毕,然后计算出占空比DutyCycle

使用特权

评论回复
13
houjiakai|  楼主 | 2013-11-20 23:32 | 只看该作者
技术说明18B20的管脚及封装入下图所示:
注意:BOTTOM VIEW 表示从底部向上看!

使用特权

评论回复
14
houjiakai|  楼主 | 2013-11-20 23:33 | 只看该作者
1-Wire总线
  • 复位时序

  • /****************************************************************************
  • * 名    称:unsigned char DS18B20_Init(void)
  • * 功    能:对DS18B20进行初始化
  • * 入口参数:
  • * 出口参数:
  • * 说    明:  
  • ****************************************************************************/  
  • unsigned char DS18B20_Init(void)  
  • {  
  •   unsigned char result;  
  •   DQ_OUT;  
  •   DQ_L;     
  •   delay_us(500);   //总线拉低480us~960us,即主机发送复位脉冲  
  •   DQ_IN;           //总线设为输入状态,等待18b20应答  
  •   delay_us(60);     
  •   result=DQ_DATE;  //读取18b20应答信号  
  •   delay_us(500);   //等待480us以上,保证总线释放  
  •   return(result);  //返回0则初始化成功   
  • }  

我们根据时序分析程序,有时序图可知,黑色实线是MCU的输出;灰色实线是DS18B20的输出。
在初始化阶段,首先由MCU发送一个大于480us的低电平,在DS18B20接收到此低电平约15~60us的时候,
就会返回一个60~240us的低电平,此时我们检测DS18B20的管脚,若是低电平表示初始化成功!!
  • 写时序

  • /****************************************************************************
  • * 名    称:void DS18B20_WriteBit(unsigned char Data)
  • * 功    能:给DS18B20单总线上写1Bit数
  • * 入口参数:
  • * 出口参数:
  • * 说    明:  
  • ****************************************************************************/  
  • void DS18B20_WriteBit(unsigned char Data)  
  • {  
  •   DQ_OUT;           //设置总线为输出  
  •   DQ_L;             //产生写起始信号  
  •   delay_us(15);     //15us后写入数据      
  •   if(Data) DQ_H;   
  •   else     DQ_L;   
  •   delay_us(60);     //延时60us~120us,保证总线释放  
  •   DQ_IN;            //空闲状态总线保持输入状态  
  • }  


对照时序图,无论写‘1’还是‘0’,首先都有应该发送一个15us的低电平,然后根据写‘1’、‘0’置低/拉高电平并维持时间大于45us就行了!
  • 读时序


使用特权

评论回复
15
houjiakai|  楼主 | 2013-11-20 23:34 | 只看该作者
  • /****************************************************************************
  • * 名    称:unsigned char DS18B20_ReadBit(void)
  • * 功    能:从DS18B20单总线上读1Bit数
  • * 入口参数:
  • * 出口参数:
  • * 说    明:  
  • ****************************************************************************/  
  • unsigned char DS18B20_ReadBit(void)  
  • {  
  •   unsigned char result;  
  •   DQ_OUT;     //设置总线为输出状态  
  •   DQ_L;       //总线拉低,产生读起始信号  
  •   _NOP();     //保证低电平在1us以上  
  •               //15us内读取总线上数据  
  •   DQ_IN;  
  •   result=DQ_DATE;   //接收数据  
  •   delay_us(60);     //延时60us,保证总线释放  
  •   return(result);   //返回数据  
  • }  
对照时序图,无论是读‘1’还是‘0’,首先都有一个大于1us的低电平,然后18B20返回一个小于15us的低电平或者高电平分别代表‘0’或者‘1’。

经过以上的分析,我们很容易就可以写出发送、接收一个字节的函数。


  • <span style="font-size: 10px;">/****************************************************************************
  • * 名    称:unsigned char DS18B20_ReadByte(void)
  • * 功    能:从DS18B20单总线上读1Byte数
  • * 入口参数:
  • * 出口参数:
  • * 说    明:  
  • ****************************************************************************/  
  • unsigned char DS18B20_ReadByte(void)  
  • {  
  •   unsigned char i,result=0;  
  •   for(i=0;i<8;i++)  
  •   {  
  •     result>>=1;  
  •     if(DS18B20_ReadBit())  result|=0x80;  
  •     else                   result&=0x7f;  
  •   }  
  •   return(result);   
  • }  
  • /****************************************************************************
  • * 名    称:void DS18B20_WriteByte(unsigned char Data)
  • * 功    能:给DS18B20单总线上写1Byte数
  • * 入口参数:
  • * 出口参数:
  • * 说    明:  
  • ****************************************************************************/  
  • void DS18B20_WriteByte(unsigned char Data)  
  • {  
  •   unsigned char i;  
  •   for(i=0;i<8;i++)  
  •   {  
  •     DS18B20_WriteBit(Data&0x01);  
  •     Data>>=1;  
  •   }   
  • }</span>  

18B20操作说明


使用特权

评论回复
16
3C农民工| | 2013-11-21 08:59 | 只看该作者
Launchpad资源是不是太少了,除了引出了几个引脚就没什么了。

使用特权

评论回复
17
shibalihuandao| | 2013-11-21 13:19 | 只看该作者
写的还是很详细的 赞

使用特权

评论回复
18
zgsxhzac| | 2013-11-21 13:29 | 只看该作者
很好资料 谢谢楼主分享

使用特权

评论回复
19
sishangcine| | 2013-11-21 13:32 | 只看该作者
楼主我转走啦

使用特权

评论回复
20
黄小俊| | 2013-11-21 20:54 | 只看该作者
又多又精彩。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

5957

帖子

5

粉丝