久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5119|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

從別處下載的,希望對學(xué)習(xí)430有用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:62022 發(fā)表于 2014-11-15 18:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本章選擇了一些簡單的C語言程序例題,這些程序的結(jié)構(gòu)簡單,編程技巧不多,項目雖然
簡單,但是非常適合入門單片機(jī)的學(xué)習(xí)者學(xué)習(xí)MSP430單片機(jī)的C 語言編程。
如下列出了C語言例題運行的MSP430F149實驗板硬件資源環(huán)境,熟悉這些硬件資源,對
于理解程序非常重要。
(1)數(shù)碼管:
左側(cè)數(shù)碼管與P5口相連,a~g,h對應(yīng)P5.0~P5.7
右側(cè)數(shù)碼管與P4口相連,a~g,h對應(yīng)P4.0~P4.7
(2)發(fā)光二極管
8 個發(fā)光二極管與P3 口連接
(3)按鈕:
左側(cè)8個按鈕與P2口相連,引腳號標(biāo)在按鈕上方
右側(cè)8個按鈕與P1口相連,引腳號標(biāo)在按鈕上方
(4)P2.3引腳還是模擬比較器輸入
(5)P6.0,P6.1引腳連接模擬量電位器,用于模擬量實驗

9.1  通過 C 語言編程例入門 MSP430C 語言編程

  如下例子都在MSP430F149實驗板上通過驗證。
  例1:使與P3口的P3.0引腳連接的發(fā)光二極管閃爍。
#include <msp430x14x.h>  //聲明庫
void main(void)  //主函數(shù)
{
unsigned int i;  //變量聲明
WDTCTL=WDTPW+WDTHOLD; //關(guān)掉看門狗
P3DIR |=BIT0; //設(shè)置P3.0為輸出,這里BIT0=0x0001
while(1) //無限次while循環(huán)
{
for(i=0;i<20000;i++) //for語句,i為循環(huán)變量,i每次循環(huán)加1,當(dāng)i<20000時,
  //循環(huán)延時
P3OUT=0x00; //使P3.0輸出低電平,發(fā)光二極管亮,(低電平使發(fā)光二極管亮)
for(i=0;i<20000;i++) //再次循環(huán)延時
P3OUT=0x01;//使P3.0輸出高電平,發(fā)光二極管滅,(高電平使發(fā)光二極管滅)
}
}
  例2:8個發(fā)光二極管 1、3、5、7與 2、4、6、8交替發(fā)光的例子
#include <msp430x14x.h>  
void main(void)
{
unsigned int i;
WDTCTL=WDTPW+WDTHOLD;
P3DIR=0XFF; //設(shè)置P3口為輸出
while(1)
{
for(i=0;i<20000;i++)
P3OUT=0X55; //使發(fā)光二極管1、3、5、7 滅,2、4、6、8亮
for(i=0;i<20000;i++)
P3OUT=0XAA;//使發(fā)光二極管1、3、5、7亮,2、4、6、8滅
}
}
  例 3:定時器控制的發(fā)光二極管閃爍。這里使用了 MSP430F149芯片的 32768Hz低頻晶體振蕩器作為時鐘
源。用定時器 A定時 1s,發(fā)光二極管滅 0.5s,亮.0.5s。
#include <msp430x14x.h>
void main (void)
{
WDTCTL= WDTPW + WDTHOLD; //設(shè)置看門狗控制寄存器,關(guān)看門狗
TACTL = TASSEL0 + TACLR; // 設(shè)置定時器A控制寄存器,
  //TASSEL0=0x0100,選擇輔助時鐘ACLK,
  //TACLR=0x0004,清除定時器A計數(shù)器
CCTL0 = CCIE;  //設(shè)置捕獲/比較控制寄存器,CCIE=0x0010,使能捕獲比較中斷
CCR0 =16384;  //設(shè)置捕獲/比較寄存器,初始值為16384,對于32768Hz的頻率,相當(dāng)于0.5s
P3DIR |=BIT7; //P3.7為輸出
TACTL |= MC0; //設(shè)置定時器A控制寄存器,MC0=0x0010,使計數(shù)模式為增計數(shù)
_EINT(); //使能中斷,這是一個C編譯器支持的內(nèi)部過程。
while(1); //無限次while循環(huán)
}

interrupt[TIMERA0_VECTOR] void Timer_A(void) //定時器A的CC0中斷處理程序
//TIMERA0_VECTOR=6*2,等于基地址0xFFE0+12=0xFFEC
{
P3OUT ^= BIT7; //將P3.7引腳取反,就是使發(fā)光二極管閃爍
}

