《单片机课程设计数字示波器.doc》由会员分享,可在线阅读,更多相关《单片机课程设计数字示波器.doc(18页珍藏版)》请在三一办公上搜索。
1、单片机课程设计题目:学院:电子工程学院 专业:应用电子技术 姓名: 班级:B0822 学号: 15 同组人员: 指导教师: 审批意见: 设计日期:2010.12.12010.12.15前言随着电子技术的发展和变化,对电路测量的要求也变得更高,在电子制作中会发现对很多参数的测量已不是一块万用表所能胜任的了,比如单片机某IO口的输出波形或制作放大器测其频率响应等等。所以,示波器自然而然地与万用表一样,变成了电子工程师和爱好者的必备工具。示波器是一种用途十分广泛的电子测量仪器。它能把肉眼看不见的电信号变换成看得见的图象,便于人们研究各种电现象的变化过程。示波器利用狭窄的、由高速电子组成的电子束,打在
2、涂有荧光物质的屏面上,就可产生细小的光点。在被测信号的作用下,电子束就好像一支笔的笔尖,可以在屏面上描绘出被测信号的瞬时值的变化曲线。利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用它测试各种不同的电量,如电压、电流、频率、相位差、调幅度等等。现代数字存储示波器首先对模拟信号进行高速采样获得相应的数字数据并存储。用数字信号处理技术对采样得到的数字信号进行相关处理与运算,从而获得所需的各种信号参数(包括可能需要使用万用表测试的一些元器件电气参数) 。 根据得到的信号参数绘制信号波形, 并可对被测信号进行实时的、 瞬态的分析,以方便用户了解信号质量,快速准确地进行故障的诊断。测量开始
3、时,操作者可通过中文界面选定测量类型(波形测量、元件测量) 、测量参数(频率/周期、有效值、电阻阻值、二极管通断等)及测量范围(可选自动设置,由仪器自动设置最佳范围) ;微处理器自动将测量设置解释到采样电路,并启动数据采集;采集完成后,由微处理器对采样数据按测量设置进行处理,提取所需要的测量参数,并将结果送显示部件。 如果需要,用户可选择自动测试方式:微处理器在分析首次采样得到的数据后会根据具体情况调整、修改测量设置,并重新采样。在经过几次这样的“采样-分析-调整-重采样”循环后,示波表即可完成即触即测功能,而无须人工调换量程,便于手持操作。 显然,数字存储示波器与传统的模拟示波器相比具有很多
4、突出的优点:可以根据被测信号的特点自动确定和调整测试条件,真正实现自动、离手测试。能够较容易地实现对高速、瞬态信号的实时捕获。在波形存储与运算方面有着明显的长处。设计方案:1.原理图模块:变换电路信号输入模数转换电路CPUAT89S52LCD12864波形显示独立键盘电源整个原理图模块2.5V基准电压TL431分频电路a) 变换电路:双12V电源输入5V电源输出信号输入信号输出LCD128645V电源输入信号输入b) 主电路:二分频电路c) 电源电路双12V变压输入可调电源输出2设计原理a) 原理:信号发生器中送出的是交流信号,而模数转换器只能采样正的电压信号。所以需要通过一个变换电路将双极性
5、的电压信号转换为单极性的电压信号,采用两个运放第一个运放(运放还起到阻抗匹配的作用)为反向比例相加器,由TL431得到2.5V的电压与信号叠加使输入信号整下降2.5V,在经第二个运放为方向电压跟随而得到前部为正的电压信号(前提是峰峰值不能超过5V),再将信号送入模数转换模块进行模数转换(AD0809需要640khz频率的时钟信号所以需要将单片机ALE引脚输出的2Mhz的时钟信号进行二分频得到1Mhz的时钟信号)得到数字信号,再送入单片机进行处理得到相应的坐标点,再经LCD12864的画线画点功能进行波形显示。由于单片机的处理速度有限所以此示波器的带宽非常窄只有1khz左右。b) 程序流程图:开
6、始LCD12864初始化显示汉字“数字示波器”显示字符“Vpp=0.0V”)画方框画坐标采样并转换为坐标点显示画线延时消除画线c) 原程序: #include#include#include#include#include#define uchar unsigned char#define uint unsigned int#define Lcd_Bus P0sbit RS=P25;sbit RW=P26;sbit ECLK=P27;sbit PSB=P24;sbit RET=P23;sbit Xgain=P37;sbit Xdecay=P35;sbit Ygain=P36;sbit Ydec
7、ay=P34;uchar idata a91;/data存储模式为低128个字节,而idata存储模式为256个字节uchar m;uint n;uchar code hanzi=数字示波器; uchar code zifu1=vpp= . v;uchar code zifu2=0123456789;uchar code zifu3=cao osc;/延时1msvoid delay1ms(uchar t)uchar i,j;do j=2;doi=165;do_nop_();while(-i);while(-j);while(-t);void delay2us(uchar t) do;while
8、(-t);/执行一次为2.18us /1次延时50msvoid delay50ms(uchar t)uchar i,j;do j=24;doi=208;do_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();while(-i);while(-j);while(-t);/检测忙函数void Check_Busy(void) RS=0; RW=1; Lcd_Bus=0xff; /先写一再读 ECLK=1; while(Lcd_Bus&0x80)=0x80); ECLK=0; /并行写字节函数dp=1写数据,dp=0写命令v
9、oid write12864bytep(uchar coma,bit dp) Check_Busy(); RS=dp;RW=0;ECLK=1;Lcd_Bus=coma;ECLK=0;delay2us(36);/并行读字节函数 dp=1读数据,dp=0写命令uchar read12864bytep(bit dp)uchar b;Check_Busy();RS=dp;RW=1;Lcd_Bus=0xff;ECLK=1;b=Lcd_Bus;ECLK=0;delay2us(36);return (b);/*Lcd12864函数初始化函数 */void init12864()delay1ms(50);PS
10、B=1;RET=0; /复位否则不能清屏,且要延时一段时间 delay1ms(1);/延时1msRET=1;delay1ms(10);write12864bytep(0x01,0);/清屏delay1ms(5);write12864bytep(0x02,0);/地址归位delay1ms(5);write12864bytep(0x06,0);/进入点设置 I/D=1光标重左到右;当S=1时内容移动write12864bytep(0x0c,0);/显示状设置/*图形清屏函数*/void Clrscreenhuitu() uchar x,y;write12864bytep(0x34,0);/关绘图
11、扩展功能设置 属扩展指令 for(y=0;y32;y+)for(x=0;x4;/x坐标Tier_bit=X&0x0f;/x位坐标if(Y32)Row=Y;/y坐标elseRow=Y-32;Tier+=8;/write12864bytep(0x34,0); /关绘图 扩展功能设置属扩展指令/*经反复试验无需按照先关绘图后开绘图,这样做执行次数多还会出现闪烁现象,只需在绘图时打开扩展及绘图即可,显示字符或汉字是则需关掉;*/write12864bytep(0x80+Row,0);/y坐标write12864bytep(0x80+Tier,0);/x坐标read12864bytep(1);ReadH
12、=read12864bytep(1);ReadL=read12864bytep(1);write12864bytep(0x80+Row,0);/y坐标write12864bytep(0x80+Tier,0);/x坐标if(Tier_bitTier_bit);break;case 1:ReadH|=(0x80Tier_bit);break;case 2:ReadH=(0x80Tier_bit);break;default:break;write12864bytep(ReadH,1);write12864bytep(ReadL,1);elseswitch(Color)case 0:ReadL&=(
13、0x80(Tier_bit-8);break;case 1:ReadL|=(0x80(Tier_bit-8);break;case 2:ReadL=(0x80(Tier_bit-8);break;default:break;write12864bytep(ReadH,1);write12864bytep(ReadL,1); /write12864bytep(0x36,0);/打开绘图功能/write12864bytep(0x30,0); /关扩展功能指令/*画水平线函数Color=0清除指定点 Color=1点亮某点,Color=2反色某点*/void Lcd12864DrawLineX(uc
14、har X0,uchar X1,uchar Y,uchar Color)uchar t; /中间变量进行交换if(X0X1)t=X0;X0=X1;X1=t;for(;X0Y1)t=Y0;Y0=Y1;Y1=t;for(;Y0= 0) /X的方向是增加的 s1 = 1; else /X的方向是降低的 s1 = -1; dy = Y1 - Y0; /判断Y的方向是增加还是降到的 if(dy = 0) s2 = 1; else s2 =- 1; dx = abs(X1-X0); /计算横、纵标志增加值的绝对值 dy = abs(Y1-Y0); if(dy dx) /以45度角为分界线,靠进Y轴是sta
15、tus=1,靠近X轴是status=0 temp = dx; dx = dy; dy = temp; status = 1; else status = 0; sub = dy + dy - dx; /第1次判断下个点的位置 for(i = 0;i = 0) if(status = 1) /在靠近Y轴区,x值加1 X0 += s1; else /在靠近X轴区,y值加1 Y0 += s2; sub -= (dx + dx); /判断下下个点的位置 if(status = 1) Y0 += s2; else X0 += s1; sub += dy + dy; /*汉字显示函数显示内容“数字示波器”
16、*/void hanzidisplay(uchar *dataa)write12864bytep(0x96,0);write12864bytep(*dataa,1);dataa+;write12864bytep(*dataa,1);dataa+;write12864bytep(0x8e,0);write12864bytep(*dataa,1);dataa+;write12864bytep(*dataa,1);dataa+;write12864bytep(0x87,0);write12864bytep(*dataa,1);dataa+;write12864bytep(*dataa,1);data
17、a+;write12864bytep(0x97,0);write12864bytep(*dataa,1);dataa+;write12864bytep(*dataa,1);dataa+;write12864bytep(0x8f,0);write12864bytep(*dataa,1);dataa+;write12864bytep(*dataa,1);/*字符显示函数显示内容“Vpp= . v”*/void zifudisplay(uchar *dataa1,uchar *dataa2)uchar i;write12864bytep(0x9c,0);for(i=0;i8;i+)write1286
18、4bytep(*dataa1,1);dataa1+;write12864bytep(0x98,0);for(i=0;i10)m-=10;delay1ms(10);while(!Xgain);for(i=0;i91;i+)ai=adc();if(i=0)max=min=a0;/得到第一个值不能放在for循环之外if(maxai)min=ai;delay2us(m);vpp=max-min;shi=vpp/51;ge=(uint)(vpp)%51*10/51;/需强制类型转换否则会出错/*经反复试验无需按照先关绘图后开绘图,这样做执行次数多还会出现闪烁现象,只需在绘图时打开扩展及绘图即可,显示字符
19、或汉字是则需关掉;*/write12864bytep(0x30,0);/关扩展和绘图功能进行显示字符write12864bytep(0x9e,0);write12864bytep(zifu2shi,1);/显示峰峰值十位write12864bytep(0x9f,0);write12864bytep(zifu2ge,1);/显示峰峰值个位write12864bytep(0x36,0);/开绘图功能下面要进行绘图/*得到采样的值的坐标函数*/void samplecoor()uchar i,x,y;sample();if(!Ydecay)delay1ms(10);if(!Ydecay)n+;del
20、ay1ms(10);while(!Ydecay);if(!Ygain)delay1ms(10);if(!Ygain)if(n!=1)n-;delay1ms(10);while(!Ygain);for(x=0;x5;x+)for(i=x*16;i=128)/为正值y=(ai-128)*0.196/n;if(ai-128)=10&(ai-128)5)y+;/必须要有大括号否则else将与最近的if配对elseif(uint)(ai-128)*1.96)%105)y+;ai=0x1a-y;else y=(128-ai)*0.196/n;if(128-ai)=10&(128-ai)5)y+;elsei
21、f(uint)(128-ai)*1.96)%105)y+;if(y=5)ai=0x1a+y;elsey=y-6; /当y等于6正好是32所以减6ai=y+32; /属于下半屏所以要加32for(i=80;i=128)/为正值y=(ai-128)*0.196/n;if(ai-128)=10&(ai-128)5)y+;elseif(uint)(ai-128)*1.96)%105)y+;ai=0x1a-y;elsey=(128-ai)*0.196/n;if(128-ai)=10&(128-ai)5)y+;elseif(uint)(128-ai)*1.96)%105)y+;if(y=5)ai=0x1a
22、+y;elsey=y-6;ai=y+32;/*显示绘制的采样点函数Color为0消除,为1显示*/void sampledisplay(Color)uchar X=1,i;/*需打的点的Y坐标已经放入ai*/for(i=0;i90;i+) Lcd12864DrawLine(X,ai,X+1,ai+1,Color);/X起始值为1即从第二列开始画线X+; /*边消除边显示绘制的采样点函数*/*void samplexiaoyingdisplay()uchar X=1,i;/存储上次打的点uchar idata b91; /data存储模式为低128个字节,而idata存储模式为256个字节for
23、(i=0;i91;i+)bi=ai;/*需打的点的Y坐标已经放入ai*/*samplecoor();for(i=0;i90;i+)Lcd12864DrawLine(X,bi,X+1,bi+1,0);/X起始值为1即从第二列清除上次的画线Lcd12864DrawLine(X,ai,X+1,ai+1,1);/X起始值为1即从第二列开始此次的画线X+;*/void main() m=10;n=1;init12864();Clrscreenhuitu();hanzidisplay(hanzi);/显示汉字zifudisplay(zifu1,zifu3); /显示字符write12864bytep(0x
24、36,0);/打开绘图功能/*经反复试验无需按照先关绘图后开绘图,这样做执行次数多还会出现闪烁现象,只需在绘图时打开扩展及绘图即可,显示字符或汉字是则需关掉;*/Lcd12864DrawRectangle(0,0,92,52,1); /画方框Lcd12864DrawCoor(1);/画坐标while(1) samplecoor(); sampledisplay(1); delay50ms(10); sampledisplay(0);/ADC0809.c文件#define uint unsigned int#define uchar unsigned char #define adc_bus P1sbit ALE=P32;sbit EOC=P31;sbit OE=P30;uchar adc()uchar adcdata;ALE=1;_nop_();_nop_();ALE=0;adc_bus=0xff;_nop_();_nop_();_nop_();_nop_();while(EOC=0);OE=1;adcdata=adc_bus;OE=0;return(adcdata)