Tiva单片机——简易示波器(UART串口屏)

Tiva单片机——简易示波器(UART串口屏)Tiva 单片机 简易示波器 UART 串口屏 一 整体介绍二 代码的分段解读 1 头函数 2 宏定义及变量定义 3 外设初始化 4 波形触发设计 5 电压标定设计 6 频率测定 最高到达 1MHz 7 界面设

大家好,欢迎来到IT知识分享网。

前言:简易示波器、1MHz以内的频率检测、数据形式的触发、电压值的标定

一、整体介绍

在本次设计中,采用的是TI公司的TivaTM4123GXL系列单片机。本次给大家带来的是简易示波器的一些设计方法和自己的一些见解,希望对大家的学习有所帮助。另外如有错误,还请多多指正。

二、代码的分段解读

1、头函数

#include <stdint.h> #include <stdbool.h> #include <stdio.h> #include "inc/tm4c123gh6pm.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_flash.h" #include "inc/hw_ints.h" #include "driverlib/sysctl.h" #include "driverlib/interrupt.h" #include "driverlib/gpio.h" #include "driverlib/uart.h" #include "driverlib/timer.h" #include "utils/uartstdio.h" #include "driverlib/systick.h" #include "driverlib/pin_map.h" #include "driverlib/adc.h" #include "inc/hw_adc.h" #include "assert.h" #include "driverlib/pwm.h" #include "driverlib/flash.h" #include "driverlib/fpu.h" 

有缺文件的可以去Ti官网找

2、宏定义及变量定义

#define delay_ms(n); SysCtlDelay(n*(SysCtlClockGet()/3000));//延时函数 //已使用IO口 ADC PE5 // UART(LCD) PB0-RX PB1-TX BUSYCHECK PE4 // F0 PB2 // // //屏幕 X479 Y319 //LCD变量 uint32_t LCD_X[2];//X479 uint32_t LCD_Y[2];//Y319 //已使用的引脚 // PE3-2-1-0 PF1-2-3 PB0-1 //状态变量 uint32_t MCUModel; //0待机 1ADC采集 2数据传输 3测频 4测算触发点 5校准模式 6开机模式 uint32_t MCUModel1; //0待机 1ADC采集 2数据传输 3测频暂存 uint32_t UartPlayorStop; //单片机LCD中断处理状态 0串口中断处理完毕1串口中断处理中 uint32_t ADC0WriteorRead=1; //单片机ADC中断处理状态 0 ADC采集完毕 1 ADC采集中 2ADC暂停状态 uint32_t f0Check=0; //频率检测状态位 0未检测,1检测完毕 //数据变量 //ADC数据 int32_t ADC0SignGet[1]={ 
   0}; //ADC采样数据存储数组 //UART数据 uint8_t UartDateRead; //单片机UART串口数据读取 uint8_t UartLCDDateReads[20]; //单片机UART串口数据读取数组 uint32_t UartLCDDateReadNum=0; //单片机UART串口数据读取数组位数 //存储数据 uint32_t TriggerCheckPin=1;//未触发显示状态位 0上次未触发 1上次已经触发 uint32_t TriggerCheck=0;//触发位状态 0等待触发 1已经触发 uint32_t TriggerNum=1;//触发位 uint32_t Date[640]={ 
   0};//储存数组 uint32_t DateNum=0;//储存数组位数 uint32_t Vtemp=0;//电压值转换临时储存 //暂停 uint32_t StopCheck=0;//暂停检测位0未暂停1暂停中 //时域 float TimeGear[4]={ 
   1,2,3,4};//时域挡位 uint32_t TimeGearNum=0;//时域位 uint32_t TimeGearNum1;//时域暂存位 //幅域 float RangeGear[4]={ 
   0.25,0.5,1,2};//幅域挡位 uint32_t RangeGearNum=2;//幅域位 uint32_t RangeGearNum1;//幅域暂存位 //V uint32_t VpporVrmsCheck=0; //V测定状态检测位 0 Vrect-平均值 1 Vrms-有效值(只对正弦波有效) uint32_t Vmax=0; //峰值 uint32_t VmaxSum=0; //峰值累加 uint32_t Vmin=3300; //谷值 uint32_t VminSum=0; //谷值累加 uint32_t VCheckStand=200; //检测区间 uint32_t VCheckStandNum=0; //幅值检测位数 uint32_t Vrect=0; //幅值检测位数 uint32_t VppCheckNum=0;//幅值计算次数 //频率 unsigned char delay = 200;//累计下降沿次数 去除噪点 unsigned int Frequencecount = 0;//下降沿计数 unsigned char state = 0;//标记一次下降的开始---0 和 下一次下降沿的结束 ---1 之间的间隔即为该信号的周期 unsigned int fre = 0;//记录下降沿开始时的TimerCount unsigned int temp = 0;//频率测量临时变量 unsigned int Frequence = 0;//频率值 unsigned int FCheck=0; //校验 uint32_t VCheckNum=0;//校验循环采样数 uint32_t VCheckSum=20;//循环采样次数 uint32_t VCheckAddSum=0;//循环采样数据累加 float VCheckStand075=1;//0.75V标定 float VCheckStand150=1;//1.50V标定 float VCheckStand225=1;//2.25V标定 float VCheckStand300=1;//3.00V标定 uint32_t VCheckS075=0;//0.75V标志位 uint32_t VCheckS150=0;//1.50V标志位 uint32_t VCheckS225=0;//2.25V标志位 uint32_t VCheckS300=0;//3.00V标志位 