例 4:選擇不同的時鐘源,使 P3.7 連接的發(fā)光二極管閃爍。
(1)使用 XT2時鐘源,8MHz頻率,用定時器 A分頻,產(chǎn)生 1s脈沖,使 P3.7引腳的發(fā)光二極管閃爍。
#include <msp430x14x.h>
#define XTOFF 0x40;  
void main (void)
{
WDTCTL= WDTPW + WDTHOLD; //關(guān)閉看門狗
BCSCTL1 &= ~XT2OFF;  //基礎(chǔ)時鐘控制寄存器BCSCTL1的第7位置0,使XT2啟動
BCSCTL2 = SELS + DIVS1 + DIVS0; //基礎(chǔ)時鐘控制寄存器BCSCTL2設(shè)置,第3位置1,選擇
//XT2CLK作為SMCLK時鐘;將第2和第1位置1,使分頻比為8
TACTL =0x02D4;
  //定時器A控制寄存器設(shè)置,第2位置1:清除;第4、5位置1、0:加計數(shù)模式
  //加計數(shù)至CCR0,然后重新開始;第6、7位1、1,所以是8分頻;第8、9位是
//0、1,所以TA使用SMCLK時鐘。
CCTL0 = CCIE;  //CCIE=0x0010,使能定時器A中斷
CCR0 =62500;  //設(shè)置計數(shù)器CCR0的初值,((8MHz/8)/8)/2=62500,相當(dāng)于0.5s的時間
P3DIR |=BIT7; //將P3.7設(shè)置為輸出
_EINT(); //調(diào)用C430編譯器內(nèi)部函數(shù),使能中斷
while(1); //無限次循環(huán)
}
interrupt[TIMERA0_VECTOR] void Timer_A(void)  //定時器A中斷函數(shù)
{
P3OUT ^= BIT7; //P3.7位取反
}
(2)使用32768Hz晶體產(chǎn)生1s信號的程序如下:
#include <msp430x14x.h>
void main (void)
{
WDTCTL= WDTPW + WDTHOLD;
TACTL =TASSEL0+TACLR+MC0;  
CCTL0 = CCIE;
CCR0 =16384;
P3DIR |=BIT7;
_EINT();
while(1);
}
interrupt[TIMERA0_VECTOR] void Timer_A(void)
{
P3OUT ^= BIT7;
}
(3)看門狗使輸出 P3.7 引腳連接的發(fā)光二極管每秒閃爍一次的例子:
#include <msp430x14x.h>
void main (void)
{
WDTCTL= WDTPW + WDTTMSEL+WDTSSEL;
IE1|=WDTIE;
P3DIR |=BIT7;
_EINT();
while(1);
}
interrupt[WDT_VECTOR] void WDT_interrupt(void)
{
P3OUT ^= BIT7;
}
  例 5:  P4和 P5輸出口連接的數(shù)碼管顯示 1和 2。
#include <msp430x14x.h>
void main(void)
{
unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//定義七段譯碼的共陽數(shù)碼管顯示數(shù)組
// hgfg dcba
//0=1100 0000
//1=1111 1001
//2=1010 0100
//……
//9=1001 0000
WDTCTL=WDTPW+WDTHOLD; //關(guān)閉看門狗,以便于調(diào)試
P4DIR=0XFF; //設(shè)置P4口為輸出
P5DIR=0XFF;//設(shè)置P5口為輸出
P4OUT=seg[1];//向P4口輸出數(shù)組的第1個元素,數(shù)字1的段碼
P5OUT=seg[2];//向P5口輸出數(shù)組的第2個元素,數(shù)字2的段碼
}
    例6:與 P5 口連接的數(shù)碼管加 1計數(shù),與 P4口相連的數(shù)碼管顯示數(shù)字8。
