msp430c语言如何实现ram存储区的数据读写

msp430c语言如何实现ram存储区的数据读写,第1张

MSP430C语言可以通过对RAM存储区指定地址,实现数据的读写 *** 作。例如,可以使用MOVW #value, &RAM_base,将一个值通过指令写入到RAM存储区指定的地址中;也可以使用MOVW &RAM_base, R7,将RAM存储区指定地址的值读出到R7寄存器中,实现数据的读写 *** 作。

应该不难写的,你是要做什么

我看看哈

#include <MSP430X14Xh> // 恩 头文件

void main(void) // 主函数

{

1,设置一下定时器的初始化把(定时器关闭状态) // 刚刚下在了一个430程序 里头没见定时器,这个比较尴尬

P1DIR |= SCL; //将SCL管脚(P12)设置为输出管脚 用这个管脚接超声波的控制端吧

P1DIR &= ~(SDA); //将SDA设置为输入方向 用它来接受超声波的接受信号把(超声波剩下的两个引脚是电源了)

P1OUT &= ~(SDA); //SDA管脚输出为低电平

while(1)

{

P1OUT |= SCL; //SCL管脚输出为高电平

延时20us

P1OUT &= ~(SCL); //一个20us的脉冲

2 打开定时器

while(!SDA); // 等待消息

3关闭定时器

4读定时器的数

5计算一下得出meter

if(meter>1) // 你就再随便找个引脚接蜂鸣器给她高点平好了

}

不是为了分是希望你少copy点代码 这样会比较好

}

MSP430系列16位超低功耗单品机原理与应用-----清华大学出版社

MSP430单片机应用系统开发典型实例--------------中国电力出版社

MSP430单片机实用C语言程序设计------------------人民邮电出版社

MSP430单片机C语言应用程序设计实例精讲-------电子工业出版社

再有一块MSP430学习板,有单品机基础的话,这个430只一周便练熟了

对的

你的程序是没有问题的

那就是硬件问题

ta用的是ACLK

看看你的32k晶振接了没

有没有起振

还有就是32k晶振的两个管脚是不允许接电容的

因为430的内部已经集成

还有要看看你的32k晶振的那两个管脚是否还接有其他的电路

如果实在还是不行

就换晶振试试

肯定可以解决问题的

祝你好运!

下列程序已经调好,按键显示电路可见:

>

哈哈,你还真找对人了。看看下面的

//pwm_timer_bh

#ifndef __PWM_TIMER_B

#define __PWM_TIMER_B

void TimerBInit();

void SetScale(unsigned int sc);

void SetFre(unsigned int fre);

unsigned char GoPwm(unsigned char doit);

#endif

/

文件名:pwm_timer_bc

编写者:czhang

描述:使用定时器B进行PWM输出。输出的频率和占空比由串行口发送来的指令确定。

版本: 10 2005-2-20

/

#include <MSP430x14xh>

#include "pwm_timer_bh"

#define PWM_DIR P4DIR

#define PWM_SEL P4SEL

#define PWM_OUT P4OUT

#define PWM_IN P4IN

#define PWM_IO BIT1

unsigned int iFre; //频率

unsigned int iScale; //占空比

/

初始化定时器B

/

void TimerBInit()

{

TBCTL = TBSSEL_1 + TBCLR ; //时钟源为ACLK

TBCCTL1 = OUTMOD_7; //工作在复位/置位 模式

PWM_SEL |= PWM_IO; //选择输出端口的第二功能

PWM_DIR |= PWM_IO;

}

/

设置占空比

sc:要修改的占空比值

/

void SetScale(unsigned int sc)

{

iScale=sc;

}

/

设置频率

fre:要修改的输出频率值

/

void SetFre(unsigned int fre)

{

iFre=fre;

}

/

控制PWM运行或者停止

doit:0:停止 100:运行 其它:什么都不做,只返回运行状态

返回值:运行状态。 同doit的值

/

unsigned char GoPwm(unsigned char doit)

{

TBCTL &= ~(MC0+MC1); //关闭定时器

if(doit==100)

{

TBCCR1=iScale;

TBCCR0=iFre;

TBCTL |= MC_2; //打开定时器,计数模式2

}

if((TBCTL&MC_0)==0) //判断PWM是否运行

return 0;

else

return 100;

}

