標(biāo)題: 基于MSP430的數(shù)字存儲(chǔ)示波器的設(shè)計(jì)與實(shí)現(xiàn)程序 [打印本頁(yè)]

作者: 390422202    時(shí)間: 2018-11-7 17:32
標(biāo)題: 基于MSP430的數(shù)字存儲(chǔ)示波器的設(shè)計(jì)與實(shí)現(xiàn)程序
單片機(jī)源程序如下:
  1. /*******************************************
  2. 方案1需要按復(fù)位鍵即每次只能采樣128次  
  3. 方案2加一個(gè)軟件觸發(fā),從固定位置觸發(fā)
  4. 各種中斷形成一個(gè)  循環(huán)。∩弦粋(gè)中斷完成再觸發(fā)下一個(gè)中斷
  5. ********************************************/
  6. #include <msp430x16x.h>
  7. #include "math.h"
  8. extern unsigned int N_point;             //點(diǎn)數(shù)
  9. extern unsigned char M_grade;            //階數(shù)
  10. #define PI 3.14159265358979323
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define  ulong unsigned long
  14. #define   Num_of_Results   129
  15. #define CPU_F ((double)8000000)
  16. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  17. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  18. float data_R[128];         //實(shí)部
  19. float data_I[128];         //虛部
  20. uint N_point=128;
  21. uchar M_grade=7;
  22. uint results[32];
  23. uchar fre[4];
  24. uchar mami[7]={"-0000mv"};
  25. uchar h0[] = {"頻率"};
  26. uchar h1[] = {"正在保存...."};
  27. uchar h2[] = {"歡迎使用本示波器"};
  28. uchar h3[] = {"保存等待"};
  29. uchar h4[] = {"不可保存"};
  30. uchar h5[] = {"****************"};
  31. uint count,ad,start,end,biger,longer;
  32. ulong sum,max=0,min=4095,zhi;
  33. uchar index =0,h=1,temp,flag=1,m=0,c=1;
  34. uchar tem=0,num=0;//中斷函數(shù)中的計(jì)數(shù)變量,定義成全局
  35. uchar tempH,tempL,color=1;
  36. uint wavey[128];
  37. #define LCD_DataIn    P4DIR=0x00    //數(shù)據(jù)口方向設(shè)置為輸入
  38. #define LCD_DataOut   P4DIR=0xff    //數(shù)據(jù)口方向設(shè)置為輸出
  39. #define LCD2MCU_Data  P4IN
  40. #define MCU2LCD_Data  P4OUT
  41. #define LCD_CMDOut    P6DIR|=0xFF     //P3口的低三位設(shè)置為輸出
  42. #define LCD_RS_H      P6OUT|=BIT3      //P3 .0
  43. #define LCD_RS_L      P6OUT&=~BIT3     //P3.0
  44. #define LCD_RW_H      P6OUT|=BIT4      //P3.1
  45. #define LCD_RW_L      P6OUT&=~BIT4     //P3.1
  46. #define LCD_EN_H      P6OUT|=BIT5      //P3.2
  47. #define LCD_EN_L      P6OUT&=~BIT5     //P3.2
  48. /*******************************************
  49. 函數(shù)名稱(chēng):int_CAP()
  50. 功    能:初始化觸發(fā)器!只打開(kāi)觸發(fā)引腳P13
  51. 參    數(shù):無(wú)
  52. 返回值  :無(wú)
  53. ********************************************/
  54. void int_CAP()
  55. {
  56.   P1SEL = 0x0C;//P12P13作為捕獲輸入端子
  57.   P1DIR = 0x00;
  58.   TACCTL1|=CM_2+SCS+CAP;//P12下升沿觸發(fā)捕獲,同步模式 不開(kāi)中斷
  59.   TACCTL2|=CM_1+SCS+CAP+CCIE;//P13上升沿觸發(fā)捕獲,同步模式
  60.   TACTL|=TASSEL_2+MC_2;//SMCLK作為計(jì)數(shù)脈沖,不分頻
  61. }
  62. /*******************************************
  63. 函數(shù)名稱(chēng):Clock_Init()
  64. 功    能:初始化時(shí)鐘
  65. 參    數(shù):無(wú)
  66. 返回值  :無(wú)
  67. ********************************************/
  68. void  Clock_Init()                       //時(shí)鐘初始化
  69. {
  70.   uchar i;
  71.   BCSCTL1&=~XT2OFF;                 //打開(kāi)XT振蕩器
  72.   BCSCTL2|=SELM1+SELS+DIVS_3;              //MCLK為8MHZ,SMCLK為1MHZ
  73.   do
  74.   {
  75.     IFG1&=~OFIFG;                   //清除震蕩標(biāo)志
  76.     for(i=0;i<100;i++)
  77.        _NOP();                      //延時(shí)等待
  78.   }
  79.   while((IFG1&OFIFG)!=0);           //如果標(biāo)志為1,則繼續(xù)循環(huán)等待
  80.   IFG1&=~OFIFG;
  81. }
  82. /*******************************************
  83. 函數(shù)名稱(chēng):int_adc()
  84. 功    能:初始化ADC
  85. 參    數(shù):無(wú)
  86. 返回值  :無(wú)
  87. ********************************************/
  88. void int_adc()
  89. {
  90.   P6SEL |= 0x07;                            // P6.0 P6.1P6.2ADC option select
  91.   P6DIR |=0XF8;
  92.   ADC12CTL0 = SHT0_2 + ADC12ON+REF2_5V+REFON+MSH;    // Set sampling time, turn on ADC12
  93.   ADC12CTL1 = SHP+CONSEQ_3;// Use sampling timer
  94.   ADC12MCTL0 = 0X00;//參考電壓 AVCC AVSS
  95.   ADC12MCTL1 = INCH_1;
  96.   ADC12MCTL2 = INCH_2+EOS;//選擇通路,EOS停止第一輪轉(zhuǎn)化
  97.   ADC12IE = 0x04;   //中斷最后一個(gè)使能                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               // Enable interrupt
  98.   ADC12CTL0 |= ENC;                         // 轉(zhuǎn)化 enabled
  99.   
  100. }
  101. /*******************************************
  102. 函數(shù)名稱(chēng):Delay_1ms
  103. 功    能:延時(shí)約1ms的時(shí)間
  104. 參    數(shù):無(wú)
  105. 返回值  :無(wú)
  106. ********************************************/
  107. void Delay_1ms(void)
  108. {
  109.         uchar i;
  110.    
  111.         for(i = 150;i > 0;i--)  _NOP();
  112. }
  113. /*******************************************
  114. 函數(shù)名稱(chēng):fft_128()
  115. 功    能:fft變換
  116. 參    數(shù):無(wú)
  117. 返回值  :無(wú)
  118. ********************************************/
  119. void fft_128()
  120. { float tab_sin_128[128]={   //正玄表 旋轉(zhuǎn)因子所在
  121. 0.0000, 0.0491, 0.0980, 0.1467,0.1951,
  122. 0.2430, 0.2903, 0.3369, 0.3827,
  123. 0.4276, 0.4714, 0.5141, 0.5556, 0.5957,
  124. 0.6344, 0.6716, 0.7071, 0.7410,
  125. 0.7730, 0.8032, 0.8315, 0.8577, 0.8819,
  126. 0.9040, 0.9239, 0.9415, 0.9569,
  127. 0.9700, 0.9808, 0.9892, 0.9952, 0.9988,
  128. 1.0000, 0.9988, 0.9952, 0.9892,
  129. 0.9808, 0.9700, 0.9569, 0.9415, 0.9239,
  130. 0.9040, 0.8819, 0.8577, 0.8315,
  131. 0.8032, 0.7730, 0.7410, 0.7071, 0.6716,
  132. 0.6344, 0.5957, 0.5556, 0.5141,
  133. 0.4714, 0.4276, 0.3827, 0.3369, 0.2903,
  134. 0.2430, 0.1951, 0.1467, 0.0980,
  135. 0.0491, 0.0000,-0.0491,-0.0980,-0.1467,
  136. -0.1951,-0.2430,-0.2903,-0.3369,
  137. -0.3827,-0.4276,-0.4714,-0.5141,-0.5556,
  138. -0.5957,-0.6344,-0.6716,-0.7071,
  139. -0.7410,-0.7730,-0.8032,-0.8315,-0.8577,
  140. -0.8819,-0.9040,-0.9239,-0.9415,
  141. -0.9569,-0.9700,-0.9808,-0.9892,-0.9952,
  142. -0.9988,-1.0000,-0.9988,-0.9952,
  143. -0.9892,-0.9808,-0.9700,-0.9569,-0.9415,
  144. -0.9239,-0.9040,-0.8819,-0.8577,
  145. -0.8315,-0.8032,-0.7730,-0.7410,-0.7071,
  146. -0.6716,-0.6344,-0.5957,-0.5556,
  147. -0.5141,-0.4714,-0.4276,-0.3827,-0.3369,
  148. -0.2903,-0.2430,-0.1951,-0.1467,
  149. -0.0980,-0.0491};
  150.   int i;
  151.   int L;// the grade deal with now
  152.   int J;//the point deal with now
  153.   int B;//蝶形兩左翅 相距的距離
  154.   int var;//臨時(shí)變量
  155.   int P,Q;//cos sin 在sintab中的位置  旋轉(zhuǎn)因子
  156.   float data_R_J,data_I_J,data_R_JB,data_I_JB;//臨時(shí)變量 存放data_R。。等
  157.   for (i=0;i<N_point;i++)
  158.   {
  159.     data_R[i]=(float)wavey[i];
  160.   }
  161.   for(L=1;L<=M_grade;L++)//L級(jí)
  162.   {
  163.      B=1;
  164.      var=L-1;while(var>0){B=2*B;var--;}//B=2^(L-1);
  165.      for(i=0;i<B;i++)   // 交叉蝶形中的第i個(gè)蝶形   第J=J+2*B個(gè)交叉蝶形  因?yàn)闆](méi)兩個(gè)交叉蝶形相距2*B
  166.      {
  167.          P=1;var=M_grade-L;
  168.          while(var>0){P=2*P;var--;}
  169.          P=P*i;                  //P=J*2^(M-L) ;J=i now
  170.          if(P<3*N_point/4)
  171.             Q=P+N_point/4;
  172.          else Q=P-3*N_point/4;
  173.          for(J=i;J<N_point;J=J+2*B)//128 N_point/2   第J個(gè)交叉蝶形
  174.          {
  175.             data_R_J=data_R[J];
  176.             data_I_J=data_I[J];
  177.             data_R_JB=data_R[J+B];
  178.             data_I_JB=data_I[J+B];//
  179.       
  180.             data_R[J]=data_R_J+data_R_JB*tab_sin_128[Q]+data_I_JB*tab_sin_128[P];
  181.             data_I[J]=data_I_J+data_I_JB*tab_sin_128[Q]-data_R_JB*tab_sin_128[P];
  182.       
  183.             data_R[J+B]=data_R_J-data_R_JB*tab_sin_128[Q]-data_I_JB*tab_sin_128[P];
  184.             data_I[J+B]=data_I_J-data_I_JB*tab_sin_128[Q]+data_R_JB*tab_sin_128[P];
  185.           }
  186.   }
  187. }
  188. }
  189. /*******************************************
  190. 函數(shù)名稱(chēng):Delay_Nms
  191. 功    能:延時(shí)N個(gè)1ms的時(shí)間
  192. 參    數(shù):n--延時(shí)長(zhǎng)度
  193. 返回值  :無(wú)
  194. ********************************************/
  195. void Delay_Nms(uint n)
  196. {
  197.     uint i;
  198.    
  199.     for(i = n;i > 0;i--)    Delay_1ms();
  200. }
  201. /*******************************************
  202. 函數(shù)名稱(chēng):Write_Cmd
  203. 功    能:向液晶中寫(xiě)控制命令
  204. 參    數(shù):cmd--控制命令
  205. 返回值  :無(wú)
  206. ********************************************/
  207. void Write_Cmd(uchar cmd)
  208. {
  209.     uchar lcdtemp = 0;
  210.                        
  211.     LCD_RS_L;
  212.     LCD_RW_H;
  213.     LCD_DataIn;  
  214.     do                       //判忙
  215.     {   
  216.         LCD_EN_H;
  217.                _NOP();                                       
  218.                lcdtemp = LCD2MCU_Data;
  219.                LCD_EN_L;
  220.         
  221.     }
  222.     while(lcdtemp & 0x80);
  223.    
  224.     LCD_DataOut;   
  225.     LCD_RW_L;                 
  226.     MCU2LCD_Data = cmd;
  227.     LCD_EN_H;
  228.     _NOP();                                                                         
  229.     LCD_EN_L;
  230. }
  231. /*******************************************
  232. 函數(shù)名稱(chēng):Write_Data
  233. 功    能:向液晶中寫(xiě)顯示數(shù)據(jù)
  234. 參    數(shù):dat--顯示數(shù)據(jù)
  235. 返回值  :無(wú)
  236. ********************************************/
  237. void  Write_Data(uchar dat)
  238. {
  239.     uchar lcdtemp = 0;   
  240.         
  241.     LCD_RS_L;
  242.     LCD_RW_H;  
  243.     LCD_DataIn;   
  244.     do                       //判忙
  245.     {   
  246.         LCD_EN_H;
  247.         _NOP();                                               
  248.         lcdtemp = LCD2MCU_Data;
  249.         LCD_EN_L;      
  250.     }
  251.     while(lcdtemp & 0x80);  
  252.    
  253.     LCD_DataOut;
  254.     LCD_RS_H;
  255.     LCD_RW_L;  
  256.            
  257.     MCU2LCD_Data = dat;
  258.     LCD_EN_H;
  259.     _NOP();
  260.     LCD_EN_L;
  261. }  
  262. uchar readData(void)
  263. {
  264.   uchar lcdtemp = 0;
  265.   unsigned char RData;
  266.   MCU2LCD_Data=0xff;
  267.     LCD_RS_L;
  268.     LCD_RW_H;  
  269.     LCD_DataIn;   
  270.     do                       //判忙
  271.     {   
  272.         LCD_EN_H;
  273.         _NOP();                                               
  274.         lcdtemp = LCD2MCU_Data;
  275.         LCD_EN_L;      
  276.     }
  277.     while(lcdtemp & 0x80);
  278. LCD_RS_H;
  279. LCD_RW_H;
  280. LCD_EN_L;
  281. LCD_EN_H;
  282. RData=LCD2MCU_Data;
  283. LCD_EN_L;
  284. return RData;
  285. }
  286. /***********************************************************
  287. 函數(shù)名:  drawPoint
  288. 函數(shù)說(shuō)明:畫(huà)點(diǎn)
  289. 傳入?yún)?shù):打點(diǎn)位置(x0,y0);color=1,點(diǎn)亮;color=0,擦除
  290. 傳出參數(shù):無(wú)
  291. 返回值:  無(wú)
  292. **********************************************************/
  293. void Draw_point(unsigned char x,unsigned char y,unsigned char color)
  294. {
  295. uchar row,collum,cbite;
  296. Write_Cmd(0x34);
  297. Write_Cmd(0x36);
  298. collum=x>>4;
  299. cbite=x&0x0f;
  300. if(y<32)
  301.         row=y;
  302. else
  303.         {row=y-32;
  304.         collum+=8;
  305.         }

  306. Write_Cmd(0x80+row);
  307. Write_Cmd(0x80+collum);
  308. readData();
  309. tempH=readData();
  310. tempL=readData();
  311. Write_Cmd(0x80+row);
  312. Write_Cmd(0x80+collum);
  313. if (color)
  314. {
  315.          if(cbite<8)
  316.          {
  317.          tempH|=(1<<(7-cbite));
  318.          }
  319.          else
  320.          {
  321.          tempL|=(1<<(15-cbite));
  322.          }
  323.          
  324. }
  325. else
  326. {
  327.            if(cbite<8)
  328.          {
  329.          tempH&=~(1<<(7-cbite));
  330.          }
  331.          else
  332.          {
  333.          tempL&=~(1<<(15-cbite));
  334.          }
  335. }
  336. Write_Data(tempH);
  337. Write_Data(tempL);
  338. Write_Cmd(0x30);
  339. }
  340. /***********************************************************
  341. 函數(shù)名:  drawRowLine
  342. 函數(shù)說(shuō)明:畫(huà)水平線
  343. 傳入?yún)?shù):(x0,y0),水平線的起點(diǎn);(x1,y0)水平線的終點(diǎn)
  344.                                 color=1,點(diǎn)亮;color=0,擦除
  345. 傳出參數(shù):無(wú)
  346. 返回值:  無(wú)
  347. **********************************************************/
  348. void drawRowLine(uchar x0,uchar y0,uchar x1,uchar color)
  349. {
  350.     do
  351.     {
  352.         Draw_point(x0, y0, color);        // 逐點(diǎn)顯示,描出垂直線
  353.         x0++;
  354.     }
  355.     while(x1>=x0);
  356. }
  357. /***********************************************************
  358. 函數(shù)名:  drawCollumLine
  359. 函數(shù)說(shuō)明:畫(huà)豎直線
  360. 傳入?yún)?shù):(x0,y0),豎直線的起點(diǎn);(x1,y0)豎直線的終點(diǎn);
  361.                         color=1,點(diǎn)亮;color=0,擦除
  362. 傳出參數(shù):無(wú)
  363. 返回值:  無(wú)
  364. ************************************************************/
  365. void drawCollumLine(uchar x0,uchar y0,uchar y1,uchar color)
  366. {
  367. while (y0<=y1)
  368. {
  369. Draw_point(x0,y0,color);
  370. y0++;
  371. }
  372. }
  373. /***********************************************************
  374. 函數(shù)名:  drawLine
  375. 函數(shù)說(shuō)明:使用Bresenham法,畫(huà)任意兩點(diǎn)間的直線
  376. 傳入?yún)?shù):(x0,y0),豎直線的起點(diǎn);(x1,y1)豎直線的終點(diǎn) color=1,點(diǎn)亮;color=0,擦除
  377. 傳出參數(shù):無(wú)
  378. 返回值:  無(wú)
  379. **********************************************************/
  380. void drawLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
  381. {  
  382.   uchar tempx,tempy;
  383.   if(x0>x1)                                 // 對(duì)x0、x1大小進(jìn)行排列,以便畫(huà)圖
  384.     {
  385.         tempx = x1;
  386.         x1 = x0;
  387.         x0 = tempx;
  388.     }
  389.    if(y0>y1)
  390. {
  391.   tempy=y0;
  392.   y0=y1;
  393.   y1=tempy;
  394. }
  395.    int   dx;                // 直線x軸差值變量
  396.    int   dy;        // 直線y軸差值變量
  397.    char   dx_sym;        // x軸增長(zhǎng)方向,為-1時(shí)減值方向,為1時(shí)增值方向
  398.    char   dy_sym;        // y軸增長(zhǎng)方向,為-1時(shí)減值方向,為1時(shí)增值方向
  399.    int   dx_2;                // dx*2值變量,用于加快運(yùn)算速度
  400.    int   dy_2;                // dy*2值變量,用于加快運(yùn)算速度
  401.    int   di;                // 決策變量

  402.    dx = x1-x0;                // 求取兩點(diǎn)之間的差值
  403.    dy = y1-y0;
  404.    if (dx<0)                dx_sym=-1;
  405.    else
  406.    {
  407.            if(dx>0)        dx_sym=1;
  408.            else                               
  409.            {
  410.                            drawCollumLine(x0,y0,y1,color);
  411.                         return;
  412.                 }
  413.         }
  414.    if(dy>0)                        dy_sym=1;
  415.    else
  416.    {
  417.            if(dy<0)        dy_sym=-1;
  418.            else                               
  419.            {
  420.                            drawRowLine(x0,y0,x1,color);
  421.                         return;
  422.                 }
  423.         }
  424.    dx=dx_sym*dx;
  425.    dy=dy_sym*dy;

  426.    dx_2=dx*2;
  427.    dy_2=dy*2;

  428.    if(dx>=dy)
  429.    {
  430.         di=dy_2-dx;
  431.         while(x0!=x1)
  432.                 {
  433.                  Draw_point(x0,y0,color);
  434.                  x0+=dx_sym;
  435.                  if(di<0)        di+=dy_2;
  436.                  else        {di+=dy_2-dx_2;y0+=dy_sym;}
  437.                 }
  438.         Draw_point(x0,y0,color);
  439.         }
  440.    else
  441.    {
  442.    di=dx_2-dy;
  443.    while(y0!=y1)
  444.                    {
  445.                  Draw_point(x0,y0,color);
  446.                  y0+=dy_sym;
  447.                  if(di<0)        di+=dx_2;
  448.                  else                {di+=dx_2-dy_2;x0+=dx_sym;}
  449.                 }
  450.         Draw_point(x0,y0,color);
  451.    }

  452. }
  453. /*******************************************
  454. 函數(shù)名稱(chēng):Disp_HZ
  455. 功    能:控制液晶顯示漢字
  456. 參    數(shù):addr--顯示位置的首地址
  457.           pt--指向顯示數(shù)據(jù)的指針
  458.           num--顯示字符個(gè)數(shù)
  459. 返回值  :無(wú)
  460. ********************************************/
  461. void Disp_HZ(uchar addr,const uchar * pt,uchar num)
  462. {
  463.     uchar i;
  464.                
  465.     Write_Cmd(addr);
  466.       for(i = 0;i < (num*2);i++)
  467.       Write_Data(*(pt++));
  468. }
  469. /****************************
  470. 數(shù)字
  471. *****************************/
  472. void Disp_SZ(uchar addr,const uchar * pt,uchar num)
  473. {
  474.     uchar i;
  475.                
  476.     Write_Cmd(addr);         
  477.            for(i = 0;i < num;i++)
  478.            Write_Data(*(pt++));
  479. }
  480. void Ini_Lcd(void)
  481. {                  
  482.     //LCD_CMDOut;    //液晶控制端口設(shè)置為輸出
  483.    
  484.    // Delay_Nms(500);
  485.     Write_Cmd(0x30);   //基本指令集
  486.     Delay_1ms();
  487.     Write_Cmd(0x02);   // 地址歸位
  488.     Delay_1ms();
  489.     Write_Cmd(0x0c);   //整體顯示打開(kāi),游標(biāo)關(guān)閉
  490.     Delay_1ms();
  491.     Write_Cmd(0x01);   //清除顯示
  492.     Delay_1ms();    Write_Cmd(0x06);   //游標(biāo)右移
  493.     Delay_1ms();
  494.     Write_Cmd(0x80);   //設(shè)定顯示的起始地址
  495. }
  496. /*******************************************
  497. 函數(shù)名稱(chēng):Clear_GDRAM
  498. 功    能:清除液晶GDRAM中的隨機(jī)數(shù)據(jù)
  499. 參    數(shù):無(wú)
  500. 返回值  :無(wú)
  501. ********************************************/
  502. void Clear_GDRAM()
  503. {
  504.     uchar i,j,k;
  505.    
  506.         Write_Cmd(0x34);        //打開(kāi)擴(kuò)展指令集
  507.         i = 0x80;            
  508.         for(j = 0  ;j < 32;j++)
  509.         {
  510.         Write_Cmd(i++);
  511.         Write_Cmd(0x80);
  512.                   for(k = 0;k < 16;k++)
  513.                   {
  514.                       Write_Data(0x00);
  515.                   }
  516.         }
  517.         i = 0x80;
  518.         for(j = 0;j < 32;j++)
  519.         {
  520.             Write_Cmd(i++);
  521.         Write_Cmd(0x88);          
  522.                   for(k = 0;k < 16;k++)
  523.                   {
  524.                        Write_Data(0x00);
  525.                    }
  526.         }   
  527.         Write_Cmd(0x30);        //回到基本指令集
  528. }
  529. /*******************************************
  530. 函數(shù)名稱(chēng):Draw_TX
  531. 功    能:顯示一個(gè)16*16大小的圖形
  532. 參    數(shù):Yaddr--Y地址
  533.           Xaddr--X地址
  534.           dp--指向圖形數(shù)據(jù)存放地址的指針
  535. 返回值  :無(wú)
  536. ********************************************/
  537. void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
  538. {
  539.     uchar j;
  540.     uchar k=0;

  541.    // Write_Cmd(0x01);  //清屏,只能清除DDRAM
  542.     Write_Cmd(0x34);  //使用擴(kuò)展指令集,關(guān)閉繪圖顯示
  543.     for(j=0;j<16;j++)
  544.     {
  545.         Write_Cmd(Yaddr++);       //Y地址
  546.         Write_Cmd(Xaddr);    //X地址
  547.           Write_Data(dp[k++]);  
  548.           Write_Data(dp[k++]);
  549.     }
  550.     Write_Cmd(0x36);  //打開(kāi)繪圖顯示
  551.   //  Write_Cmd(0x30);  //回到基本指令集模式
  552. }
  553. /*******************************************
  554. 函數(shù)名稱(chēng):FRE()
  555. 功    能:對(duì)定時(shí)器內(nèi)的數(shù)據(jù)進(jìn)行處理,得出頻率
  556. 參    數(shù):
  557. 返回值  :無(wú)
  558. ********************************************/
  559. void choose()
  560. {
  561.   zhi = (zhi*3200)/4095;
  562.   zhi=zhi/2;
  563.   mami[1]=zhi/1000+0X30;
  564.   mami[2]=(zhi%1000)/100+0X30;
  565.   mami[3]=(zhi%1000)%100/10+0X30;
  566.   mami[4]=(zhi%1000)%100%10+0X30;
  567.   Disp_SZ(0x8d,mami+1,6);
  568.   Disp_SZ(0x98,mami,7);
  569.   max=0;
  570.   min=4095;
  571. }
  572. /*******************************************
  573. 函數(shù)名稱(chēng):FRE()
  574. 功    能:對(duì)定時(shí)器內(nèi)的數(shù)據(jù)進(jìn)行處理,得出頻率
  575. 參    數(shù):
  576. 返回值  :無(wú)
  577. ********************************************/
  578. void FRE()
  579. { uint temp2;
  580.   uchar temp1;
  581.   temp2=1000000/sum;
  582.   temp1=temp2/1000;
  583.   fre[0]=temp1+0x30;
  584.   temp2=temp2-temp1*1000;
  585.   temp1=temp2/100;
  586.   fre[1]=temp1+0x30;
  587.   temp2=temp2-temp1*100;
  588.   temp1=temp2/10;
  589.   fre[2]=temp1+0x30;
  590.   temp2=temp2-temp1*10;
  591.   fre[3]=temp2+0x30;
  592. }
  593. /*******************************************
  594. 函數(shù)名稱(chēng):COMPA()
  595. 功    能:比較器
  596. 參    數(shù):
  597. 返回值  :無(wú)
  598. ********************************************/
  599. void COMPA()
  600. {
  601.     P2SEL = 0x1c;        //P24 P23    P22分別為比較器輸入輸出
  602.     P2DIR = 0x04;    //
  603.     CACTL1 = CAON+CARSEL+CAREF_0 ;  //     使用外部參考電壓 一腳可以接地
  604.     CACTL2 = P2CA0+P2CA1+CAF;                   // 使用 CA0 CA1
  605. }
  606. /*******************************************
  607. 函數(shù)名稱(chēng):timer()
  608. 功    能:計(jì)數(shù)器處理
  609. 參    數(shù):
  610. 返回值  :無(wú)
  611. ********************************************/
  612. void timer()
  613. {
  614.          TACCTL1&=~CCIE;
  615.          P1IE=(BIT0+BIT4+BIT5+BIT6+BIT7);
  616.           flag=0;
  617.           tem++;
  618.           switch(tem)
  619.           {
  620.           case 1:{start=TACCR1;}break;
  621.           case 2:end=TACCR1;
  622.                  if(end>start)
  623.               {
  624.                 results[num]=(end-start);
  625.               }
  626.               else
  627.               {
  628.                 results[num]=(65536-start+end);
  629.               }
  630.               tem=0;
  631.               num++;
  632.               break;
  633.           }
  634.         Delay_1ms();  
  635.         TACCTL1|=CCIE;//以前是關(guān)總中斷 現(xiàn)在試試關(guān)定時(shí)器中斷   
  636.         if(num==32)
  637.         { uchar i;
  638.           for(i = 0; i < num; i++)
  639.           {
  640.             sum+=results[i];
  641.           }
  642.           sum >>=5;
  643.           FRE();
  644.           Disp_SZ(0x8A,fre,4);
  645.           sum=0;
  646.           num=0;
  647.           TACCTL1&=~CCIE;
  648.           Disp_HZ(0x9c,h3,4);
  649.          delay_ms(1000);
  650.          Disp_HZ(0x9c,h4,4);
  651.          P1IE&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
  652.           //ADC12IE   |=  0x01;
  653.           ADC12CTL0 |= ENC;//只能單位置位
  654.           TACCTL2 |=CCIE;
  655.           //_EINT();
  656.         }
  657.         
  658. }
  659. /*******************************************
  660. 函數(shù)名稱(chēng):Key
  661. 功    能:存儲(chǔ)
  662. 參    數(shù):
  663. 返回值  :無(wú)
  664. ********************************************/
  665. void Key(void)
  666. {
  667.   P1DIR&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
  668.   P1SEL&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
  669.   P1IES = BIT0+BIT4+BIT5+BIT6+BIT7;
  670. }
  671. /*******************************************
  672. 函數(shù)名稱(chēng):change
  673. 功    能:改變頻率和放大倍數(shù)
  674. 參    數(shù):
  675. 返回值  :無(wú)
  676. ********************************************/

  677. void change()
  678. {
  679.   zhi=max-min;
  680.   P5SEL = 0X00;
  681.   P5DIR = 0XFF;
  682.   ADC12CTL0 &= ~ENC;//置位0,DIV才能改
  683.   
  684.     if(longer<512)
  685.    {
  686.     ADC12CTL1 = ADC12DIV_0+SHP+CONSEQ_3;
  687.    }
  688.    else if(longer<1024)
  689.    {
  690.     ADC12CTL1 = ADC12DIV_1+SHP+CONSEQ_3;
  691.    }
  692.    else if(longer<1536)
  693.    {
  694.      ADC12CTL1 = ADC12DIV_2+SHP+CONSEQ_3;
  695.    }
  696.    else if(longer<2048)
  697.    {
  698.     ADC12CTL1 = ADC12DIV_3+SHP+CONSEQ_3;
  699.    }
  700.    else if(longer<2560)
  701.    {
  702.      ADC12CTL1 = ADC12DIV_4+SHP+CONSEQ_3;
  703.    }
  704.    else if(longer<3072)
  705.    {
  706.      ADC12CTL1 = ADC12DIV_5+SHP+CONSEQ_3;
  707.    }
  708.    else if(longer<3584)
  709.    {
  710.      ADC12CTL1 = ADC12DIV_6+SHP+CONSEQ_3;
  711.    }
  712.    else if(longer<4096)
  713.    {
  714.      ADC12CTL1 = ADC12DIV_7+SHP+CONSEQ_3;
  715.    }
  716.    ADC12CTL0 |= ENC;
  717.    ////////
  718.     if(biger<256)
  719.    {
  720.      P5OUT = 0x06;
  721.      zhi=zhi/156;
  722.    }
  723.    else if(biger<512)
  724.    {
  725.      P5OUT = 0x0e;
  726.      zhi=zhi/143;
  727.    }
  728.    else if(biger<786)
  729.    {
  730.      P5OUT = 0x16;
  731.      zhi=(zhi*27)/2600;
  732.    }
  733.    else if(biger<1024)
  734.    {
  735.      P5OUT = 0x1e;
  736.      zhi=(zhi*8)/1005;
  737.    }
  738.    else if(biger<1280)
  739.    {
  740.      P5OUT = 0x26;
  741.      zhi=zhi/78;
  742.    }
  743.    else if(biger<1536)
  744.    {
  745.      P5OUT = 0x2e;
  746.      //zhi=(zhi*9)/435;
  747.    }
  748.    else if(biger<1792)
  749.    {
  750.      P5OUT = 0x36;
  751.      zhi=(zhi*5)/119;
  752.    }
  753.    else if(biger<2048)
  754.    {
  755.      P5OUT = 0x3e;
  756.      zhi=(zhi*20)/97;
  757.    }
  758.    else if(biger<2304)
  759.    {
  760.      P5OUT = 0x07;
  761.      zhi=(zhi*15)/293;
  762.    }
  763.    else if(biger<2560)
  764.    {
  765.      P5OUT = 0x0f;
  766.      zhi=(zhi*44)/775;
  767.    }
  768.    else if(biger<2816)
  769.    {
  770.      P5OUT = 0x17;
  771.      zhi=(zhi*90)/1001;
  772.    }
  773.    else if(biger<3072)
  774.    {
  775.      P5OUT = 0x1f;
  776.      zhi=(zhi*75)/312;
  777.    }
  778.    else if(biger<3328)
  779.    {
  780.      P5OUT = 0x27;
  781.      zhi=(zhi*5)/48;
  782.    }
  783.    else if(biger<3584)
  784.    {
  785.      P5OUT = 0x2f;
  786.      zhi=(zhi*700)/4318;
  787.    }
  788.    else if(biger<3840)
  789.    {
  790.      P5OUT = 0x37;
  791.      zhi=(zhi*100)/322;
  792.    }
  793.    else if(biger<4096)
  794.    {
  795.      P5OUT = 0x3f;
  796.      zhi=(zhi*1000)/607;
  797.    }
  798.    
  799. }
  800. /*******************************************
  801. 函數(shù)名稱(chēng):write_Seg
  802. 功    能:存儲(chǔ)數(shù)據(jù)到某段FLASH
  803. 參    數(shù):
  804. 返回值  :無(wú)
  805. ********************************************/
  806. void write_Seg (uint add)
  807. {
  808.   uchar *Flash_ptr;                          // Flash pointer
  809.   uchar i;
  810.   Flash_ptr = (uchar *)add;              // Initialize Flash pointer
  811.   FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  812.   FCTL3 = FWKEY;
  813.   // Clear Lock bit
  814.   *Flash_ptr = 0;                           // Dummy write to erase Flash segment空寫(xiě)

  815.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  816.   for (i=0; i<128; i++)
  817.   {
  818.     *Flash_ptr++ = wavey[i];                   // Write value to flash
  819.   }

  820.   FCTL1 = FWKEY;                            // Clear WRT bit
  821.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  822. }
  823. /*******************************************
  824. 函數(shù)名稱(chēng):read_Seg
  825. 功    能:read_某段FLASH
  826. 參    數(shù):
  827. 返回值  :無(wú)
  828. ********************************************/
  829. void read_Seg(uint add)
  830. {
  831.   uchar *Flash_ptr;                         // Segment A pointer
  832.   uchar i;
  833.   Flash_ptr = (uchar *)add;
  834.   //FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  835.   //FCTL3 = FWKEY;                            // Clear Lock bit
  836.   *Flash_ptr = 0;                          // Dummy write to erase Flash segment B
  837.   //FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  838.   for (i=0; i<128; i++)
  839.   {
  840.     wavey[i] = *Flash_ptr++;
  841.   }

  842.   FCTL1 = FWKEY;                            // Clear WRT bit
  843.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  844. }
  845. /***************************主函數(shù)*************************/
  846. void main( void )  
  847. {   
  848.     P6SEL  = 0x00;
  849.     LCD_CMDOut;
  850.     WDTCTL = WDTPW + WDTHOLD;    //關(guān)狗
  851.     Key();
  852.     Clock_Init();
  853.     int_adc();
  854.     COMPA();
  855.     _EINT();
  856.     Ini_Lcd();                //初始化液晶
  857.     Clear_GDRAM();
  858.     Disp_SZ(0x80,h5,16);
  859.     Disp_HZ(0x90,h2,8);
  860.     Disp_SZ(0x88,h5,16);
  861.     delay_ms(1000);
  862.     Write_Cmd(0x01);   //清除漢字顯示
  863.     Delay_1ms();
  864.     Disp_HZ(0x88,h0,2);
  865.     //while(1)
  866.     //{      
  867.       _NOP();
  868.      int_CAP();   //波形顯示完成后在初始化
  869.    // }
  870.     // _BIS_SR(CPUOFF + GIE);                  // LPM0, ADC12_ISR will force exit
  871.   
  872.    
  873.     //write_Seg(0x1080);
  874. }
  875. /*******************************************
  876. 函數(shù)名稱(chēng):ADC中斷
  877. 功    能:進(jìn)入中斷程序,處理采集到的數(shù)據(jù)
  878. 參    數(shù):
  879. 返回值  :無(wú)
  880. ********************************************/
  881. #pragma vector=ADC_VECTOR  // ADC12 interrupt service rout ine
  882. __interrupt void ADC12ISR (void)
  883. {   ADC12IE &= ~ 0x04; // Enable interrupt關(guān)中斷不可以!。。!
  884.     TACCTL2&=~CCIE;//
  885.     uchar y=0;
  886.     if(max<ADC12MEM2)
  887.     {
  888.       max=ADC12MEM2;
  889.     }
  890.     if(min>ADC12MEM2)
  891.     {
  892.       min=ADC12MEM2;
  893.     }
  894.     ad = ADC12MEM2;
  895.     biger = ADC12MEM1;
  896.     longer = ADC12MEM0;
  897.     ad >>=7;
  898.     wavey[index++] = ad;
  899.     if(index==127)
  900.     {  
  901.        index=0;
  902.        ADC12CTL0 &= ~ ADC12SC;
  903.       
  904.        ADC12CTL0 &= ~ENC;//停止轉(zhuǎn)化
  905.        Clear_GDRAM();
  906.       for (m=0;m<127;m++)
  907.              {
  908.               uchar Oldx,Oldy ;
  909.               Draw_point((m*h),(31*(h-1)/h+wavey[y]/h),1);
  910.               Oldx=(uchar)(m*h);
  911.               Oldy=(uchar)(31*(h-1)/h+wavey[y]/h);
  912.               drawLine(Oldx,Oldy,((m+1)*h+0),(31*(h-1)/h+wavey[++y]/h),1);
  913.               }
  914.       change();//把轉(zhuǎn)換通道換一下
  915.       choose();
  916.       TACCTL1|=CCIE;
  917.       _NOP();
  918.     }
  919.    ADC12IE |=  0x04;                  
  920. }
  921. /*******************************************
  922. 函數(shù)名稱(chēng):定時(shí)器中斷
  923. 功    能:讀取定時(shí)器數(shù)據(jù)
  924. 參    數(shù):
  925. 返回值  :無(wú)
  926. ********************************************/
  927. #pragma vector=TIMERA1_VECTOR
  928. __interrupt void Timer_A(void)
  929. {
  930.   switch( TAIV )
  931.   {
  932.     case  2: {timer();}break;                           
  933.     case  4: ADC12CTL0 |= ADC12SC; break;  //重新打開(kāi)使能 32次轉(zhuǎn)換完成之后再開(kāi)始ADC                    
  934.     case 10:  break;               
  935.               
  936.   }
  937. }
  938. #pragma vector=PORT1_VECTOR
  939. __interrupt void KeyBord(void)
  940. {
  941.    if((P1IFG&BIT7)!=0)
  942.   {   
  943.       Write_Cmd(0x01);   //清除漢字顯示
  944.       Delay_1ms();
  945.       Disp_HZ(0x88,h0,2);
  946.       
  947.       P1IFG&=~BIT5;//清處中斷標(biāo)志
  948.       P1IFG&=~BIT6;//清處中斷標(biāo)志
  949.       P1IFG&=~BIT7;//清處中斷標(biāo)志
  950.       
  951.   }
  952.   else if((P1IFG&BIT5)!=0)
  953.   {
  954.       Clear_GDRAM();
  955.       Write_Cmd(0x01);   //清除顯示
  956.       Delay_1ms();
  957.       uchar y=0;
  958.       read_Seg(0x1000);
  959.       for (m=0;m<127;m++)
  960.              {
  961.               uchar Oldx,Oldy ;
  962.               Draw_point((m*h),(31*(h-1)/h+wavey[y]/h),1);
  963.               Oldx=(uchar)(m*h);
  964.               Oldy=(uchar)(31*(h-1)/h+wavey[y]/h);
  965.               drawLine(Oldx,Oldy,((m+1)*h+0),(31*(h-1)/h+wavey[++y]/h),1);
  966.               }
  967.   }     
  968.   else if((P1IFG&BIT6)!=0)
  969.   {   Clear_GDRAM();
  970.       Write_Cmd(0x01);   //清除顯示
  971.       Delay_1ms();
  972.       uchar y=0;
  973.       read_Seg(0x1080);
  974.       for (m=0;m<127;m++)
  975.              {
  976.               uchar Oldx,Oldy ;
  977.               Draw_point((m*h),(31*(h-1)/h+wavey[y]/h),1);
  978.               Oldx=(uchar)(m*h);
  979.               Oldy=(uchar)(31*(h-1)/h+wavey[y]/h);
  980.               drawLine(Oldx,Oldy,((m+1)*h+0),(31*(h-1)/h+wavey[++y]/h),1);
  981.               }
  982.   }   
  983.   
  984.   else if((P1IFG&BIT4)!=0)
  985.   {
  986.       
  987.       Clear_GDRAM();
  988.       Write_Cmd(0x01);   //清除顯示
  989.       Delay_1ms();
  990.       Disp_HZ(0x80,h1,6);
  991.       if(c==1)
  992.       {
  993.        write_Seg (0x1000);
  994.         c=2;
  995.       }
  996.       else if(c==2)
  997.       {
  998.       write_Seg (0x1080);
  999.          c=1;
  1000.       }
  1001.       
  1002.       //Disp_HZ(0x88,h2,8);
  1003.       delay_ms(1000);
  1004.       Write_Cmd(0x01);   //清除漢字顯示
  1005.       Delay_1ms();
  1006.       Disp_HZ(0x88,h0,2);
  1007.       P1IFG&=~BIT4;//清處中斷標(biāo)志
  1008.   } else if((P1IFG&BIT0)!=0)
  1009.      {
  1010.     Clear_GDRAM();
  1011.     Write_Cmd(0x01);   //清除顯示
  1012.     Delay_1ms();
  1013.     int i;
  1014.     for(i=0;i<N_point;i++)
  1015.     {
  1016.       data_I[i]=0;
  1017.    
  1018.     }
  1019.     fft_128();
  1020.     for(i=0;i<128;i++)
  1021.     {
  1022.       wavey[i]=(unsigned int)sqrt(data_R[i]*data_R[i]+data_I[i]*data_I[i])/32;
  1023.     }
  1024.     for(i=0;i<128;i++)
  1025.     {  //drawCollumLine(i,(31*(h-1)/h+wavey[i]/h),31,1);
  1026.        Draw_point(i,1,1);
  1027.        Draw_point(i,(31*(h-1)/h+wavey[i]/h),1);
  1028.        drawLine(i,(31*(h-1)/h+wavey[i]/h),i,1,1);
  1029.     }
  1030.     _NOP();
  1031.     delay_ms(1000);
  1032.     Disp_HZ(0x88,h0,2);
  1033.    P1IFG&=~BIT0;//清處中斷標(biāo)志
  1034.   }     
  1035.   
  1036. }


復(fù)制代碼

所有資料51hei提供下載:
基于MSP430的數(shù)字存儲(chǔ)示波器的設(shè)計(jì)與實(shí)現(xiàn)程序.docx (22.28 KB, 下載次數(shù): 14)



作者: admin    時(shí)間: 2018-11-8 03:08
補(bǔ)全原理圖或者詳細(xì)說(shuō)明一下電路連接即可獲得100+黑幣




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1