『壹』 基於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元,畢竟現在物價很貴啊!