跪求msp430的串口发送程序啊!

跪求msp430的串口发送程序啊!,第1张

首先写发送程序,必须要使发送接收模块被允许,所以必须ME1 |= UTXE0 + URXE0该语句必须要写。其次发送接收都是高频的,故要将晶振设为高频,然后再对各个寄存器最一下必要的设置。 USART控制寄存器的组成部分:PENA,PEV,SP,CHAR,Listen,SYNC,MM,SWRST 各位都有其 *** 作功能,我列举几个我觉得比较重要的 首先看SYNC: 串口发送主要可分为异步的UART模式,和同步的SPI模式,即由SYNC来控制, SYNC:“0”UART模式 “1”SPI模式 CHAR:“0”选择字符以7位发送,不用接收缓存寄存器URXBUF或发送缓存寄器UTXBUF的最高位 “1”选择字符以8位发送 SWRST: 置位时,USART的各中断允许初始化,直至复位时USART才被允许。 发送控制寄存器UTCTL亦类似,对各个位做必要的设置就可以得到你想要的结果。UTCTL8位由高到低分别为:未用,CKPL,SSEL1,SSEL0,URXSE,TXWake,未用,TXEPT。还有接收控制寄存器URCTL0和URCTL1详情可以参照书本。 另有一个比较重要的就是波特率计算,用到UBR0及UBR1波特率寄存器以及调整控制寄存器UMCTL.具体计算为:UBR,UBR1和UBR0的16位数据 Mx ,调整器的各位数据 波特率=时钟周期/(UBR+(M7+M6+…+M0)/8) 贴上一个简单的程序: #include void main(void) { volatile unsigned int iWDTCTL = WDTPW + WDTHOLD// 关闭开门狗 P3SEL |= 0x30// P3.4,5 = USART0 TXD/RXD BCSCTL1 |= XTS// ACLK= LFXT1,LFXT1高频工作 do { IFG1 &= ~OFIFG// Clear OSCFault flag for (i = 0xFFi >0i--)// Time for flag to set } while ((IFG1 &OFIFG))// OSCFault flag still set? BCSCTL2 |= SELM_3// MCLK = LFXT1 (safe) ME1 |= UTXE0 + URXE0// Enable USART0 TXD/RXD UCTL0 |= CHAR// 8-bit character UTCTL0 |= SSEL0// UCLK= ACLK UBR00 = 0x45// UBR10 = 0x00// UMCTL0 = 0x00// 波特率计算 UCTL0 &= ~SWRST//初始USART IE1 |= URXIE0// Enable USART0 RX interrupt _BIS_SR(LPM0_bits + GIE)// Enter LPM0 w/ interrupt } #pragma vect

当你发送一串字符串给单片机的时候,430刚接收到第一个字符于是开始进行回发固定数据给串口助手,可还没发送完毕(发送需要时间,而你尽然在接收中断里发送,这样接受中断就得不到及时响应),你第二个字符串又进来了,于是出错了。(第一件事还没干完,你第二件、第三件。。。全部紧接的来了,要你,你不疯?)这里的问题是你没搞明白整个流程,这个程序框架也不好。这种情况下,你需要建立一个缓存区(FIFO),中断的任务就是把接收到的数据扔到缓存,置标志位,并立马退出!在主程序里发送数据,这样就不会导致接收无法及时响应问题(这个跟蓄水池一样的道理)

网上找一个MSP430 DS18B20的程序和UART程序,把两个程序组合一下。只是注意一下时钟是否一致。

DS18B20的程序网上很多,主要就是看你的时序,移植过来可能延时不准确,单总线器件对时序要求很严格,所以慢慢调试一下应该能出效果。 给你一个温度程序参考一下吧。

#include <msp430x14x.h>

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)

/*******************************************

函数名称:DelayNus

功能:实现N个微秒的延时

参数:n--延时长度

返回值 :无

说明:定时器A的计数时钟是1MHz,CPU主频8MHz

所以通过定时器延时能够得到极为精确的

us级延时

********************************************/

void DelayNus(uint n)

{

CCR0 = n

TACTL |= MC_1 //增计数到CCR0

while(!(TACTL &BIT0)) //等待

TACTL &= ~MC_1 //停止计数

TACTL &= ~BIT0 //清除中断标志

}

/*******************************************

函数名称:Init_18B20

功能:对DS18B20进行复位 *** 作

参数:无

返回值 :初始化状态标志:1--失败,0--成功

********************************************/

uchar Init_18B20(void)

{

uchar Error

DQ_out

_DINT()

DQ0

DelayNus(500)

DQ1

DelayNus(55)

DQ_in

_NOP()

if(DQ_val)

{

Error = 1 //初始化失败

}

else

{

Error = 0 //初始化成功

}

DQ_out

DQ1

_EINT()

DelayNus(400)

return Error

}

/*******************************************

函数名称:Write_18B20

功能:向DS18B20写入一个字节的数据

参数:wdata--写入的数据

返回值 :无

********************************************/

void Write_18B20(uchar wdata)

{

uchar i

_DINT()

for(i = 0i <8i++)

{

DQ0

DelayNus(6) //延时6us

if(wdata &0X01)DQ1

elseDQ0

wdata >>= 1

DelayNus(50) //延时50us

DQ1

DelayNus(10) //延时10us

}

_EINT()

}

/*******************************************

函数名称:Read_18B20

功能:从DS18B20读取一个字节的数据

参数:无

返回值 :读出的一个字节数据

********************************************/

uchar Read_18B20(void)

{

uchar i

uchar temp = 0

_DINT()

for(i = 0i <8i++)

{

temp >>= 1

DQ0

DelayNus(6) //延时6us

DQ1

DelayNus(8) //延时9us

DQ_in

_NOP()

if(DQ_val) temp |= 0x80

DelayNus(45) //延时45us

DQ_out

DQ1

DelayNus(10) //延时10us

}

_EINT()

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

}

/*******************************************

函数名称:ReadTemp

功能:控制DS18B20完成一次温度转换

参数:无

返回值 :测量的温度数值

********************************************/

uint Do1Convert(void)

{

uchar i

do

{

i = Init_18B20()

}

while(i)

Skip()

Convert()

for(i = 20i >0i--)

DelayNus(60000)//延时800ms以上

do

{

i = Init_18B20()

}

while(i)

Skip()

Read_SP()

return ReadTemp()

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11089230.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存