⑴ 用C語言編寫程序使MSP430單片機實現數字時鍾(顯示年月日,時分秒,最好也能顯示星期)
我以前倒是做過,不過程序還有點問題,調時間的時候容易過界,但正常走時候就正常了。開發環境用的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單片機 的一段程序!!!!
這個是哪個系列的單片機,給具體型號?
你用的是什麼編譯器?
我在MSPX13X,MSPX14X,MSPX14X1裡面都找不到你上面寫的這樣的寄存器,你最好把原始的寄存器名稱貼上來,否則愛莫能助。
⑶ msp430控制max262,做低通濾波器
5Hz還不如電容電阻搭一個電路,用這個晶元的效果不會很好
⑷ MSP430的編程,明明是例子,為什麼有error……大俠幫忙啊~謝謝啊~!!!!找出問題追加分~拜託拜託了~
應該是你程序的RAM空間不夠。。 能用Uint的 就不要用INT 能用char的就不要用INT
⑸ 關於MSP430的中斷函數服務程序
你在主函數里邊把串口中斷和總中斷打開就是了,它自己進去.也是就是硬體提供中斷請求,然後cpu響應,然後從中斷向量表查出相關的入口地址,就進去了.
⑹ 求單片機msp430x14x config.h頭文件
config.h 430單片機頭文件代碼最後的復制代碼保存到電腦的方式實現下載:
/********************************************************************
//msp430單片機最小系統板外部資源配置文件Config.h
//包含板載各個資源的硬體配置,如果用戶使用過程中,對應的硬體發生了更改,可利用該頭文件更改使用
//SD/MMC卡初始化硬體配置未包含
//調試環境:EW430 V5.30
//時間:2014.03.01
********************************************************************/
//延時函數,IAR自帶,經常使用到
#define CPU_F ((double)8000000) //外部高頻晶振8MHZ
//#define CPU_F ((double)32768) //外部低頻晶振32.768KHZ
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//自定義數據結構,方便使用
#define uchar unsigned char
#define uintunsigned int
#define ulong unsigned long
//8個LED燈,連接在P6口,可通過斷開電源停止使用,ADC使用時斷開電源
#define LED8DIR P6DIR
#define LED8 P6OUT //P6口接LED燈,8個
//4個獨立按鍵連接在P10~P13
#define KeyPort P1IN //獨立鍵盤接在P10~P13
//串口波特率計算,當BRCLK=CPU_F時用下面的公式可以計算,否則要根據設置加入分頻系數
#define baud 9600 //設置波特率的大小
#define baud_setting (uint)((ulong)CPU_F/((ulong)baud))//波特率計算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位
//RS485控制管腳,CTR用於控制RS485處於收或者發狀態
#define RS485_CTR1 P5OUT |= BIT2; //控制線置高,RS485發送狀態
#define RS485_CTR0 P5OUT &= ~BIT2; //控制線置低,RS485接收狀態
//2.8寸TFT彩屏顯示控制相關硬體配置
#define RS_CLR P5OUT &= ~BIT5 //RS置低
#define RS_SET P5OUT |=BIT5 //RS置高
#define RW_CLR P5OUT &= ~BIT6 //RW置低
#define RW_SET P5OUT |=BIT6 //RW置高
#define RD_CLR P5OUT &= ~BIT7 //E置低
#define RD_SET P5OUT |=BIT7 //E置高
#define CS_CLR P5OUT &= ~BIT0 //CS置低
#define CS_SET P5OUT |=BIT0 //CS置高
#define RST_CLR P5OUT &= ~BIT3 //RST置低
#define RST_SET P5OUT |=BIT3 //RST置高
#define LE_CLR P5OUT &= ~BIT1 //LE置低
#define LE_SET P5OUT |=BIT1 //LE置高
//2.8寸TFT彩屏觸摸屏控制相關硬體配置
#define PEN_CLR P2OUT &= ~BIT0 //PEN置低,觸碰觸摸屏時,Penirq引腳由未觸摸時的高電平變為低電平
#define PEN_SET P2OUT |=BIT0 //PEN置高
#define PEN (P2IN & 0x01) //P2.0輸入的值
#define TPDO_CLR P2OUT &= ~BIT1 //TPDO置低
#define TPDO_SET P2OUT |=BIT1 //TPDO置高
#define TPDOUT ((P2IN>>1)&0x01) //P2.1輸入的值
#define BUSY_CLR P2OUT &= ~BIT3 //BUSY置低
#define BUSY_SET P2OUT |=BIT3 //BUSY置高
#define TPDI_CLR P2OUT &= ~BIT4 //TPDI置低
#define TPDI_SET P2OUT |=BIT4 //TPDI置高
#define TPCS_CLR P2OUT &= ~BIT5 //TPCS置低
#define TPCS_SET P2OUT |=BIT5 //TPCS置高
#define TPCLK_CLR P2OUT &= ~BIT6 //TPCLK置低
#define TPCLK_SET P2OUT |=BIT6 //TPCLK置高
//彩屏/12864液晶/1602液晶的數據口,三液晶共用
#define DataDIR P4DIR //數據口方向
#define DataPort P4OUT //P4口為數據口
//12864/1602液晶控制管腳
#define RS_CLR P5OUT &= ~BIT5 //RS置低
#define RS_SET P5OUT |=BIT5 //RS置高
#define RW_CLR P5OUT &= ~BIT6 //RW置低
#define RW_SET P5OUT |=BIT6 //RW置高
#define EN_CLR P5OUT &= ~BIT7 //E置低
#define EN_SET P5OUT |=BIT7 //E置高
#define PSB_CLR P5OUT &= ~BIT0 //PSB置低,串口方式
#define PSB_SET P5OUT |=BIT0 //PSB置高,並口方式
#define RST_CLR P5OUT &= ~BIT1 //RST置低
#define RST_SET P5OUT |= BIT1 //RST置高
//12864應用指令集
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值為00H
#define AC_INIT0x02 //將AC設置為00H。且游標移到原點位置
#define CURSE_ADD 0x06 //設定游標移到方向及圖像整體移動方向(默認游標右移,圖像整體不動)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //顯示開,顯示游標,且游標位置反白
#define DISPLAY_OFF 0x08 //顯示關
#define CURSE_DIR 0x14 //游標向右移動:AC=AC+1
#define SET_CG_AC 0x40 //設置AC,范圍為:00H~3FH
#define SET_DD_AC 0x80 //設置DDRAM AC
#define FUN_MODEK 0x36 //工作模式:8位擴展指令集
//顏色代碼,TFT顯示用
#define White 0xFFFF //顯示顏色代碼
#define Black 0x0000
#define Blue 0x001F
#define Blue2 0x051F
#define Red 0xF800
#define Magenta 0xF81F
#define Green 0x07E0
#define Cyan 0x7FFF
#define Yellow 0xFFE0
//NRF2401模塊控制線
#defineRF24L01_CE_0 P1OUT &=~BIT5 //CE在P15
#defineRF24L01_CE_1 P1OUT |= BIT5
#defineRF24L01_CSN_0 P2OUT &=~BIT7 //CS在P27
#defineRF24L01_CSN_1 P2OUT |= BIT7
#defineRF24L01_SCK_0 P3OUT &=~BIT3 //SCK在P33
#defineRF24L01_SCK_1 P3OUT |= BIT3
#defineRF24L01_MISO_0 P3OUT &=~BIT2 //MISO在P32
#defineRF24L01_MISO_1 P3OUT |= BIT2
#defineRF24L01_MOSI_0 P3OUT &=~BIT1 //MOSI在P31
#defineRF24L01_MOSI_1 P3OUT |= BIT1
#defineRF24L01_IRQ_0 P1OUT &=~BIT4 //IRQ在P14
#defineRF24L01_IRQ_1 P1OUT |= BIT4
//DS18B20控制腳,單腳控制
#define DQ_IN P1DIR &= ~BIT7 //設置輸入,DS18B20接單片機P53口
#define DQ_OUT P1DIR |= BIT7 //設置輸出
#define DQ_CLR P1OUT &= ~BIT7 //置低電平
#define DQ_SET P1OUT |= BIT7 //置高電平
#define DQ_R P1IN & BIT7 //讀電平
//紅外接收頭H1838控制腳,單腳控制
#define RED_IN P1DIR &= ~BIT6 //設置輸入,紅外接收頭接單片機PE3口
#define RED_OUT P1DIR |=BIT6 //設置輸出
#define RED_L P1OUT &= ~BIT6 //置低電平
#define RED_H P1OUT |= BIT6 //置高電平
#define RED_R (P1IN & BIT6) //讀電平
//***********************************************************************
// 系統時鍾初始化,外部8M晶振
//***********************************************************************
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;
}
//***********************************************************************
// 系統時鍾初始化,內部RC晶振
//***********************************************************************
void Clock_Init_Inc()
{
uchar i;
// DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO
// BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL
DCOCTL = 0x60 + 0x00; //DCO約3MHZ,3030KHZ
BCSCTL1 = DIVA_0 + 0x07;
BCSCTL2 = SELM_2 + DIVM_0 + SELS + DIVS_0;
}
//***********************************************************************
// 系統時鍾初始化,外部32.768K晶振
//***********************************************************************
void Clock_Init_Ex32768()
{
uchar i;
BCSCTL2|=SELM1 + SELM0 + SELS; //MCLK為32.768KHZ,SMCLK為8MHZ
do{
IFG1&=~OFIFG; //清楚振盪器錯誤標志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果標志位1,則繼續循環等待
IFG1&=~OFIFG;
}
//***********************************************************************
// MSP430內部看門狗初始化
//***********************************************************************
void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //關閉看門狗
}
⑺ 使用MSP430,我想使用為ACLK,頻率為12KHZ作為外圍模塊時鍾。但是程序不能運行,哪位幫忙看下
你是想輸出時鍾嗎?我貼一個TI常式給你看看,希望有幫助,還有就是430F149 aclk的輸出引腳一般是p5.6,你參考晶元引腳進行改進比較好
//******************************************************************************
// MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK
//
// Description: Output buffered MCLK, SMCLK and ACLK.
// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2
// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//
// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//
//
// MSP430F149
// -----------------
// /|\| XIN|-
// | | | 32k
// --|RST XOUT|-
// | |
// | XT2IN|-
// | | XTAL (455k - 8Mhz)
// |RST XT2OUT|-
// | |
// | P5.4|-->MCLK = DCO Max
// | P5.5|-->SMCLK = XT2
// | P5.6|-->ACLK = 32kHz
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer
DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO
BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL
BCSCTL2 |= SELS; // SMCLK = XT2
P5DIR |= 0x70; // P5.6,5,4 outputs
P5SEL |= 0x70; // P5.6,5,5 options
while(1)
{
}
}
⑻ 求msp430單片機基於max262的濾波程序
#include"msp430fg4618.h"
#definea0BIT0
#definea1BIT1
#definea2BIT2
#definea3BIT3
#defined0BIT4
#defined1BIT5
#definewrBIT6
#definectrlportP5OUT
//addr的取值范圍0-15,dat的取值范圍0-3
voidmax262writedat(ucharaddr,uchardat)
{
ctrlport=addr+dat*16;
delay_us(5);
ctrlport|=wr;
delay_us(10);
}
//mode=M1M0,q=Q6Q5Q4Q3Q2Q1Q0,ratio=F5F4F3F2F1F0
voidmax262setA(ucharmode,ucharq,ucharratio)
{
max262writedat(0,mode-1);
max262writedat(4,q&0x03);//Q1Q0
max262writedat(5,(q>>2)&0x03);//Q3Q2
max262writedat(6,(q>>4)&0x03);//Q5Q4
max262writedat(7,(q>>6)&0x03);//Q6
max262writedat(1,ratio&0x03);//F1F0
max262writedat(2,(ratio>>2)&0x03);//F3F2
max262writedat(3,(ratio>>4)&0x03);//F5F4
}
voidmax262setB(ucharmode,ucharq,ucharratio)
{
max262writedat(8,mode-1);
max262writedat(12,q&0x03);//Q1Q0
max262writedat(13,(q>>2)&0x03);//Q3Q2
max262writedat(14,(q>>4)&0x03);//Q5Q4
max262writedat(15,(q>>6)&0x03);//Q6
max262writedat(9,ratio&0x03);//F1F0
max262writedat(10,(ratio>>2)&0x03);//F3F2
max262writedat(11,(ratio>>4)&0x03);//F5F4
}
//初始化後濾波器A和B的參數:mode3(LP,BP,HP),Q=1,fclk/f0=40.84
voidmax262init()
{
P5DIR=0xff;
ctrlport=0x00;
max262setA(3,64,0);
max262setB(3,64,0);
}
⑼ MSP430中__enable_interrupt()實現函數在哪裡,怎麼看不到
1)$(_WINCEROOT)\PLATFORM\smdk2410\DRIVERS\PWRBTN文件夾下面的三個文件pwrbtn2410.c、 pwrbtn2410.h和pwrbtn2410.def,這個PowerButton驅動是通過流驅動實現的,實現的過程很簡單,下面會詳細說明。
2)$(_WINCEROOT)\PLATFORM\smdk2410\INC\oalintr.h,定義非內核模式的中斷號( non-kernel interrupt identifiers )
3)$(_WINCEROOT)\PLATFORM\smdk2410\KERNEL\HAL\cfw.c,這裡面主要實現了 OEMInitInterrupts、OEMInterruptEnable、OEMInterruptDisable、 OEMInterruptDone這幾個重要的中斷函數。
4)$(_WINCEROOT)\PLATFORM\smdk2410\KERNEL\HAL\ARM\armint.c,這里主要實現了OEMInterruptHandler這個中斷處理函數。
下面我簡單分析一下中斷處理過程。
a) 首先你為自己的硬體(鍵盤,按鍵等需要使用的中斷)定義一個中斷名稱,比如這個電源按鍵就起了一個中斷名稱SYSINTR_POWER,然後在oalintr.h裡面把它定義成SYSINTR_FIRMWARE+n的形式
比如: #define SYSINTR_POWER (SYSINTR_FIRMWARE+13)
n必須小於SYSINTR_MAXUMUM or SYSINTR_FIRMWARE+23