变量定义就不说太多了

3、外设初始化

void SysCtlPeripheralEnableInt(void)//外设使能以及初始化 { 
    //状态变量初始化 MCUModel=6; //LED外设配置 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//LED IO引脚外设使能 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); //串口屏UART1 IntPrioritySet(INT_UART1, 0);//Uart1中断优先级定义 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);//UART外设使能 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//UART IO引脚外设使能 GPIOPinConfigure(GPIO_PB0_U1RX);//配置复用功能 //读取 GPIOPinConfigure(GPIO_PB1_U1TX); //发送 GPIOPinTypeUART(GPIO_PORTB_BASE,GPIO_PIN_0|GPIO_PIN_1);//分配UART信号 //配置UART参数(这样配置可以用UARTprintf) UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC); //使用16MHz内部高精度振荡器(PIOSC)作为UART模块时钟 UARTStdioConfig(1,, ); //UART编号、波特率、UART时钟频率(频率要和上一行设的一致) //FIFO配置 //UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX1_8); //FIFO填入半满(1/8 2byte)时触发中断 //UARTFIFOEnable(UART1_BASE); IntEnable(INT_UART1); //enable the UART interrupt UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT); //only enable RX and TX interrupts UARTIntRegister(UART1_BASE,UARTIntHandler);//注册中断服务函数 //UARTprintf("CLS(0);\r\n");//清屏 //LCD繁忙检测 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//LED IO引脚外设使能 GPIODirModeSet(GPIO_PORTE_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); //设置PE4为输入. GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); //方向为输入 推挽上拉 LCD_Open_int(); delay_ms(1000); MCUModel=5; LCD_Check_int(); //ADC0 IntPrioritySet(INT_ADC0SS3, 2);//ADC0中断优先级定义 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);//ADC0外设使能 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能配置ADC0IO引脚PE5 GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_5);//配置ADC0IO引脚PE5 //序列发生器 | 采样数 | FIFO深度 // SS3 | 1 | 1 ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_ALWAYS, 0); ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH8 | ADC_CTL_IE | ADC_CTL_END);// 启用ADC0序列0中断 ADCIntRegister(ADC0_BASE ,3, ADC0Sequence0Handler);// 启用ADC0中断头文件 //ADCIntEnable(ADC0_BASE, 3);//ADC0初始化使能 IntEnable(INT_ADC0SS3); ADCSequenceEnable(ADC0_BASE, 3);// 使能采样序列 //pwm PB4 //配置PWM时钟(设置USEPWMDIV分频器) SysCtlPWMClockSet(SYSCTL_PWMDIV_1); //使能时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1); //使能PWM模块1时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //使能GPIOF时钟 //使能引脚复用PWM功能 GPIOPinTypePWM(GPIO_PORTF_BASE,GPIO_PIN_2); //GPIOPinTypePWM(GPIO_PORTF_BASE,GPIO_PIN_3); //PWM信号分配 GPIOPinConfigure(GPIO_PF2_M1PWM6); //PF2->PWM模块1信号6 //GPIOPinConfigure(GPIO_PF3_M1PWM7); //PF3->PWM模块1信号7 //配置PWM发生器 //模块1->发生器3->上下计数,不同步 PWMGenConfigure(PWM1_BASE,PWM_GEN_3,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC); //配置PWM周期 PWMGenPeriodSet(PWM1_BASE,PWM_GEN_3,10000); //64*10^3/16/10^6=4ms  //配置PWM占空比 PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6,PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*0.5); //比较值为四分之一总计数值,25% //PWMPulseWidthSet(PWM1_BASE,PWM_OUT_7,PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*0.01); //比较值为四分之三总计数值,75% //使能PWM模块1输出 PWMOutputState(PWM1_BASE,PWM_OUT_6_BIT,true); //PWMOutputState(PWM1_BASE,PWM_OUT_7_BIT,true); //使能PWM发生器 PWMGenEnable(PWM1_BASE,PWM_GEN_3); IntPrioritySet(INT_TIMER3A, 1);//TIMERA中断优先级定义 SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);//使能配置TIMERA定时器 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2); GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_2); GPIOPinConfigure(GPIO_PB2_T3CCP0); TimerConfigure(TIMER3_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP); TimerControlEvent(TIMER3_BASE, TIMER_A, TIMER_EVENT_NEG_EDGE); TimerIntRegister(TIMER3_BASE, TIMER_A, FrequentHandler); IntMasterEnable(); TimerIntEnable(TIMER3_BASE, TIMER_CAPA_EVENT); IntEnable(INT_TIMER3A);//使能定时器模块Timer0的定时器A的中断。 } 

