
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单片机看什么书比较好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)