1、用8除以晶振频率得到单指令周期指令的时间,然后根据这个时间计算循环次数。但是,这些计算是要花时间的,而且时间不定。如果延时时间长,这个时间或可以忽略,但是微秒级的延时,影响就很大了,所以,虽然可以,但是不实用。

2、例程:

void Clock_Init()

{

uchar i;

BCSCTL1&=~XT2OFF; //打开XT2振荡器

BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ

do{

IFG1&=~OFIFG; //清楚振荡器错误标志

for(i=0;i<100;i++)

_NOP();

}

while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待

IFG1&=~OFIFG;

}

/

程序功能:从DS1302中读出时间数据在1602液晶模块上显示

---------------------------------------------------------

拨码开关设置:将LCD位拨至ON,其余拨至OFF

测试说明:用户可以更改"gdatah"中wdata,bwdata,rwdata

三个数组中的数据,但是请注意数据格式。

根据程序中提示,设置断点观察数据。

/

#include <msp430x14xh>

#include "ds1302h"

#include "ds1302c"

#include "cry1602h"

#include "cry1602c"

#include "gdatah"

void main(void)

{

/下面六行程序关闭所有的IO口/

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 disptemp[8];

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换

disptemp[2]=0x3a; // ":"对应的编码

disptemp[5]=0x3a;

Reset_DS1302();

/测试更改和读出时间/

Set_DS1302(wdata);

Get_DS1302(rdata);

_NOP(); //在此处设置断点,观察rdata是否与wdata一致

/测试连续读写时间寄存器/

BurstWrite1302(bwdata);

BurstRead1302(brdata);

_NOP(); //在此处设置断点,观察brdata是否与bwdata一致

/测试连续读写RAM/

BurstWriteRAM(rwdata);

BurstReadRAM(rrdata);

_NOP(); //在此处设置断点,观察rrdata是否与rwdata一致

/

注释:用户在利用27~43行的程序完成测试以后,请设置好

正确的当前时间然后将这端程序屏蔽掉,重新make以后写入

CPU中,这样才能保证每次上电时CPU都从DS1302中读出正确

的当前时间送到液晶中去显示,而不会发生每次都重新改写

DS1302内部时间的问题。

/

//初始化液晶

LcdReset();

DispNchar(1,0,14,tishi);

//读取时间转换数值显示

while(1)

{

BurstRead1302(rdata);

disptemp[6] = shuzi[(rdata[0]&0xf0)>>4];

disptemp[7] = shuzi[rdata[0]&0x0f];

disptemp[3] = shuzi[(rdata[1]&0xf0)>>4];

disptemp[4] = shuzi[rdata[1]&0x0f];

disptemp[0] = shuzi[(rdata[2]&0xf0)>>4];

disptemp[1] = shuzi[rdata[2]&0x0f];

DispNchar(4,1,8,disptemp);

delay(50000);

}

}

/

程序功能:从DS1302中读出时间数据在1602液晶模块上显示

---------------------------------------------------------

拨码开关设置:将LCD位拨至ON,其余拨至OFF

测试说明:用户可以更改"gdatah"中wdata,bwdata,rwdata

三个数组中的数据,但是请注意数据格式。

根据程序中提示,设置断点观察数据。

/

#include <msp430x14xh>

#include "ds1302h"

#include "ds1302c"

#include "cry1602h"

#include "cry1602c"

#include "gdatah"

void main(void)

{

/下面六行程序关闭所有的IO口/

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 disptemp[8];

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换

disptemp[2]=0x3a; // ":"对应的编码

disptemp[5]=0x3a;

Reset_DS1302();

/测试更改和读出时间/

Set_DS1302(wdata);

Get_DS1302(rdata);

_NOP(); //在此处设置断点,观察rdata是否与wdata一致

/测试连续读写时间寄存器/

BurstWrite1302(bwdata);

BurstRead1302(brdata);

_NOP(); //在此处设置断点,观察brdata是否与bwdata一致

/测试连续读写RAM/

BurstWriteRAM(rwdata);

BurstReadRAM(rrdata);

_NOP(); //在此处设置断点,观察rrdata是否与rwdata一致

/

注释:用户在利用27~43行的程序完成测试以后,请设置好

正确的当前时间然后将这端程序屏蔽掉,重新make以后写入

CPU中,这样才能保证每次上电时CPU都从DS1302中读出正确

的当前时间送到液晶中去显示,而不会发生每次都重新改写

DS1302内部时间的问题。

/

//初始化液晶

LcdReset();

DispNchar(1,0,14,tishi);

//读取时间转换数值显示

while(1)

{

BurstRead1302(rdata);

disptemp[6] = shuzi[(rdata[0]&0xf0)>>4];

disptemp[7] = shuzi[rdata[0]&0x0f];

disptemp[3] = shuzi[(rdata[1]&0xf0)>>4];

disptemp[4] = shuzi[rdata[1]&0x0f];

disptemp[0] = shuzi[(rdata[2]&0xf0)>>4];

disptemp[1] = shuzi[rdata[2]&0x0f];

DispNchar(4,1,8,disptemp);

delay(50000);

}

}

