找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1096|回复: 1
打印 上一主题 下一主题
收起左侧

基于MSP430的数字存储示波器的设计与实现程序

[复制链接]
跳转到指定楼层
楼主
ID:422488 发表于 2018-11-7 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /*******************************************
  2. 方案1需要按复位键即每次只能采样128次  
  3. 方案2加一个软件触发,从固定位置触发
  4. 各种中断形成一个  循环!!上一个中断完成再触发下一个中断
  5. ********************************************/
  6. #include <msp430x16x.h>
  7. #include "math.h"
  8. extern unsigned int N_point;             //点数
  9. extern unsigned char M_grade;            //阶数
  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];         //实部
  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;//中断函数中的计数变量,定义成全局
  35. uchar tempH,tempL,color=1;
  36. uint wavey[128];
  37. #define LCD_DataIn    P4DIR=0x00    //数据口方向设置为输入
  38. #define LCD_DataOut   P4DIR=0xff    //数据口方向设置为输出
  39. #define LCD2MCU_Data  P4IN
  40. #define MCU2LCD_Data  P4OUT
  41. #define LCD_CMDOut    P6DIR|=0xFF     //P3口的低三位设置为输出
  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. 函数名称:int_CAP()
  50. 功    能:初始化触发器!!只打开触发引脚P13
  51. 参    数:无
  52. 返回值  :无
  53. ********************************************/
  54. void int_CAP()
  55. {
  56.   P1SEL = 0x0C;//P12P13作为捕获输入端子
  57.   P1DIR = 0x00;
  58.   TACCTL1|=CM_2+SCS+CAP;//P12下升沿触发捕获,同步模式 不开中断
  59.   TACCTL2|=CM_1+SCS+CAP+CCIE;//P13上升沿触发捕获,同步模式
  60.   TACTL|=TASSEL_2+MC_2;//SMCLK作为计数脉冲,不分频
  61. }
  62. /*******************************************
  63. 函数名称:Clock_Init()
  64. 功    能:初始化时钟
  65. 参    数:无
  66. 返回值  :无
  67. ********************************************/
  68. void  Clock_Init()                       //时钟初始化
  69. {
  70.   uchar i;
  71.   BCSCTL1&=~XT2OFF;                 //打开XT振荡器
  72.   BCSCTL2|=SELM1+SELS+DIVS_3;              //MCLK为8MHZ,SMCLK为1MHZ
  73.   do
  74.   {
  75.     IFG1&=~OFIFG;                   //清除震荡标志
  76.     for(i=0;i<100;i++)
  77.        _NOP();                      //延时等待
  78.   }
  79.   while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
  80.   IFG1&=~OFIFG;
  81. }
  82. /*******************************************
  83. 函数名称:int_adc()
  84. 功    能:初始化ADC
  85. 参    数:无
  86. 返回值  :无
  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停止第一轮转化
  97.   ADC12IE = 0x04;   //中断最后一个使能                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               // Enable interrupt
  98.   ADC12CTL0 |= ENC;                         // 转化 enabled
  99.   
  100. }
  101. /*******************************************
  102. 函数名称:Delay_1ms
  103. 功    能:延时约1ms的时间
  104. 参    数:无
  105. 返回值  :无
  106. ********************************************/
  107. void Delay_1ms(void)
  108. {
  109.         uchar i;
  110.    
  111.         for(i = 150;i > 0;i--)  _NOP();
  112. }
  113. /*******************************************
  114. 函数名称:fft_128()
  115. 功    能:fft变换
  116. 参    数:无
  117. 返回值  :无
  118. ********************************************/
  119. void fft_128()
  120. { float tab_sin_128[128]={   //正玄表 旋转因子所在
  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;//临时变量
  155.   int P,Q;//cos sin 在sintab中的位置  旋转因子
  156.   float data_R_J,data_I_J,data_R_JB,data_I_JB;//临时变量 存放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级
  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个蝶形   第J=J+2*B个交叉蝶形  因为没两个交叉蝶形相距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个交叉蝶形
  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. 函数名称:Delay_Nms
  191. 功    能:延时N个1ms的时间
  192. 参    数:n--延时长度
  193. 返回值  :无
  194. ********************************************/
  195. void Delay_Nms(uint n)
  196. {
  197.     uint i;
  198.    
  199.     for(i = n;i > 0;i--)    Delay_1ms();
  200. }
  201. /*******************************************
  202. 函数名称:Write_Cmd
  203. 功    能:向液晶中写控制命令
  204. 参    数:cmd--控制命令
  205. 返回值  :无
  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. 函数名称:Write_Data
  233. 功    能:向液晶中写显示数据
  234. 参    数:dat--显示数据
  235. 返回值  :无
  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. 函数名:  drawPoint
  288. 函数说明:画点
  289. 传入参数:打点位置(x0,y0);color=1,点亮;color=0,擦除
  290. 传出参数:无
  291. 返回值:  无
  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. 函数名:  drawRowLine
  342. 函数说明:画水平线
  343. 传入参数:(x0,y0),水平线的起点;(x1,y0)水平线的终点
  344.                                 color=1,点亮;color=0,擦除
  345. 传出参数:无
  346. 返回值:  无
  347. **********************************************************/
  348. void drawRowLine(uchar x0,uchar y0,uchar x1,uchar color)
  349. {
  350.     do
  351.     {
  352.         Draw_point(x0, y0, color);        // 逐点显示,描出垂直线
  353.         x0++;
  354.     }
  355.     while(x1>=x0);
  356. }
  357. /***********************************************************
  358. 函数名:  drawCollumLine
  359. 函数说明:画竖直线
  360. 传入参数:(x0,y0),竖直线的起点;(x1,y0)竖直线的终点;
  361.                         color=1,点亮;color=0,擦除
  362. 传出参数:无
  363. 返回值:  无
  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. 函数名:  drawLine
  375. 函数说明:使用Bresenham法,画任意两点间的直线
  376. 传入参数:(x0,y0),竖直线的起点;(x1,y1)竖直线的终点 color=1,点亮;color=0,擦除
  377. 传出参数:无
  378. 返回值:  无
  379. **********************************************************/
  380. void drawLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
  381. {  
  382.   uchar tempx,tempy;
  383.   if(x0>x1)                                 // 对x0、x1大小进行排列,以便画图
  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轴增长方向,为-1时减值方向,为1时增值方向
  398.    char   dy_sym;        // y轴增长方向,为-1时减值方向,为1时增值方向
  399.    int   dx_2;                // dx*2值变量,用于加快运算速度
  400.    int   dy_2;                // dy*2值变量,用于加快运算速度
  401.    int   di;                // 决策变量

  402.    dx = x1-x0;                // 求取两点之间的差值
  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. 函数名称:Disp_HZ
  455. 功    能:控制液晶显示汉字
  456. 参    数:addr--显示位置的首地址
  457.           pt--指向显示数据的指针
  458.           num--显示字符个数
  459. 返回值  :无
  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. 数字
  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;    //液晶控制端口设置为输出
  483.    
  484.    // Delay_Nms(500);
  485.     Write_Cmd(0x30);   //基本指令集
  486.     Delay_1ms();
  487.     Write_Cmd(0x02);   // 地址归位
  488.     Delay_1ms();
  489.     Write_Cmd(0x0c);   //整体显示打开,游标关闭
  490.     Delay_1ms();
  491.     Write_Cmd(0x01);   //清除显示
  492.     Delay_1ms();    Write_Cmd(0x06);   //游标右移
  493.     Delay_1ms();
  494.     Write_Cmd(0x80);   //设定显示的起始地址
  495. }
  496. /*******************************************
  497. 函数名称:Clear_GDRAM
  498. 功    能:清除液晶GDRAM中的随机数据
  499. 参    数:无
  500. 返回值  :无
  501. ********************************************/
  502. void Clear_GDRAM()
  503. {
  504.     uchar i,j,k;
  505.    
  506.         Write_Cmd(0x34);        //打开扩展指令集
  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. 函数名称:Draw_TX
  531. 功    能:显示一个16*16大小的图形
  532. 参    数:Yaddr--Y地址
  533.           Xaddr--X地址
  534.           dp--指向图形数据存放地址的指针
  535. 返回值  :无
  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);  //使用扩展指令集,关闭绘图显示
  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);  //打开绘图显示
  551.   //  Write_Cmd(0x30);  //回到基本指令集模式
  552. }
  553. /*******************************************
  554. 函数名称:FRE()
  555. 功    能:对定时器内的数据进行处理,得出频率
  556. 参    数:
  557. 返回值  :无
  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. 函数名称:FRE()
  574. 功    能:对定时器内的数据进行处理,得出频率
  575. 参    数:
  576. 返回值  :无
  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. 函数名称:COMPA()
  595. 功    能:比较器
  596. 参    数:
  597. 返回值  :无
  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. 函数名称:timer()
  608. 功    能:计数器处理
  609. 参    数:
  610. 返回值  :无
  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;//以前是关总中断 现在试试关定时器中断   
  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. 函数名称:Key
  661. 功    能:存储
  662. 参    数:
  663. 返回值  :无
  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. 函数名称:change
  673. 功    能:改变频率和放大倍数
  674. 参    数:
  675. 返回值  :无
  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. 函数名称:write_Seg
  802. 功    能:存储数据到某段FLASH
  803. 参    数:
  804. 返回值  :无
  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空写

  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. 函数名称:read_Seg
  825. 功    能:read_某段FLASH
  826. 参    数:
  827. 返回值  :无
  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. /***************************主函数*************************/
  846. void main( void )  
  847. {   
  848.     P6SEL  = 0x00;
  849.     LCD_CMDOut;
  850.     WDTCTL = WDTPW + WDTHOLD;    //关狗
  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. 函数名称:ADC中断
  877. 功    能:进入中断程序,处理采集到的数据
  878. 参    数:
  879. 返回值  :无
  880. ********************************************/
  881. #pragma vector=ADC_VECTOR  // ADC12 interrupt service rout ine
  882. __interrupt void ADC12ISR (void)
  883. {   ADC12IE &= ~ 0x04; // Enable interrupt关中断不可以!!!!!
  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;//停止转化
  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();//把转换通道换一下
  915.       choose();
  916.       TACCTL1|=CCIE;
  917.       _NOP();
  918.     }
  919.    ADC12IE |=  0x04;                  
  920. }
  921. /*******************************************
  922. 函数名称:定时器中断
  923. 功    能:读取定时器数据
  924. 参    数:
  925. 返回值  :无
  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;  //重新打开使能 32次转换完成之后再开始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;//清处中断标志
  948.       P1IFG&=~BIT6;//清处中断标志
  949.       P1IFG&=~BIT7;//清处中断标志
  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;//清处中断标志
  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;//清处中断标志
  1034.   }     
  1035.   
  1036. }


复制代码

所有资料51hei提供下载:
基于MSP430的数字存储示波器的设计与实现程序.docx (22.28 KB, 下载次数: 13)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-11-8 03:08 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表