1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
基于MSP430的數字存儲示波器的設計與實現程序
[打印本頁]
作者:
390422202
時間:
2018-11-7 17:32
標題:
基于MSP430的數字存儲示波器的設計與實現程序
單片機源程序如下:
/*******************************************
方案1需要按復位鍵即每次只能采樣128次
方案2加一個軟件觸發,從固定位置觸發
各種中斷形成一個 循環!!上一個中斷完成再觸發下一個中斷
********************************************/
#include <msp430x16x.h>
#include "math.h"
extern unsigned int N_point; //點數
extern unsigned char M_grade; //階數
#define PI 3.14159265358979323
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Num_of_Results 129
#define CPU_F ((double)8000000)
#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))
float data_R[128]; //實部
float data_I[128]; //虛部
uint N_point=128;
uchar M_grade=7;
uint results[32];
uchar fre[4];
uchar mami[7]={"-0000mv"};
uchar h0[] = {"頻率"};
uchar h1[] = {"正在保存...."};
uchar h2[] = {"歡迎使用本示波器"};
uchar h3[] = {"保存等待"};
uchar h4[] = {"不可保存"};
uchar h5[] = {"****************"};
uint count,ad,start,end,biger,longer;
ulong sum,max=0,min=4095,zhi;
uchar index =0,h=1,temp,flag=1,m=0,c=1;
uchar tem=0,num=0;//中斷函數中的計數變量,定義成全局
uchar tempH,tempL,color=1;
uint wavey[128];
#define LCD_DataIn P4DIR=0x00 //數據口方向設置為輸入
#define LCD_DataOut P4DIR=0xff //數據口方向設置為輸出
#define LCD2MCU_Data P4IN
#define MCU2LCD_Data P4OUT
#define LCD_CMDOut P6DIR|=0xFF //P3口的低三位設置為輸出
#define LCD_RS_H P6OUT|=BIT3 //P3 .0
#define LCD_RS_L P6OUT&=~BIT3 //P3.0
#define LCD_RW_H P6OUT|=BIT4 //P3.1
#define LCD_RW_L P6OUT&=~BIT4 //P3.1
#define LCD_EN_H P6OUT|=BIT5 //P3.2
#define LCD_EN_L P6OUT&=~BIT5 //P3.2
/*******************************************
函數名稱:int_CAP()
功 能:初始化觸發器!!只打開觸發引腳P13
參 數:無
返回值 :無
********************************************/
void int_CAP()
{
P1SEL = 0x0C;//P12P13作為捕獲輸入端子
P1DIR = 0x00;
TACCTL1|=CM_2+SCS+CAP;//P12下升沿觸發捕獲,同步模式 不開中斷
TACCTL2|=CM_1+SCS+CAP+CCIE;//P13上升沿觸發捕獲,同步模式
TACTL|=TASSEL_2+MC_2;//SMCLK作為計數脈沖,不分頻
}
/*******************************************
函數名稱:Clock_Init()
功 能:初始化時鐘
參 數:無
返回值 :無
********************************************/
void Clock_Init() //時鐘初始化
{
uchar i;
BCSCTL1&=~XT2OFF; //打開XT振蕩器
BCSCTL2|=SELM1+SELS+DIVS_3; //MCLK為8MHZ,SMCLK為1MHZ
do
{
IFG1&=~OFIFG; //清除震蕩標志
for(i=0;i<100;i++)
_NOP(); //延時等待
}
while((IFG1&OFIFG)!=0); //如果標志為1,則繼續循環等待
IFG1&=~OFIFG;
}
/*******************************************
函數名稱:int_adc()
功 能:初始化ADC
參 數:無
返回值 :無
********************************************/
void int_adc()
{
P6SEL |= 0x07; // P6.0 P6.1P6.2ADC option select
P6DIR |=0XF8;
ADC12CTL0 = SHT0_2 + ADC12ON+REF2_5V+REFON+MSH; // Set sampling time, turn on ADC12
ADC12CTL1 = SHP+CONSEQ_3;// Use sampling timer
ADC12MCTL0 = 0X00;//參考電壓 AVCC AVSS
ADC12MCTL1 = INCH_1;
ADC12MCTL2 = INCH_2+EOS;//選擇通路,EOS停止第一輪轉化
ADC12IE = 0x04; //中斷最后一個使能 // Enable interrupt
ADC12CTL0 |= ENC; // 轉化 enabled
}
/*******************************************
函數名稱:Delay_1ms
功 能:延時約1ms的時間
參 數:無
返回值 :無
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函數名稱:fft_128()
功 能:fft變換
參 數:無
返回值 :無
********************************************/
void fft_128()
{ float tab_sin_128[128]={ //正玄表 旋轉因子所在
0.0000, 0.0491, 0.0980, 0.1467,0.1951,
0.2430, 0.2903, 0.3369, 0.3827,
0.4276, 0.4714, 0.5141, 0.5556, 0.5957,
0.6344, 0.6716, 0.7071, 0.7410,
0.7730, 0.8032, 0.8315, 0.8577, 0.8819,
0.9040, 0.9239, 0.9415, 0.9569,
0.9700, 0.9808, 0.9892, 0.9952, 0.9988,
1.0000, 0.9988, 0.9952, 0.9892,
0.9808, 0.9700, 0.9569, 0.9415, 0.9239,
0.9040, 0.8819, 0.8577, 0.8315,
0.8032, 0.7730, 0.7410, 0.7071, 0.6716,
0.6344, 0.5957, 0.5556, 0.5141,
0.4714, 0.4276, 0.3827, 0.3369, 0.2903,
0.2430, 0.1951, 0.1467, 0.0980,
0.0491, 0.0000,-0.0491,-0.0980,-0.1467,
-0.1951,-0.2430,-0.2903,-0.3369,
-0.3827,-0.4276,-0.4714,-0.5141,-0.5556,
-0.5957,-0.6344,-0.6716,-0.7071,
-0.7410,-0.7730,-0.8032,-0.8315,-0.8577,
-0.8819,-0.9040,-0.9239,-0.9415,
-0.9569,-0.9700,-0.9808,-0.9892,-0.9952,
-0.9988,-1.0000,-0.9988,-0.9952,
-0.9892,-0.9808,-0.9700,-0.9569,-0.9415,
-0.9239,-0.9040,-0.8819,-0.8577,
-0.8315,-0.8032,-0.7730,-0.7410,-0.7071,
-0.6716,-0.6344,-0.5957,-0.5556,
-0.5141,-0.4714,-0.4276,-0.3827,-0.3369,
-0.2903,-0.2430,-0.1951,-0.1467,
-0.0980,-0.0491};
int i;
int L;// the grade deal with now
int J;//the point deal with now
int B;//蝶形兩左翅 相距的距離
int var;//臨時變量
int P,Q;//cos sin 在sintab中的位置 旋轉因子
float data_R_J,data_I_J,data_R_JB,data_I_JB;//臨時變量 存放data_R。。等
for (i=0;i<N_point;i++)
{
data_R[i]=(float)wavey[i];
}
for(L=1;L<=M_grade;L++)//L級
{
B=1;
var=L-1;while(var>0){B=2*B;var--;}//B=2^(L-1);
for(i=0;i<B;i++) // 交叉蝶形中的第i個蝶形 第J=J+2*B個交叉蝶形 因為沒兩個交叉蝶形相距2*B
{
P=1;var=M_grade-L;
while(var>0){P=2*P;var--;}
P=P*i; //P=J*2^(M-L) ;J=i now
if(P<3*N_point/4)
Q=P+N_point/4;
else Q=P-3*N_point/4;
for(J=i;J<N_point;J=J+2*B)//128 N_point/2 第J個交叉蝶形
{
data_R_J=data_R[J];
data_I_J=data_I[J];
data_R_JB=data_R[J+B];
data_I_JB=data_I[J+B];//
data_R[J]=data_R_J+data_R_JB*tab_sin_128[Q]+data_I_JB*tab_sin_128[P];
data_I[J]=data_I_J+data_I_JB*tab_sin_128[Q]-data_R_JB*tab_sin_128[P];
data_R[J+B]=data_R_J-data_R_JB*tab_sin_128[Q]-data_I_JB*tab_sin_128[P];
data_I[J+B]=data_I_J-data_I_JB*tab_sin_128[Q]+data_R_JB*tab_sin_128[P];
}
}
}
}
/*******************************************
函數名稱:Delay_Nms
功 能:延時N個1ms的時間
參 數:n--延時長度
返回值 :無
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函數名稱:Write_Cmd
功 能:向液晶中寫控制命令
參 數:cmd--控制命令
返回值 :無
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函數名稱:Write_Data
功 能:向液晶中寫顯示數據
參 數:dat--顯示數據
返回值 :無
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
uchar readData(void)
{
uchar lcdtemp = 0;
unsigned char RData;
MCU2LCD_Data=0xff;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_RS_H;
LCD_RW_H;
LCD_EN_L;
LCD_EN_H;
RData=LCD2MCU_Data;
LCD_EN_L;
return RData;
}
/***********************************************************
函數名: drawPoint
函數說明:畫點
傳入參數:打點位置(x0,y0);color=1,點亮;color=0,擦除
傳出參數:無
返回值: 無
**********************************************************/
void Draw_point(unsigned char x,unsigned char y,unsigned char color)
{
uchar row,collum,cbite;
Write_Cmd(0x34);
Write_Cmd(0x36);
collum=x>>4;
cbite=x&0x0f;
if(y<32)
row=y;
else
{row=y-32;
collum+=8;
}
Write_Cmd(0x80+row);
Write_Cmd(0x80+collum);
readData();
tempH=readData();
tempL=readData();
Write_Cmd(0x80+row);
Write_Cmd(0x80+collum);
if (color)
{
if(cbite<8)
{
tempH|=(1<<(7-cbite));
}
else
{
tempL|=(1<<(15-cbite));
}
}
else
{
if(cbite<8)
{
tempH&=~(1<<(7-cbite));
}
else
{
tempL&=~(1<<(15-cbite));
}
}
Write_Data(tempH);
Write_Data(tempL);
Write_Cmd(0x30);
}
/***********************************************************
函數名: drawRowLine
函數說明:畫水平線
傳入參數:(x0,y0),水平線的起點;(x1,y0)水平線的終點
color=1,點亮;color=0,擦除
傳出參數:無
返回值: 無
**********************************************************/
void drawRowLine(uchar x0,uchar y0,uchar x1,uchar color)
{
do
{
Draw_point(x0, y0, color); // 逐點顯示,描出垂直線
x0++;
}
while(x1>=x0);
}
/***********************************************************
函數名: drawCollumLine
函數說明:畫豎直線
傳入參數:(x0,y0),豎直線的起點;(x1,y0)豎直線的終點;
color=1,點亮;color=0,擦除
傳出參數:無
返回值: 無
************************************************************/
void drawCollumLine(uchar x0,uchar y0,uchar y1,uchar color)
{
while (y0<=y1)
{
Draw_point(x0,y0,color);
y0++;
}
}
/***********************************************************
函數名: drawLine
函數說明:使用Bresenham法,畫任意兩點間的直線
傳入參數:(x0,y0),豎直線的起點;(x1,y1)豎直線的終點 color=1,點亮;color=0,擦除
傳出參數:無
返回值: 無
**********************************************************/
void drawLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
{
uchar tempx,tempy;
if(x0>x1) // 對x0、x1大小進行排列,以便畫圖
{
tempx = x1;
x1 = x0;
x0 = tempx;
}
if(y0>y1)
{
tempy=y0;
y0=y1;
y1=tempy;
}
int dx; // 直線x軸差值變量
int dy; // 直線y軸差值變量
char dx_sym; // x軸增長方向,為-1時減值方向,為1時增值方向
char dy_sym; // y軸增長方向,為-1時減值方向,為1時增值方向
int dx_2; // dx*2值變量,用于加快運算速度
int dy_2; // dy*2值變量,用于加快運算速度
int di; // 決策變量
dx = x1-x0; // 求取兩點之間的差值
dy = y1-y0;
if (dx<0) dx_sym=-1;
else
{
if(dx>0) dx_sym=1;
else
{
drawCollumLine(x0,y0,y1,color);
return;
}
}
if(dy>0) dy_sym=1;
else
{
if(dy<0) dy_sym=-1;
else
{
drawRowLine(x0,y0,x1,color);
return;
}
}
dx=dx_sym*dx;
dy=dy_sym*dy;
dx_2=dx*2;
dy_2=dy*2;
if(dx>=dy)
{
di=dy_2-dx;
while(x0!=x1)
{
Draw_point(x0,y0,color);
x0+=dx_sym;
if(di<0) di+=dy_2;
else {di+=dy_2-dx_2;y0+=dy_sym;}
}
Draw_point(x0,y0,color);
}
else
{
di=dx_2-dy;
while(y0!=y1)
{
Draw_point(x0,y0,color);
y0+=dy_sym;
if(di<0) di+=dx_2;
else {di+=dx_2-dy_2;x0+=dx_sym;}
}
Draw_point(x0,y0,color);
}
}
/*******************************************
函數名稱:Disp_HZ
功 能:控制液晶顯示漢字
參 數:addr--顯示位置的首地址
pt--指向顯示數據的指針
num--顯示字符個數
返回值 :無
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
/****************************
數字
*****************************/
void Disp_SZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < num;i++)
Write_Data(*(pt++));
}
void Ini_Lcd(void)
{
//LCD_CMDOut; //液晶控制端口設置為輸出
// Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址歸位
Delay_1ms();
Write_Cmd(0x0c); //整體顯示打開,游標關閉
Delay_1ms();
Write_Cmd(0x01); //清除顯示
Delay_1ms(); Write_Cmd(0x06); //游標右移
Delay_1ms();
Write_Cmd(0x80); //設定顯示的起始地址
}
/*******************************************
函數名稱:Clear_GDRAM
功 能:清除液晶GDRAM中的隨機數據
參 數:無
返回值 :無
********************************************/
void Clear_GDRAM()
{
uchar i,j,k;
Write_Cmd(0x34); //打開擴展指令集
i = 0x80;
for(j = 0 ;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30); //回到基本指令集
}
/*******************************************
函數名稱:Draw_TX
功 能:顯示一個16*16大小的圖形
參 數:Yaddr--Y地址
Xaddr--X地址
dp--指向圖形數據存放地址的指針
返回值 :無
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k=0;
// Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用擴展指令集,關閉繪圖顯示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr); //X地址
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36); //打開繪圖顯示
// Write_Cmd(0x30); //回到基本指令集模式
}
/*******************************************
函數名稱:FRE()
功 能:對定時器內的數據進行處理,得出頻率
參 數:
返回值 :無
********************************************/
void choose()
{
zhi = (zhi*3200)/4095;
zhi=zhi/2;
mami[1]=zhi/1000+0X30;
mami[2]=(zhi%1000)/100+0X30;
mami[3]=(zhi%1000)%100/10+0X30;
mami[4]=(zhi%1000)%100%10+0X30;
Disp_SZ(0x8d,mami+1,6);
Disp_SZ(0x98,mami,7);
max=0;
min=4095;
}
/*******************************************
函數名稱:FRE()
功 能:對定時器內的數據進行處理,得出頻率
參 數:
返回值 :無
********************************************/
void FRE()
{ uint temp2;
uchar temp1;
temp2=1000000/sum;
temp1=temp2/1000;
fre[0]=temp1+0x30;
temp2=temp2-temp1*1000;
temp1=temp2/100;
fre[1]=temp1+0x30;
temp2=temp2-temp1*100;
temp1=temp2/10;
fre[2]=temp1+0x30;
temp2=temp2-temp1*10;
fre[3]=temp2+0x30;
}
/*******************************************
函數名稱:COMPA()
功 能:比較器
參 數:
返回值 :無
********************************************/
void COMPA()
{
P2SEL = 0x1c; //P24 P23 P22分別為比較器輸入輸出
P2DIR = 0x04; //
CACTL1 = CAON+CARSEL+CAREF_0 ; // 使用外部參考電壓 一腳可以接地
CACTL2 = P2CA0+P2CA1+CAF; // 使用 CA0 CA1
}
/*******************************************
函數名稱:timer()
功 能:計數器處理
參 數:
返回值 :無
********************************************/
void timer()
{
TACCTL1&=~CCIE;
P1IE=(BIT0+BIT4+BIT5+BIT6+BIT7);
flag=0;
tem++;
switch(tem)
{
case 1:{start=TACCR1;}break;
case 2:end=TACCR1;
if(end>start)
{
results[num]=(end-start);
}
else
{
results[num]=(65536-start+end);
}
tem=0;
num++;
break;
}
Delay_1ms();
TACCTL1|=CCIE;//以前是關總中斷 現在試試關定時器中斷
if(num==32)
{ uchar i;
for(i = 0; i < num; i++)
{
sum+=results[i];
}
sum >>=5;
FRE();
Disp_SZ(0x8A,fre,4);
sum=0;
num=0;
TACCTL1&=~CCIE;
Disp_HZ(0x9c,h3,4);
delay_ms(1000);
Disp_HZ(0x9c,h4,4);
P1IE&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
//ADC12IE |= 0x01;
ADC12CTL0 |= ENC;//只能單位置位
TACCTL2 |=CCIE;
//_EINT();
}
}
/*******************************************
函數名稱:Key
功 能:存儲
參 數:
返回值 :無
********************************************/
void Key(void)
{
P1DIR&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
P1SEL&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
P1IES = BIT0+BIT4+BIT5+BIT6+BIT7;
}
/*******************************************
函數名稱:change
功 能:改變頻率和放大倍數
參 數:
返回值 :無
********************************************/
void change()
{
zhi=max-min;
P5SEL = 0X00;
P5DIR = 0XFF;
ADC12CTL0 &= ~ENC;//置位0,DIV才能改
if(longer<512)
{
ADC12CTL1 = ADC12DIV_0+SHP+CONSEQ_3;
}
else if(longer<1024)
{
ADC12CTL1 = ADC12DIV_1+SHP+CONSEQ_3;
}
else if(longer<1536)
{
ADC12CTL1 = ADC12DIV_2+SHP+CONSEQ_3;
}
else if(longer<2048)
{
ADC12CTL1 = ADC12DIV_3+SHP+CONSEQ_3;
}
else if(longer<2560)
{
ADC12CTL1 = ADC12DIV_4+SHP+CONSEQ_3;
}
else if(longer<3072)
{
ADC12CTL1 = ADC12DIV_5+SHP+CONSEQ_3;
}
else if(longer<3584)
{
ADC12CTL1 = ADC12DIV_6+SHP+CONSEQ_3;
}
else if(longer<4096)
{
ADC12CTL1 = ADC12DIV_7+SHP+CONSEQ_3;
}
ADC12CTL0 |= ENC;
////////
if(biger<256)
{
P5OUT = 0x06;
zhi=zhi/156;
}
else if(biger<512)
{
P5OUT = 0x0e;
zhi=zhi/143;
}
else if(biger<786)
{
P5OUT = 0x16;
zhi=(zhi*27)/2600;
}
else if(biger<1024)
{
P5OUT = 0x1e;
zhi=(zhi*8)/1005;
}
else if(biger<1280)
{
P5OUT = 0x26;
zhi=zhi/78;
}
else if(biger<1536)
{
P5OUT = 0x2e;
//zhi=(zhi*9)/435;
}
else if(biger<1792)
{
P5OUT = 0x36;
zhi=(zhi*5)/119;
}
else if(biger<2048)
{
P5OUT = 0x3e;
zhi=(zhi*20)/97;
}
else if(biger<2304)
{
P5OUT = 0x07;
zhi=(zhi*15)/293;
}
else if(biger<2560)
{
P5OUT = 0x0f;
zhi=(zhi*44)/775;
}
else if(biger<2816)
{
P5OUT = 0x17;
zhi=(zhi*90)/1001;
}
else if(biger<3072)
{
P5OUT = 0x1f;
zhi=(zhi*75)/312;
}
else if(biger<3328)
{
P5OUT = 0x27;
zhi=(zhi*5)/48;
}
else if(biger<3584)
{
P5OUT = 0x2f;
zhi=(zhi*700)/4318;
}
else if(biger<3840)
{
P5OUT = 0x37;
zhi=(zhi*100)/322;
}
else if(biger<4096)
{
P5OUT = 0x3f;
zhi=(zhi*1000)/607;
}
}
/*******************************************
函數名稱:write_Seg
功 能:存儲數據到某段FLASH
參 數:
返回值 :無
********************************************/
void write_Seg (uint add)
{
uchar *Flash_ptr; // Flash pointer
uchar i;
Flash_ptr = (uchar *)add; // Initialize Flash pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY;
// Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment空寫
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<128; i++)
{
*Flash_ptr++ = wavey[i]; // Write value to flash
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/*******************************************
函數名稱:read_Seg
功 能:read_某段FLASH
參 數:
返回值 :無
********************************************/
void read_Seg(uint add)
{
uchar *Flash_ptr; // Segment A pointer
uchar i;
Flash_ptr = (uchar *)add;
//FCTL1 = FWKEY + ERASE; // Set Erase bit
//FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment B
//FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<128; i++)
{
wavey[i] = *Flash_ptr++;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/***************************主函數*************************/
void main( void )
{
P6SEL = 0x00;
LCD_CMDOut;
WDTCTL = WDTPW + WDTHOLD; //關狗
Key();
Clock_Init();
int_adc();
COMPA();
_EINT();
Ini_Lcd(); //初始化液晶
Clear_GDRAM();
Disp_SZ(0x80,h5,16);
Disp_HZ(0x90,h2,8);
Disp_SZ(0x88,h5,16);
delay_ms(1000);
Write_Cmd(0x01); //清除漢字顯示
Delay_1ms();
Disp_HZ(0x88,h0,2);
//while(1)
//{
_NOP();
int_CAP(); //波形顯示完成后在初始化
// }
// _BIS_SR(CPUOFF + GIE); // LPM0, ADC12_ISR will force exit
//write_Seg(0x1080);
}
/*******************************************
函數名稱:ADC中斷
功 能:進入中斷程序,處理采集到的數據
參 數:
返回值 :無
********************************************/
#pragma vector=ADC_VECTOR // ADC12 interrupt service rout ine
__interrupt void ADC12ISR (void)
{ ADC12IE &= ~ 0x04; // Enable interrupt關中斷不可以!!!!!
TACCTL2&=~CCIE;//
uchar y=0;
if(max<ADC12MEM2)
{
max=ADC12MEM2;
}
if(min>ADC12MEM2)
{
min=ADC12MEM2;
}
ad = ADC12MEM2;
biger = ADC12MEM1;
longer = ADC12MEM0;
ad >>=7;
wavey[index++] = ad;
if(index==127)
{
index=0;
ADC12CTL0 &= ~ ADC12SC;
ADC12CTL0 &= ~ENC;//停止轉化
Clear_GDRAM();
for (m=0;m<127;m++)
{
uchar Oldx,Oldy ;
Draw_point((m*h),(31*(h-1)/h+wavey[y]/h),1);
Oldx=(uchar)(m*h);
Oldy=(uchar)(31*(h-1)/h+wavey[y]/h);
drawLine(Oldx,Oldy,((m+1)*h+0),(31*(h-1)/h+wavey[++y]/h),1);
}
change();//把轉換通道換一下
choose();
TACCTL1|=CCIE;
_NOP();
}
ADC12IE |= 0x04;
}
/*******************************************
函數名稱:定時器中斷
功 能:讀取定時器數據
參 數:
返回值 :無
********************************************/
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch( TAIV )
{
case 2: {timer();}break;
case 4: ADC12CTL0 |= ADC12SC; break; //重新打開使能 32次轉換完成之后再開始ADC
case 10: break;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void KeyBord(void)
{
if((P1IFG&BIT7)!=0)
{
Write_Cmd(0x01); //清除漢字顯示
Delay_1ms();
Disp_HZ(0x88,h0,2);
P1IFG&=~BIT5;//清處中斷標志
P1IFG&=~BIT6;//清處中斷標志
P1IFG&=~BIT7;//清處中斷標志
}
else if((P1IFG&BIT5)!=0)
{
Clear_GDRAM();
Write_Cmd(0x01); //清除顯示
Delay_1ms();
uchar y=0;
read_Seg(0x1000);
for (m=0;m<127;m++)
{
uchar Oldx,Oldy ;
Draw_point((m*h),(31*(h-1)/h+wavey[y]/h),1);
Oldx=(uchar)(m*h);
Oldy=(uchar)(31*(h-1)/h+wavey[y]/h);
drawLine(Oldx,Oldy,((m+1)*h+0),(31*(h-1)/h+wavey[++y]/h),1);
}
}
else if((P1IFG&BIT6)!=0)
{ Clear_GDRAM();
Write_Cmd(0x01); //清除顯示
Delay_1ms();
uchar y=0;
read_Seg(0x1080);
for (m=0;m<127;m++)
{
uchar Oldx,Oldy ;
Draw_point((m*h),(31*(h-1)/h+wavey[y]/h),1);
Oldx=(uchar)(m*h);
Oldy=(uchar)(31*(h-1)/h+wavey[y]/h);
drawLine(Oldx,Oldy,((m+1)*h+0),(31*(h-1)/h+wavey[++y]/h),1);
}
}
else if((P1IFG&BIT4)!=0)
{
Clear_GDRAM();
Write_Cmd(0x01); //清除顯示
Delay_1ms();
Disp_HZ(0x80,h1,6);
if(c==1)
{
write_Seg (0x1000);
c=2;
}
else if(c==2)
{
write_Seg (0x1080);
c=1;
}
//Disp_HZ(0x88,h2,8);
delay_ms(1000);
Write_Cmd(0x01); //清除漢字顯示
Delay_1ms();
Disp_HZ(0x88,h0,2);
P1IFG&=~BIT4;//清處中斷標志
} else if((P1IFG&BIT0)!=0)
{
Clear_GDRAM();
Write_Cmd(0x01); //清除顯示
Delay_1ms();
int i;
for(i=0;i<N_point;i++)
{
data_I[i]=0;
}
fft_128();
for(i=0;i<128;i++)
{
wavey[i]=(unsigned int)sqrt(data_R[i]*data_R[i]+data_I[i]*data_I[i])/32;
}
for(i=0;i<128;i++)
{ //drawCollumLine(i,(31*(h-1)/h+wavey[i]/h),31,1);
Draw_point(i,1,1);
Draw_point(i,(31*(h-1)/h+wavey[i]/h),1);
drawLine(i,(31*(h-1)/h+wavey[i]/h),i,1,1);
}
_NOP();
delay_ms(1000);
Disp_HZ(0x88,h0,2);
P1IFG&=~BIT0;//清處中斷標志
}
}
復制代碼
所有資料51hei提供下載:
基于MSP430的數字存儲示波器的設計與實現程序.docx
(22.28 KB, 下載次數: 14)
2018-11-7 17:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-11-8 03:08
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1