找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32的示波器程序设计 DAC1输出三角波

[复制链接]
跳转到指定楼层
楼主
ID:587820 发表于 2019-7-24 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于stm32F1的示波器设计,外加三角波发生器

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "adc.h"
  8. #include "dac.h"
  9. #include "exti.h"
  10. #include "stm32f10x_adc.h"



  11. u16   buf[1000];
  12. u16   table[50]  ={0,25,50,75,100,125,150,175,200,225,250,275,300,325,350,375,400,425,450,475,500,525,550,575,600,625,650,675,700,725,750,775,800,825,850};
  13. u16                table1[160] ={0,5,10,15,20,30,35,40,45,55,60,65,70,80,85,
  14.                                                                                 90,95,105,110,115,120,130,135,140,145,155,
  15.                                                                                 160,165,170,180,185,190,195,205,210,215,220,
  16.                                                                                 230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,
  17.                                                                                 310,315,320,325,330,335,340,345,350,355,360,365,370,375,
  18.                                                                                 380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,
  19.                     480,485,490,495,500,505,510,515,520,525,530,535,540,545,550,555,560,565,570,575,
  20.                     580,585,590,595,600,605,610,615,620,625,630,635,640,645,650,655,660,665,670,675,
  21.                     680,685,690,695,700,705,710,715,720,725};
  22. u16 Ypos1=100,Ypos2=100,Xpos1,Xpos2;
  23. u16 adcx,dsl;
  24. float temp1;
  25. u16  t=75;
  26. float p;
  27. u16  h=3;
  28. u16 d=13;
  29. u32  tim=1;
  30. u32  bei=1;
  31. u16 Yinit=75;
  32. u8 a;
  33. u8 len;                                                                               

  34. void drawgaid() //画网格  
  35. {
  36.         u16 x,y;
  37.         for(x=0;x<301;x=x+25)
  38.                 for(y=0;y<201;y=y+5)
  39.                 {
  40.                         LCD_Fast_DrawPoint(x,y,BLUE );
  41.                 }
  42.         for(y=0;y<201;y=y+25)
  43.                 for(x=0;x<301;x=x+5)
  44.                 {
  45.                         LCD_Fast_DrawPoint(x,y,BLUE );
  46.                 }
  47. }


  48. void clear_point(u16 hang)//更新显示屏当前列
  49. {
  50.         float index_clear_lie = 50;
  51.         POINT_COLOR = BLACK ;
  52.         for(index_clear_lie = 50;index_clear_lie <426;index_clear_lie=index_clear_lie+1)
  53.         {               
  54.                 LCD_DrawPoint(hang,index_clear_lie );
  55.                 LCD_DrawPoint(hang+1,index_clear_lie );
  56.                 LCD_DrawPoint(hang+2,index_clear_lie );
  57.                 LCD_DrawPoint(hang+3,index_clear_lie );
  58.                 LCD_DrawPoint(hang+4,index_clear_lie );
  59.         }
  60.         if(hang==table[h])//判断hang是否为25的倍数
  61.         {
  62.                         for(index_clear_lie = 50;index_clear_lie <426;index_clear_lie=index_clear_lie+5)
  63.                         {               
  64.                                 LCD_Fast_DrawPoint(hang ,index_clear_lie,        GREEN );
  65.                         }
  66.                         h++;
  67.                         if(h>29) h=3;
  68.         }
  69.         if(hang ==table1[d])//判断hang是否为5的倍数
  70.         {
  71.                         for(index_clear_lie = 50;index_clear_lie <426;index_clear_lie=index_clear_lie+25)//行数
  72.                 {               
  73.                                 LCD_Fast_DrawPoint(hang ,index_clear_lie,YELLOW );
  74.                         }
  75.                         d++;
  76.                         if(d>135) d=13;//行长度
  77.         }
  78.        
  79.         POINT_COLOR=RED;       
  80. }
  81. void DrawOscillogram()//画波形图
  82. {
  83.                 for(t=15;t<146;t++)//存储AD数值
  84.                 {
  85.                         buf[t] =Get_Adc(ADC_Channel_1);
  86.                         if(tim>1)
  87.                                 delay_us(tim );//改变AD取样间隔
  88.                 }
  89.                         for(t=15;t<146;t++)
  90.                 {
  91.                         p=t*5;
  92.                         clear_point(p );       
  93.                         Ypos2=Yinit+buf[t]*100/4096;//转换坐标
  94.                         Ypos2=Ypos2*bei;
  95.                         if(Ypos2 >450) Ypos2 =450; //超出范围不显示
  96.                         LCD_DrawLine (5*t ,2*Ypos1+75 ,5*(t+1),2*Ypos2+75  );
  97.                         Ypos1 =Ypos2 ;
  98.                 }       
  99. }
  100. float get_vpp(void)           //获取峰峰值
  101. {
  102.        
  103.         u32 max_data=buf[0];
  104.         u32 min_data=buf[0];
  105.         u32 n=0;
  106.         float Vpp=0;
  107.         for(n = 1;n<201;n++)
  108.         {
  109.                 if(buf[n]>max_data)
  110.                 {
  111.                         max_data = buf[n];
  112.                 }
  113.                 if(buf[n]<min_data)
  114.                 {
  115.                         min_data = buf[n];
  116.                 }                       
  117.         }        
  118.         Vpp = (float)(max_data-min_data);
  119.         Vpp = Vpp*(3300.0/4095);
  120.         return Vpp;       
  121. }




  122. int main(void)
  123. {         
  124.   u16 adcx;
  125.         float temp;
  126.         delay_init();                     //延时函数初始化          
  127.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  128.         uart_init(115200);                 //串口初始化为115200
  129.         LED_Init();                             //LED端口初始化
  130.         LCD_Init();                                
  131.         Adc_Init();                                  //ADC初始化
  132.          Dac1_Init();                                //DAC初始化
  133.          
  134.          KEY_Init ();
  135.          POINT_COLOR=RED;
  136.          LCD_Display_Dir(1);
  137.          //LCD_ShowString(0,210,200,24,24,"Vpp=0000mv");
  138.          //LCD_ShowxNum(284,220,tim ,3,16,0);

  139. //        POINT_COLOR=RED;//设置字体为红色
  140.         //LCD_ShowString(60,50,200,16,16,"WarShip STM32");       
  141.         //LCD_ShowString(60,70,200,16,16,"ADC TEST");       
  142.         //LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  143.         //LCD_ShowString(60,110,200,16,16,"2015/1/14");       
  144.         //显示提示信息
  145.         //POINT_COLOR=BLUE;//设置字体为蓝色
  146.         //LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");             
  147.         //LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");               
  148.         while(1)
  149.         {
  150.                 adcx=Get_Adc_Average(ADC_Channel_1,10);
  151.                 //LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
  152.                 temp=(float)adcx*(3.3/4096);
  153.                 adcx=temp;
  154.                 //LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
  155.                 temp-=adcx;
  156.                 temp*=1000;
  157.                 //LCD_ShowxNum(172,150,temp,3,16,0X80);
  158.                 DrawOscillogram();//画波形
  159.                          temp1=get_vpp();//峰峰值mv               
  160.                          LCD_ShowxNum(100,450,temp1,4,24,0);        //显示峰峰值mv                        
  161.                 LED0=!LED0;//判断程序是否运行       
  162.         }
  163. }
复制代码

所有资料51hei提供下载:
单通道示波器+DAC1输出三角波.7z (242.46 KB, 下载次数: 37)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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