#include <msp430x14x.h>
void main(void)
{
  inti,x; //聲明數(shù)據(jù)類型
unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
WDTCTL=WDTPW+WDTHOLD;//關(guān)看門狗
P4DIR=0XFF; //P4口為輸出,連接有共陽極數(shù)碼管
P5DIR=0XFF; //P5口為輸出,連接有共陽極數(shù)碼管
P4OUT=seg[8]; //P4輸出數(shù)字8
P5OUT=seg[0]; //P5輸出數(shù)字0
while(1)  //無限次While循環(huán)
  {
for(i=0;i<=9;i++) //循環(huán)變量I從0到9循環(huán)
for(x=0;x<20000;x++) //沒有循環(huán)體的for循環(huán),用于延遲時間
P5OUT=seg; //按照循環(huán)變量i的數(shù)值,取出相應(yīng)的數(shù)組元素
  }
}
例7:使用定時器輸出精確的秒信號。從0開始計時,數(shù)碼管顯示0~60秒,每隔10秒使數(shù)碼管
更換顯示,并順序點亮發(fā)光二極管。
#include <msp430x14x.h>
#define XTOFF 0x40;
unsigned int i=0,j=0; //聲明數(shù)據(jù)類型
unsigned charseg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  //數(shù)碼管字型碼數(shù)組
unsigned intbit[8]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080};
   //發(fā)光二極管點亮順序數(shù)組
void main (void)  
{
WDTCTL= WDTPW + WDTHOLD; //關(guān)看門狗
TACTL = TASSEL0 + TACLR; // 設(shè)置定時器A控制寄存器,
  //TASSEL0=0x0100,選擇輔助時鐘ACLK(32kHz)
  //TACLR=0x0004,清除定時器A計數(shù)器
CCTL0 = CCIE; //使能定時器A捕捉與中斷功能,CCIE=0x0010
CCR0 =32768;  // 設(shè)置計數(shù)器CCR0初值
TACTL |= MC0; //設(shè)置定時器工作模式為加計數(shù)到CCR0初值
P3DIR = 0XFF; //P3口為輸出
P4DIR = 0XFF; //P4口為輸出
P5DIR = 0XFF; //P5口為輸出
P3OUT = 0X7E; //P3口輸出為0111 1110
_EINT(); 調(diào)用C430編譯器內(nèi)部函數(shù)使能中斷
while(1); //沒有循環(huán)體的無限次while循環(huán)
}
interrupt[TIMERA0_VECTOR] void Timer_A(void) //定時器A的中斷函數(shù)
{
i+=1; i每次循環(huán)加1
if (i==10) //如果i=1
  {
i=0;  //使i=0
j+=1; j每次加1
P3OUT ^= bit[j]; //數(shù)組的第j個元素取反后從P3口輸出,使發(fā)光二極管順序點亮
  if(j==6)  //如果j=6
{  
j=0; 使j=0
  }
  }
P4OUT =seg_7;//數(shù)碼管字型數(shù)組中取第i個元素,送到P4口輸出
P5OUT = seg_7[j]; //數(shù)碼管字型數(shù)組中取第j個元素,送到P5口輸出
}
例8:連接在P1.0 口的按鍵控制數(shù)碼管顯示數(shù)值,數(shù)碼管顯示按動次數(shù)。
#include <msp430x14x.h> //聲明庫文件
char Key_Pressed(void); //聲明被調(diào)用函數(shù)
void main(void)  
{  
unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  //共陽數(shù)碼管字型碼數(shù)組
unsigned int i=0; //聲明數(shù)據(jù)類型
WDTCTL = WDTPW + WDTHOLD; //關(guān)看門狗  
P1DIR &= ~BIT0; //P1.0引腳設(shè)置成輸入,該引腳連接的按鍵按下時,按鍵輸出低電平
P4DIR =0xff;    //P4口設(shè)置為輸出,連接共陽數(shù)碼管
P4OUT=seg[8];  //P4口輸出數(shù)字8
while (1) //無限次while循環(huán)
  {
if(Key_Pressed()) //調(diào)用按鍵函數(shù),如果按鍵函數(shù)返回1,

Page 6 of 21
基于模擬前端信號處理與控制技術(shù)的專業(yè)論壇、網(wǎng)站
P4OUT=seg[i++]; // 則數(shù)碼管字型數(shù)組下標(biāo)加1,選擇相應(yīng)的七段字型從
  //P4口輸出
  if(i>9) //如果i大于9,則使i=0
  i=0;
  }
}
char Key_Pressed(void) //按鍵函數(shù)
  {
unsigned int i;  //聲明變量i
while(!(P1IN&BIT0));//當(dāng)P1輸入寄存器P1IN的第0位為0時,開始while循環(huán)
for(i=0;i<8000;i++);//延時一段時間,消除按鍵抖動
  if(!(P1IN&BIT0)) //如果P1輸入寄存器P1IN的第0位還是0,則返回1,表示按鍵按下
return 1;
else  //否則認(rèn)為按鍵未按下,返回0
return 0;
  }
   例9:將P6口輸入的模擬電壓AD轉(zhuǎn)換后,從P4、P5口連接的數(shù)碼管輸出。
  使用AD單通道多次轉(zhuǎn)換,采集P6.0輸入的模擬電壓值(變化范圍:0~3.3V),轉(zhuǎn)換為數(shù)字量。