#include <msp430x14xh>

typedef unsigned char uchar;

typedef unsigned int uint;

/宏定义/

#define DS_RST BIT7 //DS_RST = P27

#define DS_SCL BIT5 //DS_SCL = P25

#define DS_SDA BIT6 //DS_SDA = P26

#define DS_RST_IN P2DIR &= ~DS_RST

#define DS_RST_OUT P2DIR |= DS_RST

#define DS_RST0 P2OUT &= ~DS_RST

#define DS_RST1 P2OUT |= DS_RST

#define DS_SCL_IN P2DIR &= ~DS_SCL

#define DS_SCL_OUT P2DIR |= DS_SCL

#define DS_SCL0 P2OUT &= ~DS_SCL

#define DS_SCL1 P2OUT |= DS_SCL

#define DS_SDA_IN P2DIR &= ~DS_SDA

#define DS_SDA_OUT P2DIR |= DS_SDA

#define DS_SDA0 P2OUT &= ~DS_SDA

#define DS_SDA1 P2OUT |= DS_SDA

#define DS_SDA_BIT P2IN & DS_SDA

/

函数名称:delay

功 能:延时一段时间

参 数:time--延时长度

返回值 :无

/

void delay(uint time)

{

uint i;

for(i = 0;i < time;i++) _NOP();

}

/

函数名称:Reset_DS1302

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

参 数:无

返回值 :无

/

void Reset_DS1302(void)

{

DS_RST_OUT; //RST对应的IO设置为输出状态

DS_SCL_OUT; //SCLK对应的IO设置为输出状态

DS_SCL0; //SCLK=0

DS_RST0; //RST=0

delay(10);

DS_SCL1; //SCLK=1

}

/

函数名称:Write1Byte

功 能:对DS1302写入1个字节的数据

参 数:wdata--写入的数据

返回值 :无

/

void Write1Byte(uchar wdata)

{

uchar i;

DS_SDA_OUT; //SDA对应的IO设置为输出状态

DS_RST1; //REST=1;

for(i = 8; i > 0; i--)

{

if(wdata&0x01) DS_SDA1;

else DS_SDA0;

DS_SCL0;

delay(10);

DS_SCL1;

delay(10);

wdata >>= 1;

}

}

/

函数名称:Read1Byte

功 能:从DS1302读出1个字节的数据

参 数:无

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

/

uchar Read1Byte(void)

{

uchar i;

uchar rdata = 0X00;

DS_SDA_IN; //SDA对应的IO设置为输入状态

DS_RST1; //REST=1;

for(i = 8; i > 0; i--)

{

DS_SCL1;

delay(10);

DS_SCL0;

delay(10);

rdata >>= 1;

if(DS_SDA_BIT) rdata |= 0x80;

}

return(rdata);

}

/

函数名称:W_Data

功 能:向某个寄存器写入一个字节数据

参 数:addr--寄存器地址

wdata--写入的数据

返回值 :无

/

void W_Data(uchar addr, uchar wdata)

{

DS_RST0;

DS_SCL0;

_NOP();

DS_RST1;

Write1Byte(addr); //写入地址

Write1Byte(wdata); //写入数据

DS_SCL1;

DS_RST0;

}

/

函数名称:R_Data

功 能:从某个寄存器读出一个字节数据

参 数:addr--寄存器地址

返回值 :读出的数据

/

uchar R_Data(uchar addr)