这里的PWM生成是为了随手进行示波器的测试(就不用测试都需要示波器)

4、波形触发设计

 if(MCUModel==4) { 
    if(TriggerCheck!=1) { 
    if( (Date[TriggerNum-1]<Date[TriggerNum])&&Date[TriggerNum]>=1861)//1861*3300/4095 1500m { 
    TriggerCheckPin=1; TriggerCheck=1; LCD_X[1]=53; Vtemp=Date[TriggerNum]*(155/4095.0)*RangeGear[RangeGearNum]; LCD_Y[1]=227+75*(RangeGear[RangeGearNum]-1)-Vtemp;//PE1; MCUModel=3; if(VpporVrmsCheck==0) { 
    while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(250,256,'Vrect:',4,0);\r\n"); } else { 
    while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(250,256,'000000',8,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(250,256,'Vrms:',4,0);\r\n"); } } else { 
    if(TriggerNum>600) { 
    TriggerNum=1; MCUModel=1; if(TriggerCheckPin==1) { 
    TriggerCheckPin=0; ClearP(51,71,349,229); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(90,140,'未找到触发点,正在等待触发···',4,0);\r\n"); ClearP(175, 257,245,280); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(175,257,'----Hz',4,0);\r\n"); ClearP(98,257,145,280); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(95,257,'----mV',4,0);\r\n"); ClearP(300,257,345,280); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(300,257,'----mV',4,0);\r\n"); } delay_ms(10); ADCIntEnable(ADC0_BASE,3); //TimerEnable(TIMER0_BASE,TIMER_A);//使能定时器TimerA。 } else TriggerNum++; } } } 

第五行判断里的<号为上升沿的意思,改为>号,即为下降沿。后面的数据1861为1500mV根据3300/4095转换出来的数据,更改数据即为改变触发电平。(我这里的代码翻译过来就是在1.5且处于上升沿时触发波形显示)

5、电压标定设计

 if(MCUModel==5) { 
    if(ADC0WriteorRead==0&&VCheckS075==1) //750mV校准 { 
    ADC0WriteorRead=1; if(700<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<800) { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand075=18613.63636/(1.0*VCheckAddSum); VCheckS075=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } } if(ADC0WriteorRead==0&&VCheckS150==1)//1500mV校准 { 
    ADC0WriteorRead=1; if(1450<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<1550) { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand150=37227.27273/(1.0*VCheckAddSum); VCheckS150=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } } if(ADC0WriteorRead==0&&VCheckS225==1)//2250mV校准 { 
    ADC0WriteorRead=1; if(2200<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<2300) { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand225=55840.90909/(1.0*VCheckAddSum); VCheckS225=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } } if(ADC0WriteorRead==0&&VCheckS300==1)//3000mV校准 { 
    ADC0WriteorRead=1; if(2950<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<3050) { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand300=74454.54545/(1.0*VCheckAddSum); VCheckS300=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } } } 

这里设计了四个电压标定值 750mV 1500mV 2500mV 3000mV,VCheckStand075、VCheckStand150、VCheckStand225、VCheckStand300这四个数即为计算出的修正系数,使用时直接乘就行。

6、频率测定(最高到达1MHz)

外设定义详见第三部分的外设初始化

