基于STC12C5412AD单片机的存储示波器设计.doc_第1页
基于STC12C5412AD单片机的存储示波器设计.doc_第2页
基于STC12C5412AD单片机的存储示波器设计.doc_第3页
基于STC12C5412AD单片机的存储示波器设计.doc_第4页
基于STC12C5412AD单片机的存储示波器设计.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STC12C5412AD单片机的存储示波器设计魏广寅(贵州大学 计算机科学与技术学院)摘要:研究了基于单片机的自动量程转换频率计和存储示波器设计,经实验,效果理想,能实现1Hz50MHz间的频率测量,同时显示信号周期,4档量程(精度),能实现1Hz15KHz间的信号波形实时显示,采样速率120KHz,存储深度128B,还能对任何红外编码发射器码型进行破解。关键词:高速单片机 自动量程转换 液晶显示器 信号抽样 红外PWM 同步触发引言:频率计是电子电路测量、调试中不可缺少的一种仪器,其主要功能是测量信号的频率。传统的频率计是用纯分离数字IC组成,一般由信号整形、预分频、闸门、计数器、锁存器、译码驱动电路构成,结构较复杂,而功能扩展又及其不便。因此,本设计方案摒弃了传统的结构,而采用单片机和两片外围IC来完成上述的所有模块,在不增加外围的情况下还扩展了周期测量,波形显示,红外PWM编码分析等功能,因此性价比大幅提高,而制作难度大幅下降。参考文献:SSC12A64DRY-DataSheet74HC390-DataSheet74HC03-DataSheetSTC12C5412AD-DataSheet正文:本频率计采用液晶显示器做人机接口,菜单式界面设计,测量频率1Hz50MHz自动转换量程,波形分析采用奈氏抽样,上限频率到15KHz,同步触发为过零触发,红外PWM编码分析采用一体化红外接收头,单片机内部解码,适用任何4B以下的归零曼彻斯特码分析。系统电路如下:电路工作原理:预分频部分:待测信号从Q9头输入,经C1隔直后一路直接送往单片机做奈氏抽样,另一路则送往与非门U1。R1和R2将U1的输入端偏置在转折特性区的中点,这时U1既作为小信号放大器,又起到整形作用。整形后的信号送往由74HC390构成的10/100分频器,1分频的信号、10分频的信号、100分频的信号分别用U2,U3,U4来选通。为此,要求与非门的输出必须是OC形式的才能构成线与逻辑,本电路采用高速的74HC03,线与后的信号送单片机处理。软件流程如下:单片机功能模块设计方法及说明:人机对话方式:采用128X64的点阵液晶做对话窗口,10级中文菜单操作,键盘采用经典的三按键结构,仅使用两个I/O口,分“向上”,“向下”,“回车”三项基本功能,在不同的工作模块中有不同的按键功能定义。系统自检模块:主要检测分频器选通端是否有短路。频率计模块:本部分全由软件实现,将单片机T0设置为闸门,闸门时间为1S和0.1S,T1设置为外部触发计数器,最高计数值65535,闸门时间内T1的计数值即为信号频率。自动转换量程的实现:采用逐次试探比较算法,即先用高量程测频,若计数值小于某值则向下跳一挡,直到最合适的量程为止。在频率计子循环中不停检测当前读数是否越界,一旦越界立即切换量程,使16位的计数器能在各个频段达到最高的分辨率,并通过T1的溢出中断来判别是否测量的是信号的谐波,然后自动切换至高档位。在屏幕上表现为小数点位置的移动和频率单位的转换,高位零消隐。分段如下:频段分频系数闸门时间单位 0.1Hz50.000K11000.0000mSKHz50.001K500.00K1100.0000mSKHz500.01K5.0000M10100.0000mSMHz5.0001M50.000M100100.0000mSMHz周期测量:用软件实现,频率的倒数即是周期,根据不同的频段采用不同的周期单位和计算方式,已达到最高精度。示波器模块:根据奈氏抽样原理,将连续模拟信号用冲击信号抽样,数字滤波,10位量化得到离散的数字量,存储在RAM中以便分析。这种方法的基础是高速ADC,而STC12C5412AD系列单片机内部就集成有8通道10bit的高速ADC,采样速率最高到250KHz,本设计采用120KHz采样率,据奈氏抽样原理,两倍与信号频率的抽样速度就能从数字量中还原出模拟信号,但为保证还原后的高保真度,本设计采用8倍抽样速率,因此进行波形分析的输入信号的频率不能大于15KHz。同步触发的实现:因为输入信号的频率和相位与显示器扫描信号的相位很少有一致的时候,这样的话前后两帧之间会存在一个相位差,使屏幕上的波形混叠不清,不便于观察和分析。为此,本设计提供了两种同步触发方式,只有满足触发条件时才启动扫描,这样就能保证波形稳定的显示,分别为(1)过零正斜率触发:采用软件算法实现,循环的检测AD值,一旦检测值过零点(AD值=512)而且随后1,2时刻的采样值呈递增趋势(正斜率)就立刻触发扫描。(2)手动单次触发,按下定格键就将此时波形定格下来,适用于杂乱的信号显示。编码分析仪模块:硬件是以SM0038的一体化红外接收头为基础,当接收头收到38KHz的载波信号后,输出端会呈现低电平,基带与发送端基本一致。然后送往MCU处理。软件解码过程:将MCU的外部中断INT0设置为下跳沿触发中断,在中断服务中读取片内计数器的值,相邻两次中断的间隔即为调制脉宽,根据曼彻斯特编码的定义,两个相邻下跳沿间的脉宽即代表一个位,(如1.2mS等价于“0”,2.4mS等价于“1”),因此只要把脉宽记录下来,很轻松就可以分析任何遥控器的编码组成。系统信息模块:主要显示固件的版本号,程序设计者等等附属信息。元器件的选择:U1U4:选择HC或AC系列高速COMS与非门(OC输出),如74HC03,74HC01MCU :选择STC12C5412AD,一时钟一周期,外部晶振最高48MHz相当于传统8052的580M主频。增强型52内核,内置高速ADC,EEPROM,Watch dog,PCA,可以ISP,IAP。或选用同样性能的AVR 单片机。液晶显示模组:SSC12A64DRY的无字库图形液晶,价格便宜,操作方便,并行模式,INTEL总线时序,高响应速度。其余阻容元件参数均按图示,采用CBB电容和1/4W五色环金属膜电阻。布线方式:由于是高速电路,PCB的布线将严重影响系统性能,因此本设计全采用45度转角,大面积敷铜接地,信号线与功率线分开。如下图测量结果如下:频率源FS413频率计读数本机读数555时基振荡器1Hz0.001KHz555时基振荡器10Hz0.010KHz555时基振荡器100Hz0.100KHz555时基振荡器1000Hz1.000KHz555时基振荡器10.000KHz10.000KHz555时基振荡器100.000KHz100.00KHz555时基振荡器223.421KHz223.42KHz11.0592MHz晶振11.0591MHz11.059MHz24.0000MHz晶振24.0011MHz24.001MHz48.2450MHz晶振48.2455MHz48.246MHz菜单界面实拍图:频率测量实拍图:波形显示实拍图:PWM分析实拍图:单片机开发平台:Keil uV3 8.05版单片机程序采用C51语言用分块分级模式编写,代码量9176Byte,内存占用82.1%,外存使用256Byte. 包含以下几个模块:1. Menu.C (菜单模块)1. 2. Freqen.c (频率计模块)2. 3. Dis_Wave.C(示波器模块)3. 4. PWM.C (PWM分析模块)4. 5. STC12C5412AD_DRIVER.C (单片机附加功能驱动)5. 6. LCD12864_Driver_New.C (液晶显示器驱动)6. 7. Lib.C(汉字库)完整程序清单:/模块:Menu.C/功能:菜单模块/晶振:24.000MHz/芯片: STC12C5412AD/版本:V1.0.0/设计:魏广寅/日期:2007.4.10/-#includeSTC12C5412AD.h#define size_of_keybd_menu 8#define uint unsigned int#define uchar unsigned charsbit sel_1=P16;sbit sel_10=P14;sbit sel_100=P34;sbit f_in=P35;uchar temp_l,temp_h;uchar i=0;uint temp0=0x30,temp1=0x30,temp2=0x30,temp3=0x30,temp4=0x30;uchar keyfuncindex=0;void(*keyfuncptr)();void beep(uint time);uchar bdata gate=4;uchar code tab16=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;extern void get_value();extern void AD_init(uchar AD_port_sel );extern void pwm();extern void bin_to_hex();extern unsigned char code x0; / 请extern unsigned char code x1;/ 选extern unsigned char code x2;/ 择extern unsigned char code x3;/ 工extern unsigned char code x4;/ 作extern unsigned char code x5;/ 模extern unsigned char code x6;/ 式extern unsigned char code x7;/ 频extern unsigned char code x8;/ 率extern unsigned char code x9;/ 计extern unsigned char code x10;/ 示extern unsigned char code x11;/ 波extern unsigned char code x12;/ 器extern unsigned char code x13;/ 测extern unsigned char code x14;/ 量extern unsigned char code x15;/ 红extern unsigned char code x16;/ 外extern unsigned char code x17;/ 分extern unsigned char code x18;/ 析extern unsigned char code x19;/ 固extern unsigned char code x20;/ 件extern unsigned char code x21;/ 版extern unsigned char code x22;/ 本extern unsigned char code x23;/ 信extern unsigned char code x24;/ 息extern unsigned char code x25;/ 程extern unsigned char code x26;/ 式extern unsigned char code x27;/ 设extern unsigned char code x28;/ 计extern unsigned char code x29;/ 魏extern unsigned char code x30;/ 广extern unsigned char code x31;/ 寅extern unsigned char code x32;/ 贵extern unsigned char code x33;/ 大extern unsigned char code x34;/ 电extern unsigned char code x35;/ 科extern unsigned char code x36;/ 欢extern unsigned char code x37;/ 迎extern unsigned char code x38;/ 使extern unsigned char code x39;/ 用extern unsigned char code x40;/ 多extern unsigned char code x41;/ 功extern unsigned char code x42;/ 能extern void lcd_init();extern void delay(uint time);extern void dis_one_zi(uchar x_add,uchar y_add,uchar code *po,bit back_flag,bit char_moudle);extern void dis_one_char(uchar x,uchar y,uchar asc_num,bit b_flag);extern wave();extern void dis_cls(void);extern void freq();sbit beep_port=P15;/-void d0_3(uchar sel)dis_cls();dis_one_char(0,0,1,1); /1. 50MHz频率计dis_one_char(0,1,.,1);dis_one_char(0,2, ,1);dis_one_char(0,3,5,1);dis_one_char(0,4,0,1);dis_one_char(0,5,M,1);dis_one_char(0,6,H,1);dis_one_char(0,7,z,1);dis_one_zi(0,4,x7,1,1);dis_one_zi(0,5,x8,1,1);dis_one_zi(0,6,x9,1,1);dis_one_char(1,0,2,1); /2. 15KHz示波器dis_one_char(1,1,.,1);dis_one_char(1,2, ,1);dis_one_char(1,3,1,1);dis_one_char(1,4,5,1);dis_one_char(1,5,K,1);dis_one_char(1,6,H,1);dis_one_char(1,7,z,1);dis_one_zi(1,4,x10,1,1);dis_one_zi(1,5,x11,1,1);dis_one_zi(1,6,x12,1,1);dis_one_char(2,0,3,1); /3. PWM红外分析dis_one_char(2,1,.,1);dis_one_char(2,2, ,1);dis_one_char(2,3,P,1);dis_one_char(2,4,W,1);dis_one_char(2,5,M,1);dis_one_zi(2,3,x15,1,1);dis_one_zi(2,4,x16,1,1);dis_one_zi(2,5,x17,1,1);dis_one_zi(2,6,x18,1,1);dis_one_char(3,0,4,1); /4. SOW版本信息dis_one_char(3,1,.,1);dis_one_char(3,2, ,1);dis_one_char(3,3,S,1);dis_one_char(3,4,O,1);dis_one_char(3,5,W,1);dis_one_zi(3,3,x21,1,1);dis_one_zi(3,4,x22,1,1);dis_one_zi(3,5,x23,1,1);dis_one_zi(3,6,x24,1,1);switch (sel)case 0: dis_one_char(0,0,1,0); /1. 50MHz频率计dis_one_char(0,1,.,0);dis_one_char(0,2, ,0);dis_one_char(0,3,5,0);dis_one_char(0,4,0,0);dis_one_char(0,5,M,0);dis_one_char(0,6,H,0);dis_one_char(0,7,z,0);dis_one_zi(0,4,x7,0,1);dis_one_zi(0,5,x8,0,1);dis_one_zi(0,6,x9,0,1);dis_one_char(0,14,0x7f,1);dis_one_char(0,15,0x7f,1);break;case 1: dis_one_char(1,0,2,0); /2. 15KHz示波器dis_one_char(1,1,.,0);dis_one_char(1,2, ,0);dis_one_char(1,3,1,0);dis_one_char(1,4,5,0);dis_one_char(1,5,K,0);dis_one_char(1,6,H,0);dis_one_char(1,7,z,0);dis_one_zi(1,4,x10,0,1);dis_one_zi(1,5,x11,0,1);dis_one_zi(1,6,x12,0,1);dis_one_char(1,14,0x7f,1);dis_one_char(1,15,0x7f,1);break;case 2:dis_one_char(2,0,3,0); /3. PWM红外分析dis_one_char(2,1,.,0);dis_one_char(2,2, ,0);dis_one_char(2,3,P,0);dis_one_char(2,4,W,0);dis_one_char(2,5,M,0);dis_one_zi(2,3,x15,0,1);dis_one_zi(2,4,x16,0,1);dis_one_zi(2,5,x17,0,1);dis_one_zi(2,6,x18,0,1);dis_one_char(2,14,0x7f,1);dis_one_char(2,15,0x7f,1);break;case 3:dis_one_char(3,0,4,0); /4. SOW版本信息dis_one_char(3,1,.,0);dis_one_char(3,2, ,0);dis_one_char(3,3,S,0);dis_one_char(3,4,O,0);dis_one_char(3,5,W,0);dis_one_zi(3,3,x21,0,1);dis_one_zi(3,4,x22,0,1);dis_one_zi(3,5,x23,0,1);dis_one_zi(3,6,x24,0,1);dis_one_char(3,14,0x7f,1);dis_one_char(3,15,0x7f,1);break;/-void d0(void)d0_3(0);/-void d1(void)d0_3(1);/-void d2(void)d0_3(2);/-void d3()d0_3(3);/-void d4()dis_cls();pwm();/-void d5()dis_cls();dis_one_zi(0,0,x19,1,1);dis_one_zi(0,1,x20,1,1);dis_one_char(0,4,:,1);dis_one_char(0,5, ,1);dis_one_char(0,6,V,1);dis_one_char(0,7,1,1);dis_one_char(0,8,.,1);dis_one_char(0,9,0,1);dis_one_char(0,10,.,1);dis_one_char(0,11,0,1);dis_one_zi(1,0,x25,1,1);dis_one_zi(1,1,x26,1,1);dis_one_zi(1,2,x27,1,1);dis_one_zi(1,3,x28,1,1);dis_one_char(1,8,:,1);dis_one_zi(2,4,x32,1,1);dis_one_zi(2,5,x33,1,1);dis_one_zi(2,6,x34,1,1);dis_one_zi(2,7,x35,1,1);dis_one_zi(3,4,x29,1,1);dis_one_zi(3,5,x30,1,1);dis_one_zi(3,6,x31,1,1);/-void d6()dis_cls();freq();/-void d7()dis_cls();wave();/-typedef structuchar keystateindex;uchar keydnstate;uchar keyupstate;uchar keycrstate;void(*currentoperate)(); kbdtabstruct;/-kbdtabstruct code keytabsize_of_keybd_menu= /第一行表示在0级菜单时按下向下键则转到1级菜单 /按下向上键则转1级菜单,按下回车键则转5级菜单 / 下 上 回车 0, 1, 3, 6, (* d0), 1, 2, 0, 7, (* d1), 2, 3, 1, 4, (* d2), 3, 0, 2, 5, (* d3), 4, 2, 2, 2, (* d4),/PWM分析子程序 5, 3, 3, 3, (* d5),/版本信息 6, 0, 0, 0, (* d6),/频率计子程序 7, 0, 1, 1, (* d7),/示波器子程序;/-void getkeyinput(void)uchar key_value,temp;re:temp=P3;temp|=0x03;P3=temp;key_value=P3&0x03;delay(50000);/0:下键 2:中键 1:上键 switch(key_value)case 1:keyfuncindex=keytabkeyfuncindex.keycrstate;beep(6500);break;case 2:keyfuncindex=keytabkeyfuncindex.keyupstate;beep(6500);break;case 0: keyfuncindex=keytabkeyfuncindex.keydnstate;beep(6500);break;default:goto re; keyfuncptr=keytabkeyfuncindex.currentoperate;(*keyfuncptr)();delay(65535);delay(65535);/-void beep(uint time)beep_port=0;delay(time);delay(time);delay(time);delay(time);beep_port=1;/-void sys_auto_check(void)uchar xx,c=3;dis_one_zi(0,2,x36,1,1);dis_one_zi(0,3,x37,1,1);dis_one_zi(0,4,x38,1,1);dis_one_zi(0,5,x39,1,1);dis_one_zi(1,1,x40,1,1);dis_one_zi(1,2,x41,1,1);dis_one_zi(1,3,x42,1,1);dis_one_zi(1,4,x7,1,1);dis_one_zi(1,5,x8,1,1);dis_one_zi(1,6,x9,1,1);while(-c!=0)for(xx=3;xx,1);dis_one_char(2,xx ,1);dis_one_char(2,xx+1,1);delay(50000);delay(50000);dis_one_char(2,xx-1, ,1);dis_one_char(2,xx , ,1);dis_one_char(2,xx+1, ,1); beep(60000); /-void main(void) using 0beep_port=1;EA=0;SP=0x7f;lcd_init();f_in=1;sys_auto_check();AD_init(7);keyfuncindex=0;d0();while(1) getkeyinput(); /-/模块:STC12C5412AD_Driver.C/功能:单片机增强功能驱动模块/晶振:24.000MHz/芯片: STC12C5412AD/版本:V1.0.0/设计:魏广寅/日期:2007.4.10#include STC12C5412AD.h#define uchar unsigned char#define uint unsigned int/-/*void set_timer0_1T()/设置T0为1T模式AUXR=AUXR|0x80;/-void set_timer1_1T()/设置T1为1T模式AUXR=AUXR|0x40;/-void set_timer0_12T()/设置T0为12T模式AUXR=AUXR&0x7f;/-void set_timer1_12T()/设置T1为12T模式AUXR=AUXR&0xbf;/-uchar EEPROM_read(uint addr)/EEPROM字节读ISP_ADDRH=(addr&0xff00)8;ISP_ADDRL=addr&0x00ff;ISP_CONTR=0x81;ISP_CMD=1;ISP_TRIG=0x46;ISP_TRIG=0xb9;return ISP_DATA;/-void EEPROM_write(uint addr,uchar dat)/EEPROM字节写ISP_DATA=dat;ISP_ADDRH=(addr&0xff00)8;ISP_ADDRL=addr&0x00ff;ISP_CONTR=0x81;ISP_CMD=2;ISP_TRIG=0x46;ISP_TRIG=0xb9;/-void EEPROM_ERASE(uint addr)/EEPROM扇区擦除ISP_ADDRH=(addr&0xff00)8;ISP_ADDRL=addr&0x00ff;ISP_CONTR=0x81;ISP_CMD=3;ISP_TRIG=0x46;ISP_TRIG=0xb9; */-/* void set_p3_tw() P3M0|=0x00; P3M1|=0x00; */ /-void AD_init(uchar AD_port_sel ) /ADC初始化ADC_CONTR|=0x80; /开ADC电源switch(AD_port_sel)/选择作为ADC的端口case 0:P1M0=0x01;P1M1=0x00;ADC_CONTR&=0xf8;break;case 1:P1M0=0x02;P1M1=0x00;ADC_CONTR&=0xf8;ADC_CONTR|=0x01;break;case 2:P1M0=0x04;P1M1=0x00;ADC_CONTR&=0xf8;ADC_CONTR|=0x02;break;case 3:P1M0=0x08;P1M1=0x10;ADC_CONTR&=0xf8;ADC_CONTR|=0x03;break;case 4:P1M0=0x10;P1M1=0x00;ADC_CONTR&=0xf8;ADC_CONTR|=0x03;break;case 5:P1M0=0x20;P1M1=0x00;ADC_CONTR&=0xf8;ADC_CONTR|=0x05;break;case 6:P1M0=0x40;P1M1=0x00;ADC_CONTR&=0xf8;ADC_CONTR|=0x06;break;case 7:P1M0=0x80;P1M1=0x80;ADC_CONTR&=0xf8;ADC_CONTR|=0x07;break;ADC_CONTR=0xe7;/-uint GET_AD_Result()/启动AD转换并返回转换值uchar temp;uint data_temp;data_temp=0;ADC_DATA=0;ADC_LOW2=0;ADC_CONTR|=0x08;re:temp=0x10;temp&=ADC_CONTR;if(temp=0)goto re;ADC_CONTR&=0xe7;data_temp=ADC_DATA;data_temp=2;data_temp+=ADC_LOW2;return data_temp;/-/模块:Dis_Wave.C/功能:示波器模块/晶振:24.000MHz/芯片: STC12C5412AD/版本:V1.0.0/设计:魏广寅/日期:2007.4.10#include lcd12864_driver_new.h#define uchar unsigned char #define uint unsigned intextern void d0(void);extern uchar keyfuncindex;extern void d1(void);extern void AD_init(uchar AD_port_sel );extern uint GET_AD_Result();/启动AD转换并返回转换值 extern void delay_1(uchar time);uint xdata record128;sbit key1=P30;sbit key2=P31;/-void delay(uint time)uchar jj,hh;while(-time!=0)for(jj=0;jj255;jj+)for(hh=0;hh255;hh+);/-void wave()uchar mod=1;uchar data k;float x2;lcd_init();AD_init(7);while(1)for(k=0;k128;k+)recordk=GET_AD_Result();switch(mod)case 0:if(recordk=512) dis_cls();for(k=0;k0;k-)x2=recordk/16;dis_point(64-x2,k); break; case 1:dis_cls();for(k=0;k0;k-)x2=recordk/16;dis_point(64-x2,k);delay(30000);break; key2=1; if(key2=0) mod=!mod; delay_1(5); key1=1; if(key1=0) delay_1(5); goto exit; exit:keyfuncindex=1;d1();delay(1);/-/模块:Freqen.C/功能:频率计模块/晶振:24.000MHz/芯片: STC12C5412AD/版本:V1.0.0/设计:魏广寅/日期:2007.4.10#include stc12c5412ad.h#define uchar unsigned char #define uint unsigned int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论