建立二維數(shù)組和通過順序查表的方法得出采集回來的電壓值。然后通過數(shù)碼管顯示當(dāng)前電壓值,顯
示跟隨輸入的模擬電壓的變化。由于只有兩位數(shù)碼管,故顯示電壓值精確到小數(shù)點后一位,如當(dāng)前
輸入電壓2.37V,則顯示2.4V。可用萬用表檢測顯示是否準(zhǔn)確。
#include "msp430x14x.h"      聲明庫
void Init(void);//聲明初始化函數(shù)
interrupt [ADC_VECTOR]void ADC12(void); //聲明AD轉(zhuǎn)換中斷函數(shù)
unsigned int Result;  聲明變量
unsigned int Table[4][10] = { {0x040,0x0BC,0x138,0x1B4,0x230, 0x2AC , 0x328 , 0x3A4 , 0x420 ,0x49C},
  {0x518 , 0x594 , 0x610 , 0x68C ,0x708 , 0x784 , 0x800, 0x87C ,0x8F8,0x974    },
  {0x9F0 , 0xA6C , 0xAE8 , 0xB64 , 0xBE0 , 0xC5C , 0xC08 , 0xD54 , 0xDD0,0xE4C },
     { 0xEC8 , 0xF44 , 0xFC0 , 0xFFF } };