{

uchar rdata;

DS_RST0;

DS_SCL0;

_NOP();

DS_RST1;

Write1Byte(addr); //写入地址

rdata = Read1Byte(); //读出数据

DS_SCL1;

DS_RST0;

return(rdata);

}

/

函数名称:BurstWrite1302

功 能:以burst方式向DS1302写入批量时间数据

参 数:ptr--指向时间数据存放地址的指针

返回值 :读出的数据

说 明:时间数据的存放格式是:

秒,分,时,日,月,星期,年,控制

7个数据(BCD格式)+1个控制

/

void BurstWrite1302(uchar ptr)

{

uchar i;

W_Data(0x8e,0x00); //允许写入

DS_RST0;

DS_SCL0;

_NOP();

DS_RST1;

Write1Byte(0xbe); // 0xbe:时钟多字节写入命令

for (i = 8; i > 0; i--)

{

Write1Byte(ptr++);

}

DS_SCL1;

DS_RST0;

W_Data(0x8e,0x80); // 禁止写入

}

/

函数名称:BurstRead1302

功 能:以burst方式从DS1302读出批量时间数据

参 数:ptr--指向存放时间数据地址的指针

返回值 :无

说 明:时间数据的存放格式是:

秒,分,时,日,月,星期,年,控制

7个数据(BCD格式)+1个控制

/

void BurstRead1302(uchar ptr)

{

uchar i;

DS_RST0;

DS_SCL0;

_NOP();

DS_RST1;

Write1Byte(0xbf); //0xbf:时钟多字节读命令

for (i = 8; i > 0; i--)

{

ptr++ = Read1Byte();

}

DS_SCL1;

DS_RST0;

}

/

函数名称:BurstWriteRAM

功 能:以burst方式向DS1302的RAM中写入批量数据

参 数:ptr--指向存放数据地址的指针

返回值 :无

说明 :共写入31个字节的数据

/

void BurstWriteRAM(uchar ptr)

{

uchar i;

W_Data(0x8e,0x00); //允许写入

DS_RST0;

DS_SCL0;

_NOP();

DS_RST1;

Write1Byte(0xfe); //0xfe:RAM多字节写命令

for (i = 31; i>0; i--) //RAM共有31个字节

{

Write1Byte(ptr++);

}

DS_SCL1;

DS_RST0;

W_Data(0x8e,0x80); //禁止写入

}

/

函数名称:BurstReadRAM

功 能:以burst方式从DS1302的RAM中读出批量数据

参 数:ptr--指向数据存放地址的指针

返回值 :无

说明 :共读出31个字节的数据

/

void BurstReadRAM(uchar ptr)

{

uchar i;

DS_RST0;

DS_SCL0;

_NOP();

DS_RST1;

Write1Byte(0xff); //0xff:RAM的多字节读命令

for (i = 31; i > 0; i--)

{

ptr++ = Read1Byte();

}

DS_SCL1;

DS_RST0;

}

/

函数名称:Set_DS1302

功 能:设置DS1302内部的时间

参 数:ptr--指向存放数据地址的指针

返回值 :无

说明 :写入数据的格式:

秒 分 时 日 月 星期 年 共7个字节

/

void Set_DS1302(uchar ptr)

{

uchar i;

uchar addr = 0x80;

W_Data(0x8e,0x00); //允许写入

for(i = 7;i > 0;i--)

{

W_Data(addr,ptr++);

addr += 2;

}

W_Data(0x8e,0x80); //禁止

}

/

名称: Get_DS1302

说明:

功能: 读取DS1302当前时间

调用: R_Data(uchar addr)

输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年

7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B

返回值: 无

/

/

函数名称:Get_DS1302

功 能:读取DS1302内部的时间

参 数:ptr--指向数据存放地址的指针

返回值 :无

说明 :读出数据的格式:

秒 分 时 日 月 星期 年 共7个字节

/

void Get_DS1302(uchar ptr)

{

uchar i;

uchar addr = 0x81;

for(i = 0;i < 7;i++)

{

ptr[i] = R_Data(addr);

addr += 2;

}

}

以上就是关于msp430c语言如何实现ram存储区的数据读写全部的内容,包括:msp430c语言如何实现ram存储区的数据读写、MSP430F149超声波测距C语言编程,距离小于1M则用蜂鸣器发出警报,距离越近,蜂鸣器声响越高。。求程序、学习MSP430单片机看什么书比较好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9724593.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存