找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32的初步PWM和ADC采集测量方波 示波器源程序

[复制链接]
跳转到指定楼层
楼主
自己写了一个比较随意的一个类似于一个示波器的项目  也有许多不对的地方请各位大佬进行点评 和指正 也请大家不要用于商业用途 仅供讨论和交流 遵守
GPL3的开源协议 内含原理图等信息

制作出来的实物图如下:


所有资料51hei提供下载:
PWM测量ADC读取.7z (455.08 KB, 下载次数: 24)

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "bsp_usart.h"
  5. #include "bsp_dma_mtm.h"
  6. #include "bsp_dma_mtp.h"
  7. #include "bsp_adc.h"
  8. #include "bsp_tim2.h"
  9. #include  "LCD12864.h"
  10. #include  "keypad.h"
  11. #include "BUZZER.h"
  12. #include "bsp_basic_tim.h"
  13. #include "bsp_AdvanceTim.h"
  14. #include "timer.h"
  15. #include "pingfan.h"

  16. extern const uint32_t aSRC_Const_Buffer[BUFFER_SIZE];
  17. extern uint32_t aDST_Buffer[BUFFER_SIZE];
  18. extern uint8_t DMA_USART_SendBuff[SENDBUFF_SIZE];

  19. // 局部变量,用于保存转换计算后的电压值         
  20. float ADC_ConvertedValueLocal[NOFCHANEL];  

  21. //uint8_t ADC_Value_bai,ADC_Value_shi,ADC_Value_ge;





  22. /////////////////////标志位///////////////////////////////////////////////
  23. unsigned char con_flag=0; //页面标志
  24. unsigned int shan=0;                 //PRESS ENTER 闪烁
  25. unsigned int shan0=0;
  26. unsigned int shan1=0;
  27. unsigned int shan2=0;
  28. unsigned int shan3=0;
  29. unsigned int shan4=0;
  30. unsigned int shan5=0;
  31. unsigned int shan6=0;

  32. int move=0;

  33. /////////////////////设定值/////////////////////////////////////////////
  34. uint16_t year_set[4]={0};
  35. uint8_t  month_set[2]={0};
  36. uint8_t  day_set[2]={0};

  37. uint8_t  hour_set[2]={0};
  38. uint8_t  minute_set[2]={0};
  39. uint8_t  second_set[2]={0};

  40. uint8_t  rate_set[3]={0};

  41. /////////////////////////////////////////////////////////////////////


  42. ////////////////////////////////////////////////////////////////////

  43. char sz[]={"0123456789."}; //显示数字数组

  44. ////////////////////////////////////////////////////////////////////

  45. u16 cout;
  46. unsigned char jm1_flag=0,jm2_flag=0,JG_1=2,JG_2=2,flag_1=0;
  47. // ADC1转换的电压值通过MDA方式传到SRAM
  48. //extern __IO uint32_t ADC_ConvertedValue[NOFCHANEL];
  49. int zhongliang=234;
  50. // 局部变量,用于保存转换计算后的电压值         
  51. //uint32_t ADC_ConvertedValueLocal[NOFCHANEL*2];   
  52. //float ADC_ConvertedValueLocal[NOFCHANEL*2];   
  53. extern unsigned char        key_val;

  54. //////////////////////////////////////ADC1的电压的全局变量 ////////////////////////////////////////
  55. //          ADC累加求平均数                                
  56. float ADC_average_value=0;
  57. //float ADC_average_value_1=0;
  58. //   ADC测得的峰峰值
  59. float ADC_VVP_Date=0;
  60. //峰峰值扩大1000倍存储变量
  61. uint32_t ADC_VVP_Date1=0;
  62. //峰峰值数据拆分变量
  63. uint8_t ADC_VVP_Date2[9]={0};
  64. //ADC累加平均数扩大1000倍存储变量
  65. uint32_t ADC_average_value1=0;
  66. //ADC累加平均数拆分变量
  67. uint8_t ADC_average_value2[9]={0};
  68. //ADC有效值
  69. float ADC_VPP_Valid=0;
  70. //ADC有效值的中间累加用的数组变量       累加计数用的变量
  71. float ADC_VPP_Valid_1[20]={0};                  uint8_t ADC_i=0;

  72. ////ADC有效值放大1000倍变量
  73. uint32_t ADC_VPP_Valid1=0;
  74. ////ADC有效值放大1000倍变量
  75. uint8_t ADC_VPP_Valid2[9]={0};

  76. ///////////////////////////////////////////////////////////////////////////////////////////



  77. /////////////////////////////ADC3的电压的全局变量//////////////////////////////////////////////////
  78. //ADC3的CH11的浮点值
  79. float ADC_3_CH11_Value_Date=0;
  80. //ADC3的CH12的浮点值
  81. float ADC_3_CH12_Value_Date=0;
  82. //ADC3的CH11的浮点放大1000倍接收值
  83. uint32_t ADC_3_CH11_Value_Date1=0;
  84. //ADC3的CH11的放大值拆分数组
  85. uint8_t ADC_3_CH11_Value_Date2[9]={0};
  86. //ADC3的CH12的浮点放大1000倍接收值
  87. uint32_t ADC_3_CH12_Value_Date1=0;
  88. //ADC3的CH12的放大值拆分数组
  89. uint8_t ADC_3_CH12_Value_Date2[9]={0};


  90. /////////////////////////////////////////////////////////////////////////////////////////////


  91. //////////////////////频率数值拆分变量/包含显示符号/////////////////////////
  92. uint8_t TIM2_Capture_Freq_Date[9]={0}; //TIM2频率拆分
  93. uint8_t  TIM2_Capture_Cycle1_Date[9]={0}; //TIM2周期拆分
  94. uint8_t  TIM5_Capture_Pulse_Date[9]={0}; //TIM5脉宽时间
  95. float TIM5_TIM2_Duty_Date=0;                        //TIM5采集的脉宽时间和TIM2测得的周期时间的比值的占空比存储变量
  96. uint32_t TIM5_TIM2_Duty_Date1=0;                //TIM5采集的脉宽时间和TIM2测得的周期时间的比值的占空比存储变量扩大后的存储变量
  97. uint8_t TIM5_TIM2_Duty_Date2[9]={0};        //占空比的数据拆分变量


  98. /////////////////////////////////////////////////////////////



  99. ////////////////////////////////////ADC求平均值函数////////////////////////////////////////////////
  100. void ADC_average(void)
  101. {
  102.         uint16_t i;
  103.         float ADC_average_sum=0;

  104.         for(i=0;i<200;i++)
  105.         {
  106.                 ADC_average_sum=ADC_average_sum+((float)ADC_ConvertedValue[i]/4096*3.3);
  107.         }
  108.         ADC_average_value=ADC_average_sum/200;

  109. }

  110. //////////////////////////////冒泡排序法选出最大的ADC电压值函数//////////////////////////////////////////
  111. float ADC_average_Max(void)
  112. {
  113. //    int sort[6]={1,2,3,2,3,4};
  114.         //lenth改变数组的参考长度 排序代码反复利用
  115.         uint16_t lenth=200;
  116.         uint16_t sort[200];
  117.         uint16_t sun;
  118.         for(sun=0;sun<lenth;sun++)
  119.         {
  120.                 //sort[sun]=((float)ADC_ConvertedValue[sun]/4096*3.3);
  121.                 sort[sun]=ADC_ConvertedValue[sun];
  122.         }        
  123.     uint16_t temp, i, j;//i是数组下标,j是比较次数
  124.     //printf("请输入6个数字:\n");

  125. //    for (i = 0; i < 6; i++)
  126. //    {
  127. //        scanf("%d", &sort[i]);
  128. //    }

  129.     //printf("\n");
  130.     for (j = 0; j < (lenth-1); j++)//6个数字总共排5趟  200个数字总共排199趟
  131.     {
  132.         for (i = 0; i < (lenth-1) - j; i++)//每一趟交换5-j次
  133.         if (sort[i] > sort[i + 1])
  134.         {
  135.             temp = sort[i];
  136.             sort[i] = sort[i + 1];
  137.             sort[i + 1] = temp;//找出两个数中最小的的交换
  138.         }
  139.     }
  140.     //printf("排序之后的:\n");
  141.     //for (i = 0; i < lenth; i++)
  142.         //printf("%f \r\n", sort[i]);
  143.     //printf("pause");
  144. //    return sort[199];        
  145.         
  146.         //ADC的VPP峰值赋值
  147.         ADC_VVP_Date=((float)sort[199]/4096*3.3);        
  148.         //ADC的有效值中间变量数组赋值
  149.         if(ADC_i<15)
  150.         {
  151.                 ADC_VPP_Valid_1[ADC_i]=ADC_VVP_Date;
  152.                 ADC_i++;
  153.         }
  154.         else{ ADC_i=0;};//清0
  155.         
  156.         return ADC_VVP_Date;
  157. }

  158. ///////////////////////////////////累加20次峰峰值求平均稳定的有效值计算函数////////////////////////////////////////
  159. void ADC_VPP_Valid_Date(void)
  160. {
  161.         uint16_t i;
  162.         for(i=0;i<15;i++)
  163.         {
  164. //                ADC_average_Max();
  165.                
  166.                 ADC_VPP_Valid+=ADC_VPP_Valid_1[i];               
  167.         }
  168.         
  169. //        ADC_VPP_Valid=ADC_VPP_Valid/20/1.414;        
  170.         ADC_VPP_Valid=ADC_VPP_Valid/15/1.414;        
  171. }



  172. ////////////////////////////////////////频率数值拆分处理函数/////////////////////////////////////////////////
  173. void TIM2_Capture_Freq_Date_Manage(void)
  174. {
  175.         //频率TIM2_Capture_Freq数据拆分
  176.         TIM2_Capture_Freq_Date[0]=TIM2_Capture_Freq/100000%10; //100KHz
  177.         TIM2_Capture_Freq_Date[1]=TIM2_Capture_Freq/10000%10; //10KHz
  178.         TIM2_Capture_Freq_Date[2]=TIM2_Capture_Freq/1000%10; //1KHz        
  179.         TIM2_Capture_Freq_Date[3]=TIM2_Capture_Freq/100%10; //100Hz
  180.         TIM2_Capture_Freq_Date[4]=TIM2_Capture_Freq/10%10; //10Hz
  181.         TIM2_Capture_Freq_Date[5]=TIM2_Capture_Freq%10; //10Hz
  182.         
  183. //        TIM2_Capture_Freq_Date[6]='H';
  184. //        TIM2_Capture_Freq_Date[7]='z';
  185.         
  186.         //周期TIM2_Capture_Cycle1拆分
  187.         TIM2_Capture_Cycle1_Date[0]=TIM2_Capture_Cycle1/1000000%10; //1000000us
  188.         TIM2_Capture_Cycle1_Date[1]=TIM2_Capture_Cycle1/100000%10; //100000us
  189.         TIM2_Capture_Cycle1_Date[2]=TIM2_Capture_Cycle1/10000%10; //10000us
  190.         TIM2_Capture_Cycle1_Date[3]=TIM2_Capture_Cycle1/1000%10; //1000us
  191.         TIM2_Capture_Cycle1_Date[4]=TIM2_Capture_Cycle1/100%10; //100us
  192.         TIM2_Capture_Cycle1_Date[5]=TIM2_Capture_Cycle1/10%10; //10us
  193.         TIM2_Capture_Cycle1_Date[6]=TIM2_Capture_Cycle1%10; //1us
  194.         
  195.         //TIM5脉宽时间temp拆分
  196.         TIM5_Capture_Pulse_Date[0]=temp/1000000%10; //1000000us
  197.         TIM5_Capture_Pulse_Date[1]=temp/100000%10; //100000us
  198.         TIM5_Capture_Pulse_Date[2]=temp/10000%10; //10000us
  199.         TIM5_Capture_Pulse_Date[3]=temp/1000%10; //1000us
  200.         TIM5_Capture_Pulse_Date[4]=temp/100%10; //100us
  201.         TIM5_Capture_Pulse_Date[5]=temp/10%10; //10us
  202.         TIM5_Capture_Pulse_Date[6]=temp%10; //1us
  203.         
  204.         //TIM5采集的脉宽时间和TIM2测得的周期时间的数据拆分
  205.         TIM5_TIM2_Duty_Date=(temp*100.0/TIM2_Capture_Cycle1)*10; //小数扩大100倍要整数 再取扩大10倍要小数点的后一位
  206.         TIM5_TIM2_Duty_Date1=(uint32_t)TIM5_TIM2_Duty_Date/1;
  207.         
  208.         //TIM2和TIM5的占空比的数据拆分
  209.         TIM5_TIM2_Duty_Date2[0]=TIM5_TIM2_Duty_Date1/1000000%10; //1000000us
  210.         TIM5_TIM2_Duty_Date2[1]=TIM5_TIM2_Duty_Date1/100000%10; //100000us
  211.         TIM5_TIM2_Duty_Date2[2]=TIM5_TIM2_Duty_Date1/10000%10; //10000us
  212.         TIM5_TIM2_Duty_Date2[3]=TIM5_TIM2_Duty_Date1/1000%10; //1000us
  213.         TIM5_TIM2_Duty_Date2[4]=TIM5_TIM2_Duty_Date1/100%10; //100us
  214.         TIM5_TIM2_Duty_Date2[5]=TIM5_TIM2_Duty_Date1/10%10; //10us
  215.         TIM5_TIM2_Duty_Date2[6]=TIM5_TIM2_Duty_Date1%10; //1us
  216.                
  217.         //ADC的峰峰值拆分
  218. //        ADC_VVP_Date1=(uint32_t)((ADC_VVP_Date/1)*1000);
  219. //        ADC_VVP_Date1=(uint32_t)ADC_VVP_Date*1000;//只是用了前面的整数进行扩大忽略了小数部分
  220.         ADC_VVP_Date1=(uint32_t)(ADC_VVP_Date*1000); //先是扩大了1000小数没有丢掉        
  221.         ADC_VVP_Date2[0]=ADC_VVP_Date1/100000%10; //100000mV
  222.         ADC_VVP_Date2[1]=ADC_VVP_Date1/10000%10; //10000mV
  223.         ADC_VVP_Date2[2]=ADC_VVP_Date1/1000%10; //1000mV
  224.         ADC_VVP_Date2[3]=ADC_VVP_Date1/100%10; //100mV
  225.         ADC_VVP_Date2[4]=ADC_VVP_Date1/10%10; //10mV
  226.         ADC_VVP_Date2[5]=ADC_VVP_Date1%10; //1mV
  227.         
  228.         
  229.         //ADC的累加平均值的数据拆分
  230.         ADC_average_value1=(uint32_t)( ADC_average_value*1000);
  231.         ADC_average_value2[0]=ADC_average_value1/1000%10; //1000mV
  232.         ADC_average_value2[1]=ADC_average_value1/100%10; //100mV
  233.         ADC_average_value2[2]=ADC_average_value1/10%10; //10mV
  234.         ADC_average_value2[3]=ADC_average_value1%10;   //1mV
  235.         
  236.         //ADC的有效值放大1000倍
  237.         ADC_VPP_Valid1=(uint32_t)(ADC_VPP_Valid/1*1000);
  238.         //ADC的有效值放大1000倍数据拆分
  239.         ADC_VPP_Valid2[0]=ADC_VPP_Valid1/1000%10;  //1000mV
  240.         ADC_VPP_Valid2[1]=ADC_VPP_Valid1/100%10;  //100mV
  241.         ADC_VPP_Valid2[2]=ADC_VPP_Valid1/10%10;  //10mV
  242.         ADC_VPP_Valid2[3]=ADC_VPP_Valid1%10;    //1mV
  243.                
  244.         //ADC3的CH11浮点扩大1000倍        
  245.         ADC_3_CH11_Value_Date1=(uint32_t)(ADC_3_CH11_Value_Date*1000);
  246.         //ADC3的CH11浮点值放大1000倍数据拆分
  247.         ADC_3_CH11_Value_Date2[0]=ADC_3_CH11_Value_Date1/1000%10; //1000 mV
  248.         ADC_3_CH11_Value_Date2[1]=ADC_3_CH11_Value_Date1/100%10; //100 mV
  249.         ADC_3_CH11_Value_Date2[2]=ADC_3_CH11_Value_Date1/10%10; //10 mV
  250.         ADC_3_CH11_Value_Date2[3]=ADC_3_CH11_Value_Date1%10;         //1 mV
  251.         
  252.         //ADC3的CH12浮点扩大1000倍        
  253.         ADC_3_CH12_Value_Date1=(uint32_t)(ADC_3_CH12_Value_Date*1000);
  254.         //ADC3的CH12浮点值放大1000倍数据拆分
  255.         ADC_3_CH12_Value_Date2[0]=ADC_3_CH12_Value_Date1/1000%10; //1000 mA
  256.         ADC_3_CH12_Value_Date2[1]=ADC_3_CH12_Value_Date1/100%10; //100 mA
  257.         ADC_3_CH12_Value_Date2[2]=ADC_3_CH12_Value_Date1/10%10; //10 mA
  258.         ADC_3_CH12_Value_Date2[3]=ADC_3_CH12_Value_Date1%10; //1 mA
  259.         
  260. }



  261. ///////////////////////////////////////////////////////////////////////////////////////////////
  262. void key_por1()
  263. {
  264.                 //四个独立按键的处理
  265.          if(press_flag3==1)                      //确定键
  266.                 {
  267.                         if(press_flag3==1&&con_flag==0)
  268.                                 LCD_Clear_Screen();
  269.                                 con_flag=1;
  270.                
  271.                 }
  272.                 else if(press_flag4==1)                   //返回键
  273.                 {
  274.                         if(press_flag4==1&&(con_flag==2||con_flag==3||con_flag==4||con_flag==5))
  275.                         {
  276.                                 LCD_Clear_Screen();
  277.                                 con_flag=1;
  278.                                 printf("返回");
  279.                         }
  280.                
  281.                 }
  282.                
  283.                         else if(press_flag2==1)                   //右移键
  284.                 {
  285.                         //delay_ms(10);
  286.                         if(press_flag2==1&&con_flag==2)
  287.                                 move++;
  288.                         if(move>6)move=0;
  289.                                 
  290.                         printf("mover=%d",move);
  291.                 }
  292.                         else if(press_flag1==1)                  //左移键
  293.                 {
  294.                         if(press_flag1==1&&con_flag==2)
  295.                                 move--;
  296.                         if(move<0)move=6;
  297.                                 
  298.                         printf("movel=%d",move);
  299.                 }
  300.                
  301.                 // 矩阵键盘中1 2 3 4 号键的处理
  302.                 if(key_val==1&&con_flag==1)
  303.                 {
  304.                          key_val=255;
  305.                    con_flag=2;
  306.                         LCD_Clear_Screen();
  307.                 }
  308.                 else if(key_val==2&&con_flag==1)
  309.                 {
  310.                          key_val=255;
  311.                         con_flag=3;
  312.                         LCD_Clear_Screen();
  313.                 }
  314.                 else if(key_val==3&&con_flag==1)
  315.                 {
  316.                    key_val=255;
  317.                         con_flag=4;
  318.                         LCD_Clear_Screen();
  319.                 }
  320.                 else if(key_val==4&&con_flag==1)
  321.                 {
  322.                    key_val=255;
  323.                         con_flag=5;
  324.                         LCD_Clear_Screen();
  325.                 }
  326. }

  327. /*
  328. void JM1(void)
  329. {
  330.                 //printf("jiemian");
  331.          if(con_flag==0) //界面1:欢迎界面
  332.          {
  333.                         if(shan==0)
  334.                         {
  335.                                 put_char(2,1,"2021技能大赛");
  336.                                 put_char(3,1,"Press Enter");
  337.                         //        printf("启动成功");
  338.                         }
  339.                         else if(shan==1)
  340.                         {
  341.                                 put_char(2,1,"2021技能大赛");
  342.                                 put_char(3,1,"           ");
  343.                         //        printf("闪烁界面");
  344.                         }
  345.          }
  346.          else if(con_flag==1)  //界面2:模式选择界面
  347.          {
  348.                         put_char(1,1,"1.系统设置");
  349.                         put_char(2,1,"2.手动模式");
  350.                         put_char(3,1,"3.自动模式");
  351.                         put_char(4,1,"4.数据回看");
  352.          }
  353.          else if(con_flag==2)  //界面3:系统设置
  354.          {
  355.                  put_char(1,2,"系统设置");
  356.                  
  357.                  put_char(2,0,"日期:");
  358.                  LCD_WriteData(' ');
  359.                  
  360.                  if(shan0==1)                        //年调整时闪烁
  361.                  {
  362.                  LCD_WriteData(sz[year_set[0]]);
  363.                  LCD_WriteData(sz[year_set[1]]);
  364.                  LCD_WriteData(sz[year_set[2]]);
  365.                  LCD_WriteData(sz[year_set[3]]);
  366.                  }
  367.                 else if(shan0==0)
  368.                  {
  369.                  LCD_WriteData(' ');
  370.                  LCD_WriteData(' ');
  371.                  LCD_WriteData(' ');
  372.                  LCD_WriteData(' ');
  373.                  }
  374.                   LCD_WriteData('/');
  375.                  
  376.                  if(shan1==1)                      //月调整时闪烁
  377.                  {
  378.                  LCD_WriteData(sz[month_set[0]]);
  379.                  LCD_WriteData(sz[month_set[1]]);
  380.                  }
  381.                 else if(shan1==0)
  382.                  {
  383.                  LCD_WriteData(' ');
  384.                  LCD_WriteData(' ');
  385.                  }
  386.                   LCD_WriteData('/');
  387.                  
  388.                  if(shan2==1)                      //日调整时闪烁
  389.                  {
  390.                  LCD_WriteData(sz[day_set[0]]);
  391.                  LCD_WriteData(sz[day_set[1]]);
  392.                  }
  393.                 else if(shan2==0)
  394.                  {
  395.                  LCD_WriteData(' ');
  396.                  LCD_WriteData(' ');
  397.                  }
  398.                  
  399.                  put_char(3,0,"时间:");
  400.                  LCD_WriteData(' ');
  401.                  if(shan3==1)
  402.                  {
  403.                          LCD_WriteData(sz[hour_set[0]]);
  404.                    LCD_WriteData(sz[hour_set[1]]);
  405.                  }
  406.                  else if(shan3==0)
  407.                  {
  408.                  LCD_WriteData(' ');
  409.                  LCD_WriteData(' ');
  410.                  }
  411.                  
  412.                  LCD_WriteData(':');
  413.                  if(shan4==1)
  414.                  {
  415.                          LCD_WriteData(sz[minute_set[0]]);
  416.                    LCD_WriteData(sz[minute_set[1]]);
  417.                  }
  418.                  else if(shan4==0)
  419.                  {
  420.                  LCD_WriteData(' ');
  421.                  LCD_WriteData(' ');
  422.                  }
  423.                  LCD_WriteData(':');
  424.                  if(shan5==1)
  425.                  {
  426.                          LCD_WriteData(sz[second_set[0]]);
  427.                    LCD_WriteData(sz[second_set[1]]);        
  428.                  }
  429.                   else if(shan5==0)
  430.                  {
  431.                         LCD_WriteData(' ');
  432.                         LCD_WriteData(' ');
  433.                  }
  434.                   put_char(4,0,"费率:");
  435.                   LCD_WriteData(' ');
  436.                         
  437.                  if(shan6==1)
  438.                  {
  439.                          LCD_WriteData('0');
  440.                          LCD_WriteData('0');
  441.                          LCD_WriteData('0');
  442.                  }
  443.                  else if(shan6==0)
  444.                  {
  445.                   LCD_WriteData(' ');
  446.                   LCD_WriteData(' ');
  447.                   LCD_WriteData(' ');
  448.                  }
  449.                   put_char(4,5,"元");
  450.                   LCD_WriteData('/');
  451.                   LCD_WriteData('g');
  452.                                  
  453.          }
  454.                  else if(con_flag==3)  //界面4:手动模式
  455.          {
  456.                         put_char(1,0,"手动");
  457.                         put_char(3,0,"重量");
  458.                 put_char(4,0,"收费");
  459.          }
  460.                  else if(con_flag==4)  //界面5:自动模式
  461.          {
  462.                         put_char(1,0,"自动: ");
  463.                         put_char(3,0,"重量: ");
  464.                 put_char(4,0,"收费: ");
  465.          }
  466.                  else if(con_flag==5)        //界面6:数据回看
  467.          {
  468.                         put_char(1,0,"回看: ");
  469.                         put_char(3,0,"重量: ");
  470.                         put_char(4,0,"费用: ");
  471.          }


  472.          
  473. }
  474. */

  475. void JM1(void)
  476. {
  477.                 //printf("jiemian");
  478.          if(con_flag==0) //界面1:欢迎界面
  479.          {
  480.                         if(shan==0)
  481.                         {
  482.                                 put_char(2,1,"2021技能大赛");
  483.                                 put_char(3,1,"Press Enter");
  484.                         //        printf("启动成功");
  485.                         }
  486.                         else if(shan==1)
  487.                         {
  488.                                 put_char(2,1,"2021技能大赛");
  489.                                 put_char(3,1,"           ");
  490.                         //        printf("闪烁界面");
  491.                         }
  492.          }
  493.          else if(con_flag==1)  //界面2:模式选择界面
  494.          {
  495.                         put_char(1,0,"1.时间测量    ");
  496.                         put_char(2,0,"2.电压测量    ");
  497.                         put_char(3,0,"3.其他测量项  ");
  498.                         put_char(4,0,"4.其他参考项  ");
  499.          }
  500.          else if(con_flag==2)  //界面3:系统设置
  501.          {
  502.                  //显示第一行的频率数值
  503.                  put_char(1,0,"频率: ");
  504.                          LCD_WriteData(sz[TIM2_Capture_Freq_Date[0]]);
  505.                          LCD_WriteData(sz[TIM2_Capture_Freq_Date[1]]);
  506.                          LCD_WriteData(sz[TIM2_Capture_Freq_Date[2]]);
  507.                          LCD_WriteData(sz[TIM2_Capture_Freq_Date[3]]);
  508.                          LCD_WriteData(sz[TIM2_Capture_Freq_Date[4]]);
  509.                          LCD_WriteData(sz[TIM2_Capture_Freq_Date[5]]);
  510.                          LCD_WriteData('H');
  511.                          LCD_WriteData('z');
  512. //                         LCD_WriteData(sz[TIM2_Capture_Freq_Date[9]]);                  
  513.                  put_char(2,0,"周期:");
  514.                          LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[0]]);
  515.                          LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[1]]);
  516.                          LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[2]]);
  517.                          LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[3]]);
  518.                          LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[4]]);
  519.                          LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[5]]);
  520.                           LCD_WriteData(sz[TIM2_Capture_Cycle1_Date[6]]);
  521.                          LCD_WriteData('u');
  522.                          LCD_WriteData('s');
  523.                  put_char(3,0,"脉宽:");        
  524.                          LCD_WriteData(sz[TIM5_Capture_Pulse_Date[0]]);
  525.                          LCD_WriteData(sz[TIM5_Capture_Pulse_Date[1]]);
  526.                          LCD_WriteData(sz[TIM5_Capture_Pulse_Date[2]]);
  527.                          LCD_WriteData(sz[TIM5_Capture_Pulse_Date[3]]);
  528.                          LCD_WriteData(sz[TIM5_Capture_Pulse_Date[4]]);
  529.                          LCD_WriteData(sz[TIM5_Capture_Pulse_Date[5]]);
  530.                           LCD_WriteData(sz[TIM5_Capture_Pulse_Date[6]]);
  531.                          LCD_WriteData('u');
  532.                          LCD_WriteData('s');
  533.                  put_char(4,0,"占空比:");                        
  534.                         //                         LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[0]]);
  535.                         //                         LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[1]]);
  536.                         //                         LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[2]]);
  537.                          LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[3]]);
  538.                          LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[4]]);
  539.                          LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[5]]);
  540.                           //LCD_WriteData(sz[TIM5_TIM2_Duty_Date2[6]]);
  541.                          LCD_WriteData('%');
  542.                          LCD_WriteData(' ');
  543.                         
  544.                         
  545.                                                                   

  546.                   
  547.          }
  548.          else if(con_flag==3)  //界面4:手动模式
  549.          {
  550.                         put_char(1,0,"峰峰值:");
  551. //                                 LCD_WriteData(sz[ADC_VVP_Date2[0]]);
  552. //                                 LCD_WriteData(sz[ADC_VVP_Date2[1]]);
  553.                                  LCD_WriteData(sz[ADC_VVP_Date2[2]]);
  554.                                  LCD_WriteData('.');
  555.                                  LCD_WriteData(sz[ADC_VVP_Date2[3]]);
  556.                                  LCD_WriteData(sz[ADC_VVP_Date2[4]]);
  557.                                  LCD_WriteData(sz[ADC_VVP_Date2[5]]);
  558. //                                 LCD_WriteData('m');
  559.                                  LCD_WriteData('V');
  560.                  
  561.                         put_char(2,0,"平均电压:");
  562.                                  LCD_WriteData(sz[ADC_average_value2[0]]);
  563.                                  LCD_WriteData('.');
  564.                                  LCD_WriteData(sz[ADC_average_value2[1]]);
  565.                                  LCD_WriteData(sz[ADC_average_value2[2]]);
  566.                                  LCD_WriteData(sz[ADC_average_value2[3]]);
  567. //                                 LCD_WriteData('m');
  568.                                  LCD_WriteData('V');
  569.                  
  570.                         put_char(3,0,"有效值:");
  571.                                  LCD_WriteData(sz[ADC_VPP_Valid2[0]]);
  572.                                  LCD_WriteData('.');
  573.                                  LCD_WriteData(sz[ADC_VPP_Valid2[1]]);
  574.                                  LCD_WriteData(sz[ADC_VPP_Valid2[2]]);
  575.                                  LCD_WriteData(sz[ADC_VPP_Valid2[3]]);
  576. //                                 LCD_WriteData('m');
  577.                                  LCD_WriteData('V');
  578.                                                 
  579.                         put_char(4,0," ");
  580.                                  
  581. //                        put_char(1,0,"手动");
  582. //                        put_char(2,0,"重量");
  583. //                        put_char(3,0,"收费");
  584. //                        put_char(4,0,"收费");
  585.                  
  586.          }
  587.                  else if(con_flag==4)  //界面5:自动模式
  588.          {
  589.                         put_char(1,0,"电压测量");
  590.                                                 
  591.                         put_char(2,0,"CH1:");
  592.                                  LCD_WriteData(sz[ADC_3_CH11_Value_Date2[0]]);
  593.                                  LCD_WriteData('.');
  594.                                  LCD_WriteData(sz[ADC_3_CH11_Value_Date2[1]]);
  595.                                  LCD_WriteData(sz[ADC_3_CH11_Value_Date2[2]]);
  596.                                  LCD_WriteData(sz[ADC_3_CH11_Value_Date2[3]]);
  597. //                                 LCD_WriteData('m');
  598.                                  LCD_WriteData('V');
  599.                  
  600.                         put_char(3,0,"CH2:");
  601.                                   LCD_WriteData(sz[ADC_3_CH12_Value_Date2[0]]);
  602.                                  LCD_WriteData('.');
  603.                                  LCD_WriteData(sz[ADC_3_CH12_Value_Date2[1]]);
  604.                                  LCD_WriteData(sz[ADC_3_CH12_Value_Date2[2]]);
  605.                                  LCD_WriteData(sz[ADC_3_CH12_Value_Date2[3]]);
  606. //                                 LCD_WriteData('m');
  607.                                  LCD_WriteData('V');
  608.                  
  609.                  
  610.                  
  611.                  
  612. //                        put_char(1,0,"自动: ");
  613. //                        put_char(3,0,"重量: ");
  614. //                        put_char(4,0,"收费: ");
  615.          }
  616.                  else if(con_flag==5)        //界面6:数据回看
  617.          {
  618.                         put_char(1,0,"回看: ");
  619.                         put_char(3,0,"重量: ");
  620.                         put_char(4,0,"费用: ");
  621.          }

  622. }



  623. int main(void)
  624. {
  625.         delay_init();
  626.         //ADC1初始化
  627.         ADCx_Init();
  628.         //ADC3初始化
  629.         ADCx_3_Init();
  630.         //串口初始化
  631.         USART_Config();
  632.         //TIM2初始化 捕获PWM波
  633.         TIM2_Cap_Init();
  634.         //基本定时器初始化
  635.          BASIC_TIM_Init();
  636.         //按键初始化
  637.         key_gpio();
  638.         //LCD12864初始化
  639.         gpio_12864_initout();
  640.         LCD_Init();
  641.         //高级定时器TIM1初始化 PWM捕获
  642.         ADVANCE_TIM_Init();
  643.         //通用定时器5高电平脉宽捕获
  644.         TIM5_Cap_Signal_Init();
  645.         
  646.         while(1)
  647.         {
  648. //                ADC_Value_Classify();
  649.                 if(time6>=999)
  650.                 {
  651.                         time6=0;
  652.                 }
  653.                 if(time7>=500)
  654.                 {
  655.                         time7=0;
  656.                 }
  657. //                TIM5_Cap_Signal_Manage();
  658.                 TIM2_Capture_Signal_Date();
  659.                 ADC_ConvertedValueLocal[0] =(float) ADC_ConvertedValue[0]/4096*3.3;
  660. //                ADC_ConvertedValueLocal[1] =(float) ADC_ConvertedValue[1]/4096*3.3;
  661. //                ADC_ConvertedValueLocal[2] =(float) ADC_ConvertedValue[2]/4096*3.3;
  662. //                ADC_ConvertedValueLocal[3] =(float) ADC_ConvertedValue[3]/4096*3.3;
  663. //                ADC_ConvertedValueLocal[4] =(float) ADC_ConvertedValue[4]/4096*3.3;
  664. //                ADC_ConvertedValueLocal[5] =(float) ADC_ConvertedValue[5]/4096*3.3;

  665.                 ADC_3_CH11_Value_Date=(float) ADC_3_ConvertedValue[0]/4096*3.3;
  666.                 ADC_3_CH12_Value_Date=(float) ADC_3_ConvertedValue[1]/4096*3.3;
  667.                
  668.                 printf(" CH0 value = %f V \r\n",ADC_ConvertedValueLocal[0]);
  669. //                printf("\r\n CH1 value = %f V \r\n",ADC_ConvertedValueLocal[1]);
  670. //                printf("\r\n CH2 value = %f V \r\n",ADC_ConvertedValueLocal[2]);
  671. //                printf("\r\n CH3 value = %f V \r\n",ADC_ConvertedValueLocal[3]);
  672. //                printf("\r\n CH4 value = %f V \r\n",ADC_ConvertedValueLocal[4]);
  673. //                printf("\r\n CH5 value = %f V \r\n",ADC_ConvertedValueLocal[5]);
  674.                
  675.                 ADC_average(); //求电压平均值
  676.                 ADC_average_Max(); //求电压峰峰值
  677.                 ADC_VPP_Valid_Date(); //求电压有效值
  678.                 ADC_average_Max(); //求电压峰峰值
  679.                 printf(" 测得的峰峰值为 = %f V \r\n",ADC_VVP_Date);
  680. //                printf(" 测得的峰峰值1为 = %d V \r\n",ADC_VVP_Date1);  屏幕数据值
  681.                 printf(" 测得的占空比值为 = %f  \r\n",TIM5_TIM2_Duty_Date);               
  682.                 printf(" 测得的平均值为 = %f V \r\n",ADC_average_value);
  683.                 printf(" 测得的有效值为 = %f V \r\n",ADC_VPP_Valid);
  684.                 printf(" 测得ADC3的CH12值为 = %f V \r\n",ADC_3_CH11_Value_Date);
  685.                 printf(" 测得ADC3的CH13值为 = %f V \r\n",ADC_3_CH12_Value_Date);
  686.                 Key_Event();
  687.                 key_scan();
  688.                 key_por1();
  689.                 JM1();
  690.                 TIM2_Capture_Freq_Date_Manage();
  691.                 TIM5_Cap_Signal_Manage();
  692. //                ADC_Value_Classify();
  693.         }
  694.         
  695.         
  696. }
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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