//該數(shù)組元素用于與AD轉(zhuǎn)換的電壓數(shù)值相比較,如果某個數(shù)組元素稍大于等于AD轉(zhuǎn)換后的電壓數(shù)
//值,則將此元素輸出
void main(void)  //主函數(shù)
{ P4DIR = 0XFF; //P4口設(shè)置為輸出
P5DIR = 0XFF; //P5口設(shè)置為輸出  
Init();  //調(diào)用初始化函數(shù)
_EINT();  //使能中斷
ADC12CTL0 |= ENC+ADC12SC;  //設(shè)置轉(zhuǎn)換控制寄存器ADC12CTL0,ENC=0x002使轉(zhuǎn)換允許位為1,
  //意味著可以啟動轉(zhuǎn)換,同時ADC12TL0中的低電平位可以被修改。
//ADC12SC=0x001使采樣/轉(zhuǎn)換控制位為1,如果采樣信號SAMPCON由
//采樣定時器產(chǎn)生(SHP=1),則ASC12SC=1將產(chǎn)生一次轉(zhuǎn)換
while (1);  //無限次的while循環(huán)
}
void Init(void)  //初始化函數(shù)
{
WDTCTL = WDTPW+WDTHOLD;    //關(guān)看門狗
P6SEL |= 0x01;             // 設(shè)置P6口的P6.0引腳為外圍模塊AD轉(zhuǎn)換器的模擬信號輸入引腳  
ADC12CTL0 &= ~ENC;         //復(fù)位轉(zhuǎn)換允許位  
ADC12CTL0 = ADC12ON + SHT0_2 + REFON + REF2_5V;    // Turn on and set up ADC12
  //設(shè)置轉(zhuǎn)換控制寄存器ADC12CTL0,ADC12ON=0x010,使ADC12內(nèi)核工作
//SHT0_2=2*0x100,確定采樣周期為4×tADC12CLK×4
//REFON=0x020,內(nèi)部參考電壓打開
//REF2_5V=0x040,選擇內(nèi)部參考電壓發(fā)生器的電壓為2.5V
ADC12CTL1 = SHP + CONSEQ_2 ;  // 設(shè)置AD轉(zhuǎn)換控制寄存器ADC12CTL1
  //SHP=0x0200 設(shè)置SAMPON來自采樣定時器,采樣信號上升沿觸發(fā)采樣
//CONSEQ_2=2*2 設(shè)置工作模式為單通道、多次轉(zhuǎn)換模式
ADC12MCTL0 = SREF_0;  //設(shè)置通道0的轉(zhuǎn)換存儲控制寄存器ADC12MCTL0,
//SREF_0=0*0x10 選擇參考電壓為VR+=AVCC,VR-=AVSS ,因此輸入模擬信號
  //范圍是3.3V~0V。
ADC12IE |= BIT0;      //設(shè)置中斷允許寄存器ADC12IE,將第0位置1,使通道A0轉(zhuǎn)換后產(chǎn)生中斷
}   
interrupt[ADC_VECTOR] void ADC12 (void)//AD轉(zhuǎn)換中斷函數(shù)
{
unsigned charseg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  //聲明無小數(shù)點顯示的數(shù)碼管七段字型碼數(shù)組
unsigned char seg_8[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  //聲明有小數(shù)點顯示的數(shù)碼管七段字型碼數(shù)組  
unsigned i,j;       //聲明變量數(shù)據(jù)類型  
ADC12CTL0 &= ~ENC;  //設(shè)置AD轉(zhuǎn)換控制寄存器ADC12CTL0,ENC=0x002,~ENC=0xFFD,停止AD轉(zhuǎn)換
  for( i=0 ; i<4 ;i++) //掃描Table 數(shù)組行下標(biāo)
   {  
  for(j=0; j<10; j++)               //掃描Table 數(shù)組列下標(biāo)
  {if (ADC12MEM0<=Table[j])  
goto xxx;   //如果Table數(shù)組元素大于轉(zhuǎn)換數(shù)值,則轉(zhuǎn)到標(biāo)號 xxx
}  
}  
xxx:    {P4OUT = seg_7[j];   //P4 口輸出
   P5OUT = seg_8; }     //P5 口輸出
ADC12CTL0 |= ENC+ADC12SC;  //  使能再次轉(zhuǎn)換
}   

例10: 模擬比較器實驗
接電位器于端口P2.3, 用來輸入模擬電壓值 (0~3.3V)。 參考電壓選取0.5VCC, 待測電壓由P2.3
端輸入,如果待測電壓大于參考電壓,P1.0端口的LED點亮,反之熄滅。
注意:順時針調(diào)節(jié)電位器,輸入的模擬電壓值增大。
#include <msp430x14x.h>
void main (void)
{
   WDTCTL=WDTPW+WDTHOLD;
   P3DIR |= BIT0;   //P3口的第0引腳為輸入
   CACTL1 =CARSEL + CAREF1 + CAON;//設(shè)置控制寄存器CACTL1,
//CARSEL=0x40,設(shè)置內(nèi)部參考電壓,當(dāng)CAEX=0時參考電平加在(-)端
//CAREF1=0x20,選擇0.5×VCC作為參考電壓
//CAON=0x08,  打開比較器
   CACTL2 = P2CA0; //設(shè)置控制寄存器CACTL2,
//P2CA0=0x04,設(shè)置外部引腳信號連接在比較器輸入端
   while (1) //無限次循環(huán)
    {
if ((CACTL2 & CAOUT )== CAOUT)//CAOUT=0x01,如果比較器輸出為1
  //若CACTL2寄存器的第0位為1,則表示輸入電壓
  //大于參考電壓
   P3OUT &= ~BIT0;  //則P3的第0引腳輸出低電平,相連的發(fā)光二極管亮
    else  
    P3OUT |= BIT0;  //否則,P3的第0引腳輸出高電平,相連的發(fā)光二極管滅
    }
}      
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:57810 發(fā)表于 2015-2-20 10:20 | 只看該作者
很好!
回復(fù)

使用道具 舉報

板凳
ID:74307 發(fā)表于 2015-3-7 22:05 | 只看該作者
太好了可以好好學(xué)學(xué)了!!!!!!!!!!!!!!!!!!!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国内精品久久久久久久 | 国产免费观看一级国产 | 国产精品久久久久久一区二区三区 | 精品久久久久久国产 | 日本一区二区三区视频在线 | 日韩精品激情 | 伊人网在线综合 | av网站在线看 | 成人性生交大片免费看中文带字幕 | 亚洲另类视频 | 国产在线精品一区二区三区 | 99re国产视频| 综合国产第二页 | 国产午夜精品久久久 | 成人精品一区二区三区四区 | 日日摸天天添天天添破 | 91久久国产综合久久91精品网站 | 9999视频 | 国产成人精品免费 | 久久男人 | 中文字幕视频在线观看免费 | av一区二区三区四区 | 日日夜夜视频 | 成人午夜激情 | 亚洲成人一区二区 | 日韩在线免费观看视频 | 亚洲日韩欧美一区二区在线 | 四虎最新视频 | 国产三级国产精品 | 伊人伊人 | 亚洲第1页| 91n成人 | 一区在线视频 | 婷婷二区| 国产精品一区二区无线 | 国产91视频一区二区 | 91视频在线观看 | 亚洲日韩欧美一区二区在线 | 国产一级视频免费播放 | av中文字幕在线播放 | 欧美炮房|