void FrequentHandler() { 
    //去除噪声影响 if(Frequencecount<=delay) Frequencecount++; else { 
    if(state == 0) { 
    fre = TimerValueGet(TIMER3_BASE, TIMER_A); state = 1; } else { 
    temp = SysCtlClockGet() / ((unsigned int)TimerValueGet(TIMER3_BASE, TIMER_A) - fre); state = 0; if( temp > 0.5 ) { 
    //FCheck=1; MCUModel=2; Frequence =temp; ClearP(175, 257,245,280); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(175,257,'%dHz',4,0);\r\n",Frequence); } Frequencecount = 0; } } TimerIntClear(TIMER3_BASE,TIMER_CAPA_EVENT); // 清除WTimer0捕获器A的中断标志位 if(MCUModel==2) { 
    TimerDisable(TIMER3_BASE, TIMER_A); } } 

简单来说就是定时器测频率,另外因为去噪声的缘故,频率下限较高

7、采集数据处理

void ADC0Sequence0Handler(void)//ADC中断头文件 { 
    ADC0WriteorRead=1;//ADC状态 ADCSequenceDataGet(ADC0_BASE, 3, ADC0SignGet); // 读取ADC值 ADC0WriteorRead=0; if(MCUModel==1) { 
    Date[DateNum]=ADC0SignGet[0]; DateNum++; if(DateNum>=640) { 
    //DateNum=0; while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("PL(%d,71,%d,229,8);\r\n",52,52); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("PL(%d,71,%d,229,8);\r\n",53,53); MCUModel=4; DateNum=0; ADCIntDisable(ADC0_BASE, 3); } } if(MCUModel==5) { 
    if(VCheckS075==1&&700<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<800) //750mV校准 { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand075=18613.63636/(1.0*VCheckAddSum); VCheckS075=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } if(VCheckS150==1&&1450<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<1550)//1500mV校准 { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand150=37227.27273/(1.0*VCheckAddSum); VCheckS150=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } if(VCheckS225==1&&2200<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<2300)//2250mV校准 { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand225=55840.90909/(1.0*VCheckAddSum); VCheckS225=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } if(VCheckS300==1&&2950<(ADC0SignGet[0]*3300/4095.0)&&(ADC0SignGet[0]*3300/4095.0)<3050)//3000mV校准 { 
    VCheckNum++; VCheckAddSum=ADC0SignGet[0]+VCheckAddSum; if(VCheckNum==VCheckSum) { 
    VCheckStand300=74454.54545/(1.0*VCheckAddSum); VCheckS300=0; VCheckNum=0; VCheckAddSum=0; ADCIntDisable(ADC0_BASE, 3); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'标定完成',4,0);\r\n"); } } } ADCIntClear(ADC0_BASE, 3); // 清除ADC中断标志。 //_nop(); } 

这里涉及到了数据处理,以及多个外设之间的数据传递与协调

8、界面设计(UART串口屏)

8.1、开机界面图形设计

void LCD_Open_int()//开机屏幕处理 { 
    while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("CLS(0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("PIC(81,112,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS48(168,128,'Oscilloscope',5,0);\r\n"); } 

这里我调用了我的logo,另外有关图片导入的问题,详见GPU使用方法,这里不再详述

8.2、初始界面设计

void LCD_Check_int()//校验屏幕处理 { 
    while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("CLS(0);\r\n");//清屏 while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOXF(0,0,480,320,8);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("SBC(8);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS24(180,25,'示波器校准',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOX(40,60,440,300,13);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOX(50,70,350,230,5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOX(50,240,350,290,4);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(1,355,70,430,100,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(2,355,105,430,135,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(3,355,155,430,185,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(4,355,190,430,220,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(5,355,225,430,255,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(6,355,260,430,290,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,75,'执行校验',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,110,'结束校验',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,160,'0.75V标定',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,195,'1.50V标定',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,230,'2.25V标定',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,265,'3.00V标定',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(60,260,'当前电压标定幅值:',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(220,260,'当前标定状态:',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(165,260,'-----',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'-----',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BS12(60,75,345,5,' 欢迎使用本示波器,本示波器采用TI出品的EK-TM4C123GXL作为主控。',5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BS12(60,110,345,5,' 波形最高频率可显示到20kHz,频率、峰峰值、以及平均值的测算最高可以满足1MHz。',5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BS12(60,145,345,5,' 内置数字触发,为1.5V上升沿触发,同时具备时轴展宽、缩减,幅轴展宽、缩减的功能。',5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BS12(60,180,345,5,' 示波器频率测量误差为1%%(10Hz~1MHz),峰峰值测量误差为2%%(1Hz~1MHz)',5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BS12(60,210,345,5,' -----开发者G 2021年6月4号',5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(40,305,'具体详情请访问网址:https://blog.csdn.net/_/article/details/?spm=1001.2014.3001.5501',7,0);\r\n"); } 

这里为示波器标定与介绍界面

8.3、示波界面设计

void LCD_int()//工作屏幕处理 { 
    while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("CLS(0);\r\n");//清屏 while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOXF(0,0,480,320,8);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("SBC(8);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS24(180,25,'简易示波器',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOX(40,60,440,300,13);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOX(50,70,350,230,5);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BOX(50,240,350,290,4);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(1,355,70,430,100,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(2,355,105,430,135,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(3,355,155,430,185,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(4,355,190,430,220,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(5,355,225,430,255,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("BTN(6,355,260,430,290,2);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,75,'暂停/运行',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,110,'电压标定',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,160,'时轴放大',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,195,'时轴缩减',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,230,'幅轴放大',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(360,265,'幅轴缩减',15,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(55,256,'Yp-p:',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(150,256,'f0:',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS16(250,256,'Vrect:',4,0);\r\n"); while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(40,305,'我已经写在博客里:https://blog.csdn.net/_',7,0);\r\n"); } 

以上为示波界面设计

8.4、交互按键设计

void LCDstringcheck(void) { 
    if(UartLCDDateReads[4]=='1')//2暂停/运行 5执行校验 { 
    if(MCUModel==2||MCUModel==0) { 
    if(StopCheck==0) { 
    MCUModel1=MCUModel; MCUModel=0; StopCheck=1; } else { 
    MCUModel=MCUModel1; StopCheck=0; } } if(MCUModel==5) { 
    if((VCheckS075+VCheckS150+VCheckS225+VCheckS300)>=1) { 
    while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(300,260,'正在标定',4,0);\r\n"); ADCIntEnable(ADC0_BASE, 3); } } UartLCDDateReads[4]="X"; } if(UartLCDDateReads[4]=='2')//2电压校验 5结束校验 { 
    if(MCUModel==5) { 
    LCD_int(); MCUModel=1; TriggerCheckPin=1; TriggerCheck=0; ADCIntEnable(ADC0_BASE, 3); //TimerEnable(TIMER0_BASE,TIMER_A);//使能定时器TimerA。 } else { 
    MCUModel=5; ADCIntDisable(ADC0_BASE, 3); //TimerDisable(TIMER0_BASE, TIMER_A); LCD_Check_int(); } UartLCDDateReads[4]="X"; } if(UartLCDDateReads[4]=='3')//2时域放大 5 0.75V标定 { 
    if(MCUModel==2) { 
    if(TimeGearNum<3) { 
    TimeGearNum++;//时域位 } } if(MCUModel==5) { 
    VCheckS075=1; while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(165,260,'0.75V',4,0);\r\n"); } UartLCDDateReads[4]="X"; } if(UartLCDDateReads[4]=='4')//2时域缩减 5 1.50V标定 { 
    if(MCUModel==2) { 
    if(TimeGearNum>0) { 
    TimeGearNum--;//时域位 } } if(MCUModel==5) { 
    VCheckS150=1; while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(165,260,'1.50V',4,0);\r\n"); } UartLCDDateReads[4]="X"; } if(UartLCDDateReads[4]=='5')//2幅域展宽 5 2.25V标定 { 
    if(MCUModel==2) { 
    if(RangeGearNum<3) { 
    RangeGearNum++;//时域位 } } if(MCUModel==5) { 
    VCheckS225=1; while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(165,260,'2.25V',4,0);\r\n"); } UartLCDDateReads[4]="X"; } if(UartLCDDateReads[4]=='6')//2幅域缩减 5 3.00V标定 { 
    if(MCUModel==2) { 
    if(RangeGearNum>0) { 
    RangeGearNum--;//时域位 } } if(MCUModel==5) { 
    VCheckS300=1; while(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_4)!=0x0); UARTprintf("DS12(165,260,'3.00V',4,0);\r\n"); } UartLCDDateReads[4]="X"; } } 

以上是对LCD屏幕热键返回值的处理

9、主程序分享

点这里下载

10、实际运行视频

B站演示视频点这里

三、常见问题

1、之前写过类似的测定频率的函数,但是就是不好使。

FPUEnable(); FPULazyStackingEnable(); 

2、接上后屏幕没反应

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143927.html

(0)
上一篇 2025-04-30 13:45
下一篇 2025-04-30 14:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信