历史上的今天
今天是:2025年02月03日(星期一)
2020年02月03日 | 在msp430上使用S-100
2020-02-03 来源:eefocus
属于msp430的串口的应用。S-100输出数据的方式还有IIC和Analog Voltage Output,这里使用UART。
使用器件型号:msp430F169/msp430F149,S-100 CO₂ module @TCC ELT
UART Protocol的数据格式:

其他说明详见S-100手册。
代码:
#include #include "co2.h" typedef unsigned int uint; typedef unsigned char uchar; typedef unsigned short u16; uchar buff[200]={0}; u16 CO2value; typedef struct { u16 thousand;//CO2值的千位 u16 hundred;//CO2值的百位 u16 decimal;//获取CO2值的十位 u16 unit;//CO2值的个位 u16 result;//获取的CO2值 }CO2_Value; int len; void CLK_Init() { unsigned int index; BCSCTL1&=~0X00; //打开XT2振荡器 do { IFG1 &= ~OFIFG; // 清除振荡器失效标志 for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振 { ; } } while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振 BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2 } void USART_Init() { P3SEL |= BIT5+ BIT4; // P3.4,5 = USART0 TXD/RXD ````````````````````````````````````````````````````````````````````` P3DIR |=~ BIT4; P3DIR &=~ BIT5; // P6DIR |= TXLED; UCTL0 |= SWRST; ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; UTCTL0=SSEL1; //选择SMCLK为波特率时钟源,(允许低功耗唤醒) 8M // UCLK = SMCLK UBR00 = 0xD0; // 8Mhz=8000000/38,400 UBR10 = 0x00; UMCTL0 = 0x40; //UBR00 = 0x03; // 8Mhz=8000000/38,400 //UBR10 = 0x00; //UMCTL0 = 0x4a; UCTL0 &=~SWRST; //允许UART运行 IE1 |= URXIE0; // Enable USART0 RX interrupt _EINT(); } void S100_ComRecvByte(u16 *recv_byte) { LPM1; *recv_byte = RXBUF0; //TXBUF0 = *recv_byte; // RXBUF0 = TXBUF0; } void S100_ComRecv(u16 *recv_data,int recv_len) { volatile u16 uart_p = 0; while(uart_p S100_ComRecvByte(&recv_data[uart_p]); uart_p++; } } void usart_send(uchar *data,int *length) { int i,k; for(i=0;i<*length;i++) { TXBUF0=(char)data[i]; // TXBUF0=(char)k++; while((IFG1&UTXIFG0)==0); IFG1 &=~(UTXIFG0); } } int main() { CO2_Value CO2_Value_val; u16 s100_buff[S100_BUFF_SIZE]={0x30}; WDTCTL = WDTPW + WDTHOLD; CLK_Init(); USART_Init(); //串口初始化 while(1){ S100_ComRecv(s100_buff,11); CO2_Value_val.thousand = (s100_buff[1]<0x30)?0:(s100_buff[1]-0x30); //获取CO2值的千位 CO2_Value_val.hundred = (s100_buff[2]-0x30 );//获取CO2值的百位 CO2_Value_val.decimal = (s100_buff[3]-0x30 ); //获取CO2值的十位 CO2_Value_val.unit = (s100_buff[4]-0x30); //获取CO2值的个位 CO2_Value_val.result = CO2_Value_val.thousand*1000 + CO2_Value_val.hundred*100 + CO2_Value_val.decimal*10 + CO2_Value_val.unit; CO2value=CO2_Value_val.result; usart_send(s100_buff,11); } } #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { LPM1_EXIT; } #ifndef __COO_H #define __COO_H #include typedef unsigned int uint; typedef unsigned char uchar; typedef unsigned short u16; #define S100_BUFF_SIZE 12 #define TXLED BIT0 #endif /*-------------------end of S-100--------------------------------*/
史海拾趣
|
今天出场的这款鼠标键盘虽然外表朴实,却也不会让人小觑。这款鼠标键盘将标准键盘切分成两半,其中右边键盘被设计成一个大型鼠标。 当你移动这个大型鼠标的时候,它会自动从键盘模式进入鼠标模式,屏幕上的光标也会随之移动。与此同时,这半边键盘 ...… 查看全部问答> |
|
作为一种新的光源,近年来各大公司和研究机构对LED电源和驱动电路的研究方兴未艾。与荧光灯的电子镇流器不同,LED驱动电路的主要功能是将交流电压转换为直流电压,并同时完成与LED的电压和电流的匹配。随着硅集成电路电源电压的直线下降,LED工作电 ...… 查看全部问答> |
|
我最近做激光器的驱动电路,有一个自动功率控制电路这里有一些问题不明白,PD是提供了电流,可是PD的电流方向是向下的,A1运放“+”输入端电流又进不去,那这个方向的电流到底流到哪里呀,这里“+”端又没有接地,电流走不通呀,小弟不明白呀,请各 ...… 查看全部问答> |
|
分享我收集的嵌入式wince/android/linux著名网站和博客地址 3001、android 著名博客 http://blog.csdn.net/Luoshengyang/ ——老罗的android 之旅,一个android大牛人的博客,文章高深莫测,只有少数前期文章适合初学者。 http://blog.csdn.net/mr_raptor ——华清远见一个老师的博客,适合android入门初学 ...… 查看全部问答> |
|
MSP430F169 P54 输出1之后自动清零是怎么回事? 现在用P54.其片内功能是MCLK的输出,现在设置其为输出,选择为IO功能,可是在置一之后会自动清零。(P5DIR|=BIT4;P5SEL&=~BIT4,P5OUT|=BIT4;)??why?… 查看全部问答> |




