『壹』 基于MSP430单片机的简易计算器设计
这是我以前的,你可以看看:
第六页 开始:仿真+程序
http://wenku..com/view/2447d32d915f804d2b16c18e.html
『贰』 MSP430系列单片机实用C语言程序设计
啥也不说了,默默地下吧,好好学习,少年!
『叁』 基于MSP430单片机的菜单程序设计思路,以及简单示例,最好C语言程序!
我以前倒是做过,不过程序还有点问题,调时间的时候容易过界,但正常走时候就正常了。开发环境用的IAR,单片机用f149,显示用的1602的四线模式。
你自己看着改程序吧,其实我也是51上移植过去的。
悲剧了,帖不下了.我帖在我博客里了啊,自己去找吧.
主程序
__________________________分隔线____________________________________
#include <msp430x14x.h>
#include "ds1302.h"
#include "LCD1602x4_mps.h"
#define DS1302_SECOND 0x81 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE 0x83
#define DS1302_HOUR 0x85
#define DS1302_WEEK 0x8b
#define DS1302_DAY 0x87
#define DS1302_MONTH 0x89
#define DS1302_YEAR 0x8d
unsigned char DateString[11],TimeString[9],week_value[2],TempBuffer[7]; //
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;
char done,count,temp,flag,up_flag,down_flag;
//unsigned int temp_value=0,temp_max=0;temp_min=0; //温度值
void DateToStr(void) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ unsigned char Year,Month,Day,Week;
Year=rtc_getyear();
Month=rtc_getmon();
Day=rtc_getdate();
Week=rtc_getday();
if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
{
DateString[0] = '2';
DateString[1] = '0';
DateString[2] = Year/10 + '0';
DateString[3] = Year%10 + '0';
}
else
{
DateString[0] = ' ';
DateString[1] = ' ';
DateString[2] = ' ';
DateString[3] = ' ';
}
DateString[4] = '/';
if(hide_month<2)
{
DateString[5] = Month/10 + '0';
DateString[6] = Month%10 + '0';
}
else
{
DateString[5] = ' ';
DateString[6] = ' ';
}
DateString[7] = '/';
if(hide_day<2)
{
DateString[8] = Day/10 + '0';
DateString[9] = Day%10 + '0';
}
else
{
DateString[8] = ' ';
DateString[9] = ' ';
}
if(hide_week<2)
{
week_value[0] = Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
}
else
{
week_value[0] = ' ';
}
week_value[1] = '\0';
DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
}
void TimeToStr(void) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
{ unsigned char Hour,Minute,Second;
Hour=rtc_gethour();
Minute=rtc_getmin();
Second=rtc_getsec();
if(hide_hour<2)
{
TimeString[0] = Hour/10 + '0';
TimeString[1] = Hour%10 + '0';
}
else
{
TimeString[0] = ' ';
TimeString[1] = ' ';
}
TimeString[2] = ':';
if(hide_min<2)
{
TimeString[3] = Minute/10 + '0';
TimeString[4] = Minute%10 + '0';
}
else
{
TimeString[3] = ' ';
TimeString[4] = ' ';
}
TimeString[5] = ':';
if(hide_sec<2)
{
TimeString[6] = Second/10 + '0';
TimeString[7] = Second%10 + '0';
}
else
{
TimeString[6] = ' ';
TimeString[7] = ' ';
}
DateString[8] = '\0';
}
void show_time() //液晶显示程序
{
TimeToStr(); //时间数据转换液晶字符
DateToStr(); //日期数据转换液晶字符
// ReadTemp(); //开启温度采集程序
// temp_to_str(); //温度数据转换成液晶字符
LCD_PutStr(TempBuffer,25); //显示温度
LCD_PutStr(DateString,0); //显示日期
LCD_PutStr(week_value,15); //显示星期
LCD_PutStr(" Week",10); //在液晶上显示 字母 week
LCD_PutStr(TimeString,16); //显示时间
}
////////////////////////////////////////////////////////////////////////////
void outkey() //跳出调整模式,返回默认显示
{ unsigned char Second;
if (!(P1IN&BIT0))
{
count=0;
hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
Second=dataread(DS1302_SECOND);
datawrite(0x8e,0x00); //写入允许
datawrite(0x80,Second&0x7f);
datawrite(0x8E,0x80); //禁止写入
done=0;//temp_max=0;sund=1;
while(!(P1IN&BIT0));
delay_nms(2);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{
if(!(P1IN&BIT1))
{
switch(count)
{case 1:
temp=dataread(DS1302_SECOND); //读取秒数
temp=temp+1; //秒数加1
up_flag=1; //数据调整后更新标志
if((temp&0x7f)>0x59) //超过59秒,清零
temp=0;
break;
case 2:
temp=dataread(DS1302_MINUTE); //读取分数
temp=temp+1; //分数加1
up_flag=1;
if(temp>0x59) //超过59分,清零
temp=0;
break;
case 3:
temp=dataread(DS1302_HOUR); //读取小时数
temp=temp+1; //小时数加1
up_flag=1;
if(temp>0x23) //超过23小时,清零
temp=0;
break;
case 4:
temp=dataread(DS1302_WEEK); //读取星期数
temp=temp+1; //星期数加1
up_flag=1;
if(temp>0x7)
temp=1;
break;
case 5:
temp=dataread(DS1302_DAY); //读取日数
temp=temp+1; //日数加1
up_flag=1;
if(temp>0x31)
temp=1;
break;
case 6:
temp=dataread(DS1302_MONTH); //读取月数
temp=temp+1; //月数加1
up_flag=1;
if(temp>0x12)
temp=1;
break;
case 7:
temp=dataread(DS1302_YEAR); //读取年数
temp=temp+1; //年数加1
up_flag=1;
if(temp>0x99)
temp=0;
break;
default:break;
}
while(!(P1IN&BIT1));
delay_nms(2);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{
if(!(P1IN&BIT2))
{
switch(count)
{case 1:
temp=dataread(DS1302_SECOND); //读取秒数
temp=temp-1; //秒数减1
down_flag=1; //数据调整后更新标志
if((temp&0x7f)>0x59) //小于0秒,返回59秒
temp=0x59;
break;
case 2:
temp=dataread(DS1302_MINUTE); //读取分数
temp=temp-1; //分数减1
down_flag=1;
if(temp>0x59)
temp=0x59; //小于0秒,返回59秒
break;
case 3:
temp=dataread(DS1302_HOUR); //读取小时数
temp=temp-1; //小时数减1
down_flag=1;
if(temp==0x00)
temp=0x23;
break;
case 4:
temp=dataread(DS1302_WEEK); //读取星期数
temp=temp-1; //星期数减1
down_flag=1;
if(temp==0x00)
temp=0x07;
break;
case 5:
temp=dataread(DS1302_DAY); //读取日数
temp=temp-1; //日数减1
down_flag=1;
if(temp==0x00)
temp=0x31;
break;
case 6:
temp=dataread(DS1302_MONTH); //读取月数
temp=temp-1; //月数减1
down_flag=1;
if(temp==0x00)
temp=0x12;
break;
case 7:
temp=dataread(DS1302_YEAR); //读取年数
temp=temp-1; //年数减1
down_flag=1;
if(temp>0x99)
temp=0x99;
break;
default:break;
}
while(!(P1IN&BIT2));
delay_nms(2);
}
}
void Setkey()//模式选择按键
{
if(!(P1IN&BIT3))
{
count=count+1; //Setkey按一次,count就加1
done=1; //进入调整模式
while(!(P1IN&BIT3));
delay_nms(2);
}
}
void keydone()//按键功能执行
{ unsigned char Second;
if(flag==0) //关闭时钟,停止计时
{ datawrite(0x8e,0x00); //写入允许
temp=dataread(DS1302_SECOND);
datawrite(0x80,temp|0x80);
datawrite(0x8e,0x80); //禁止写入
flag=1;
}
Setkey(); //扫描模式切换按键
switch(count)
{
case 1:do //count=2,调整秒
{
outkey(); //扫描跳出按钮
Upkey(); //扫描加按钮
Downkey(); //扫描减按钮
if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x80,temp|0x80); //写入新的秒数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_sec++; //位闪计数
if(hide_sec>3)
hide_sec=0;
show_time(); //液晶显示数据
}while(count==2);break;
case 2:do //count=3,调整分
{
hide_sec=0;
outkey();
Upkey();
Downkey();
if(temp>0x60)
temp=0;
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x82,temp); //写入新的分数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_min++;
if(hide_min>3)
hide_min=0;
show_time();
}while(count==3);break;
case 3:do //count=4,调整小时
{
hide_min=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x84,temp); //写入新的小时数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_hour++;
if(hide_hour>3)
hide_hour=0;
show_time();
}while(count==4);break;
case 4:do //count=5,调整星期
{
hide_hour=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x8a,temp); //写入新的星期数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_week++;
if(hide_week>3)
hide_week=0;
show_time();
}while(count==5);break;
case 5:do //count=6,调整日
{
hide_week=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x86,temp); //写入新的日数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_day++;
if(hide_day>3)
hide_day=0;
show_time();
}while(count==6);break;
case 6:do //count=7,调整月
{
hide_day=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x88,temp); //写入新的月数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_month++;
if(hide_month>3)
hide_month=0;
show_time();
}while(count==7);break;
case 7:do //count=8,调整年
{
hide_month=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{
datawrite(0x8e,0x00); //写入允许
datawrite(0x8c,temp); //写入新的年数
datawrite(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;
}
hide_year++;
if(hide_year>3)
hide_year=0;
show_time();
}while(count==8);break;
case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态
Second=dataread(0x80);
datawrite(0x8e,0x00); //写入允许
datawrite(0x80,Second&0x7f);
datawrite(0x8E,0x80); //禁止写入
done=0; //temp_max=0;sund=1;
break; //count=7,开启中断,标志位置0并退出
default:break;
}
}
////////////////////////////////////////////////////////////////////////////
void rtcinit ()
{
rtc_wp(0);
rtc_stop(0);
rtc_charger(1,1);
}
void sysinit ()
{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P4OUT = 0xff;
P4DIR = 0xff;
P5OUT = 0x0f;
P5DIR = 0xf0;
P6OUT = 0xfc;
P6DIR = 0xfc;
}
void main ()
{ unsigned char temp;
sysinit ();
rtcinit ();
LCD_init(); //液晶初始化
_EINT();
while (1)
{
while(done==1)
keydone(); //进入调整模式
while(done==0)
{
temp=rtc_getsec();
delay_nms(10);
if(temp!=rtc_getsec())
show_time(); //液晶显示数据
flag=0;
Setkey(); //扫描各功能键
}
}
}
『肆』 用MSP430单片机设计充电器方案
高效、低成本及可靠的电池充电器设计可用各种方法来实现,但采用8 位闪速MCU 不仅能缩短设计时间、降低成本及提供安全可靠的产品,而且还能使设计人员以最少的工作量来进行现场升级。考虑到电池安全充电的成本、设计效率及重要性,基于MCU 的解决方案可为设计者们提供诸多优势。通过选择带适当外围与闪存的8 位MCU,工程师们能充分利用其优势来设计一种离线锂电池充电器。带2KB 闪存及适当外围以提供一种廉价解决方案的飞利浦 80C51 型MCU 就是这样一个例子。集成化闪存还能提供高效及方便地调试应用代码并进行现场软件升级(如果需要)的能力。由于设计界不仅熟悉而且广泛接受8 位MCU,故软硬件开发可快速进行。由众多厂商提供的各种功能强大且并不昂贵的应用开发工具,也是这种方法的另一项优势。利用这种方法,设计团队不仅能极大地缩短设计周期,而且还能进行更为复杂的设计,并使项目的整体材料费(BOM)不超出可接受的范围。
外围电路集成
譬如,当MCU 集成有内部振荡器时,离线锂电池充电器设计可从以下两方面获益。首先,可省掉外部振荡器,从而节省成本及PCB 占位;其次,内部振荡器可提高系统启动时的稳定性。四通道A/D 转换器是设计工程师们应该寻求集成到芯片中的另一种有价值的外围电路。除能比使用外部A/D 转换器更节约成本外,还能用它来检测充电电压、电流及电池温度--几乎包括安全电池充电操作中的所有重要参数。用来实现以下所介绍设计的MCU(P89LPC916)不仅集成了上述所有这些特性而且还拥有可同时在两个时钟上执行指令的高性能处理器架构,从而将其性能提高至标准80C51 器件的6 倍。Time0(计时器0)很容易被配置成PWM 输出,故易于设置及使用PWM 功能。
基本电池充电标准
本设计为专门针对额定700-750mAh 、3.6V 放电电压及4.2V 电压极限的锂电池充电器解决方案。充电顺序分成以下三个阶段:预充电阶段、恒定电流充电阶段及恒定电压充电阶段。当电池只剩下很少的电量且因此而只能产生很低的输出电压时,就必须有预充电阶段。在此情况下,必须采用低电流充电以保护电池。但如果被充电电池可产生较高电压(>3V),则可省略掉预充电阶段。当然,这是最普遍的情况。大部分电能是在恒定电流及恒定电压充电阶段从充电器流入电池。电池的最大允许充电电流由该电池的额定容量决定。对于快速充电,例如额定700mAh 的电池,可用350-400mA 电流来充电。在锂电池情况下,MCU 必须在保持电池正常充电电压的同时还监视充电电流,以在电池充满时能终止充电过程。温度监视可用来确保执行安全的充电步骤,因为随着电池充满,任何额外的电能都将被转换成热量。尽管MCU 必须为其完成的功能增加温度监视,但当今市场上的大多数锂电池都带有内置过充电保护,故温度监视尽管需要但却很少使用。
降压转换器设计
若要设计一种带锥形端接特性的充电器,最有效及最经济的方法是采用降压转换器来作为开关调整器。降压转换器使用电感来储存电能。图1a 及1b 分别为开关处于通/断位置时的降压转换器工作示意图。
图1:(a):降压转换器开关“开”;(b):降压转换器开关“关”。
来自PWM 的信号控制充电开关。当开关闭合时(图1a),电流由于充电器提供的电压(充电器Vin)而流过电路,此时电容通过电感充电。当开关打开时(如1b 所示),电感试图通过感应电压来保持电流流动,但它不能立刻充电。然后电流流过肖特基二极管并给电容充电。此过程循环往复。当通过减少PWM 占空比来缩短开关“通”时间时,平均电压减少。相反,当通过增加PWM 占空比来延长开关“断”时间时,平均电压增加。故通过控制PWM 占空比来使MCU 调整充电电压(或电流)可达到所需的输出值。在讨论设计细节以前,需先讨论与电感及
电容有关的两个要点:
1.电感大小不难看出,确定降压转换器电感的大小是达到合适充电电压及电流的关键。电感大小也与成本有关。电感容量可用公式1 来计算:公式1 其中:Vi:输入至开关的充电器电压;Vsat:开关“通”时开关的电压损失;Vo:电压输出;T:PWM 周期;DutyCycle:PWM 占空比;Io:电流输出(亦即恒定电流充电)。公式1 显示PWM 的开关频率越高(亦即开关周期T 越小),则所需的电感越小,这有助于减少器件成本。
2.电容大小还需注意的是,此电路中的电容完全是用来减少纹波电流,故越大越好,因为纹波与电容值成反比。
设计要点
本设计基于飞利浦P89LPC916 型MCU,其整体设计思想是,通过先用恒定电流充电、然后再用恒定电压充电来实现尽可能快的充电。MCU还控制用于指示充电器工作状态的LED。
1.精密电源VDD 需采用精密电压源,因为此电压被用作DA-DA 转换器的电压参考。低压降(LDO)调整器为该电压源的最佳选择,且本设计采用3 端LDO LM1117 来为VDD 提供精密3.31 V 电源。
输出解决方案Timer0(定时器0)的一个通道用来产生控制降压转换器开关的PWM 信号。由于LPC916 带有其自己的片上RC 振荡器,故充电更加稳定而有效--尤其在电压控制工作模式下。所需的PWM 频率仅大约为14kHz,故能很好地控制在片上振荡器的频率范围内。可通过改变降压转换器的“开”时间来调整PWM 占空比。
系统设计
图2 为锂电池充电器系统组成框图。其中PWM 输出控制充电开关,且其占空比可根据需要用充电电压及电流的反馈来调整。LPC916 的8 位片上高速A/D 转换器提供了监视充电电压所需的高精度。避免锂离子应用中的过充电非常重要,因为将充电保持在其最大值以内可延长电池的使用寿命。表1 为该电路的输入/输出参数规格。
表1:图2 电路的输入、输出参数规格。
下一步是计算电感值,首先必须指出的是,公式1 给出了占空比、输出电流、PWM 周期及其他变量之间的关系。电感值可通过假设Vi=5.1V、所需输出电压Vsat=0.5V(在Io=350mA 上,Vo=4.25V、所需输出电流Io=350mA 、1/T=14.7kHz 以及占空比为50%来计算)。采用以上这些值,用公式1 可计算出电感值不小于10μH。在本设计中,建议电感值为33-10μH 。尽管可以采用大于5.1V 的输入电压,但更高的输入电压要求采用更高频率的PWM 或更大的电感,从而使器件成本提高。
图2:由LPC916 控制的锂电池充电器解决方案
锂电池应以三个独立的阶段来充电。如果电池电压低于3V,则需要有预充电阶段且充电电流应保持为65mA。一旦电池电压达到3V+-1% ,即开始进入快速充电阶段,并采用350mA 的恒定充电电流。通过调整控制脉冲可使充电电流保持恒定。当电池电压达到4V+-1% 时,即开始接恒定电压充电阶段。此时电压被保持在4.23V,充电电流处于监视下。
在恒定电压充电阶段之后,电池被另外再充电50 分钟,同时保持充电电流小于30mA。充电时间可用一个计时器来控制,但监视充电终结的方法有三种:检测充电电流、使用计时器以及监视温度(可选)。
图3:锂电池充电过程
充电过程如图3 所示。从一个阶段进入到另一个阶段的准确标志如下:预充电阶段(当需要时):如果Vbat<3.0(1%,则设置Iout=10%;Ireg=65mA ;快速充电阶段(恒定电流充电):当Vbat<=4.00+-1%V 时,设置Iout=Ireg=350mA;计时器控制充电阶段(恒定电压充电):当Ibat<60mA 时,设置Vout=Vreg=4.23V(50 分钟)以保证电池充分充电,但使充电电流小于30mA。充电在4 小时内完成。考虑到最终用户,设计中采用了LED 状态指示灯,以提供有关充电序列状态的信息。
设计方案的测试
可用来在充电过程中测试该设计的电路框图如图4 所示。用两块万用表来测量Vout 及Vsense_res 读数。Vout=Vbat+Vsense_res ,充电电流可用公式Iout=Vsense res/0.75 来计算。
图4:测试电路
当充电开始时,每15 秒记录一次数据,但当电流及电压稳定后,记录周期可缩短为每5 秒记录一次。结果可能会随不同电池的化学特征而变化,而且电池的起始电压也对结果有影响。图5 及图6 显示该设计满足指标。
图5:输出电压测试结果
图6:输出电流测试结果
『伍』 求高手指点菜鸟MSP430的毕业论文怎么下手
确定用那一款430,比如1系列,2系列,更确切现在用的多的msp430f449,然后买单片机,做最小系统,然后按照毕业设计要求焊接硬件电路,然后调试程序,然后写论文。
当然最先还是要先看懂430资料,怎么样使用,怎么样编程==
『陆』 急求本人毕业设计:基于msp430单片机的照明控制系统,有完整资料的给高分
有1楼帮你,那我就不说了...这个其实和交通灯差不了太多,恕我直言,LZ看来大学白念了!
『柒』 MSP430单片机设计 整形计算器
基于单片机智能充电器设计我给 几份写
『捌』 正在做毕业设计,之前有前辈用MSP430单片机完成的,但我想换一个片子,有没有和它作用相同可以取代的
要看你需要实现些什么功能、要满足什么样的性能指标。
如果只是些简单的控制、采集之类,那么替代起来非常容易。
『玖』 帮忙翻译两段程序,关于msp430的单片机的,本人没学过单片机,毕设急用
不知道你要怎么翻译,是英文翻译成中文还是中文翻译成英文?
还是解释代码的意思?
需要解释的每一句代码,相关的解释如下.(有些是几行代码一句解释的)
第一段
void SP10_Init(void)
{
UCTL0=CHAR+SYNC+MM+SWRST; //8-bit SPI Master 设置SPI为主机模式
UTCTL0=CKPH+SSE0+STC; //ACLK,3-pin mode
UBR00=0x02; //ACLK/2
UBR10=0x00; //0 设置SPI的传输速度
UMCTL0=0x00; //no molation
P3SEL|=0x0E; //P3.l-3SPI option select 设置这三个引脚用作SPI传输
P3DRI|=0x0l; //p3.0 out put driection 设置这三个引脚为输出方向
MEI|=USPIE0+UTXE0; //Enbale USART0 SPI mode
使能USART0的SPI
UCTL0&=~SWRST; //SPI enbale
使能SPI功能
USART_RX_COUNT=0;}
接收计数器清零
第二段
void Config905(void)
{
char setup[11];
定义setup数组(用来存储SPI接收的设置相关值)
int i;
定义变量i
setup[0]=0x00;
将0x00写入setup[0]
setup[1]=CH_NO_BYTE; //中心频率低8位
setup[2]=PA_PWR_10dBm|HFREQ_PLL_433MHz; //发射+l0Bdm,发射频率433MHz,中心频率第9位=0
setup[3]=TX_AFW_4BYTE|RX_AFW_4BYTE; //接收地址宽度4字节,发送地址宽度4字节
setup[4]=RX_PW_32BYTE; //接受数据宽度32字节
setup[5]=TX_PW_32BYTE; //发送数据宽度32字节
setup[6]=RX_ADDRESS_0; //接收有效地址第1字节
setup[7]=RX_ADDRESS_1; //接收有效地址第2字节
setup[8]=RX_ADDRESS_2; //接收有效地址第3字节
setup[9]=RX_ADDRESS_3; //接收有效地址第4字节
setup[10]=CRC16_EN|XOF_16MHz; //CRC16模式使能,晶体16MHz
RF_PWRUP;
DELAY(30000);
调用延时函数,延时
nRF_WAIT_SPI; //start to configure
启动SPI配置
DELAY(200);
延时
CSN_UP;
DELAY(200);
延时
CSN_DOWN;
下面的为发送代码,循环发送数据,直到发送完
while((U0IFG&UTXIFG0)=0); //wait until UTXIFG=l,reday for tx
for(i=0;i<11:i++)
{
TXBUF0=setup[i];
while((U0IFG&UTXIFG0)=0);
}
while((U0FIG&UTXIFG0)=0); //wait until TX complete
DELAY(200);
CSN_UP;
}
『拾』 msp430超低功耗单片机 设计一个单片机简易电子表
别想着人家免费拱手送给你,至少给出点诚意嘛……比如RMB10000元,毕竟现在物价很贵啊!