单片机课程设计数字示波器

上传人:仙*** 文档编号:33889507 上传时间:2021-10-19 格式:DOC 页数:18 大小:871.50KB
返回 下载 相关 举报
单片机课程设计数字示波器_第1页
第1页 / 共18页
单片机课程设计数字示波器_第2页
第2页 / 共18页
单片机课程设计数字示波器_第3页
第3页 / 共18页
点击查看更多>>
资源描述
单片机课程设计题目:学院:电子工程学院 专业:应用电子技术 姓名: 班级:B0822 学号: 15 同组人员: 指导教师: 审批意见: 设计日期:2010.12.12010.12.15前言随着电子技术的发展和变化,对电路测量的要求也变得更高,在电子制作中会发现对很多参数的测量已不是一块万用表所能胜任的了,比如单片机某IO口的输出波形或制作放大器测其频率响应等等。所以,示波器自然而然地与万用表一样,变成了电子工程师和爱好者的必备工具。示波器是一种用途十分广泛的电子测量仪器。它能把肉眼看不见的电信号变换成看得见的图象,便于人们研究各种电现象的变化过程。示波器利用狭窄的、由高速电子组成的电子束,打在涂有荧光物质的屏面上,就可产生细小的光点。在被测信号的作用下,电子束就好像一支笔的笔尖,可以在屏面上描绘出被测信号的瞬时值的变化曲线。利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用它测试各种不同的电量,如电压、电流、频率、相位差、调幅度等等。现代数字存储示波器首先对模拟信号进行高速采样获得相应的数字数据并存储。用数字信号处理技术对采样得到的数字信号进行相关处理与运算,从而获得所需的各种信号参数(包括可能需要使用万用表测试的一些元器件电气参数) 。 根据得到的信号参数绘制信号波形, 并可对被测信号进行实时的、 瞬态的分析,以方便用户了解信号质量,快速准确地进行故障的诊断。测量开始时,操作者可通过中文界面选定测量类型(波形测量、元件测量) 、测量参数(频率/周期、有效值、电阻阻值、二极管通断等)及测量范围(可选自动设置,由仪器自动设置最佳范围) ;微处理器自动将测量设置解释到采样电路,并启动数据采集;采集完成后,由微处理器对采样数据按测量设置进行处理,提取所需要的测量参数,并将结果送显示部件。 如果需要,用户可选择自动测试方式:微处理器在分析首次采样得到的数据后会根据具体情况调整、修改测量设置,并重新采样。在经过几次这样的“采样-分析-调整-重采样”循环后,示波表即可完成即触即测功能,而无须人工调换量程,便于手持操作。 显然,数字存储示波器与传统的模拟示波器相比具有很多突出的优点:可以根据被测信号的特点自动确定和调整测试条件,真正实现自动、离手测试。能够较容易地实现对高速、瞬态信号的实时捕获。在波形存储与运算方面有着明显的长处。设计方案:1.原理图模块:变换电路信号输入模数转换电路CPUAT89S52LCD12864波形显示独立键盘电源整个原理图模块2.5V基准电压TL431分频电路a) 变换电路:双12V电源输入5V电源输出信号输入信号输出LCD128645V电源输入信号输入b) 主电路:二分频电路c) 电源电路双12V变压输入可调电源输出2设计原理a) 原理:信号发生器中送出的是交流信号,而模数转换器只能采样正的电压信号。所以需要通过一个变换电路将双极性的电压信号转换为单极性的电压信号,采用两个运放第一个运放(运放还起到阻抗匹配的作用)为反向比例相加器,由TL431得到2.5V的电压与信号叠加使输入信号整下降2.5V,在经第二个运放为方向电压跟随而得到前部为正的电压信号(前提是峰峰值不能超过5V),再将信号送入模数转换模块进行模数转换(AD0809需要640khz频率的时钟信号所以需要将单片机ALE引脚输出的2Mhz的时钟信号进行二分频得到1Mhz的时钟信号)得到数字信号,再送入单片机进行处理得到相应的坐标点,再经LCD12864的画线画点功能进行波形显示。由于单片机的处理速度有限所以此示波器的带宽非常窄只有1khz左右。b) 程序流程图:开始LCD12864初始化显示汉字“数字示波器”显示字符“Vpp=0.0V”)画方框画坐标采样并转换为坐标点显示画线延时消除画线c) 原程序:17 #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 Ydecay=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(-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写命令void 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);PSB=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);/关绘图 扩展功能设置 属扩展指令 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=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&=(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(uchar 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轴是status=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; /*汉字显示函数显示内容“数字示波器”*/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);dataa+;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+)write12864bytep(*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;/需强制类型转换否则会出错/*经反复试验无需按照先关绘图后开绘图,这样做执行次数多还会出现闪烁现象,只需在绘图时打开扩展及绘图即可,显示字符或汉字是则需关掉;*/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+;delay1ms(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+;elseif(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+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(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(0x36,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); 3. 实物效果展示: 4. 总结:经过十几天的努力终于取得了较好的结果,开始时对于数字示波器了解很少,很难下手。经老师的指导及自己查资料,然后逐渐的制定方案计划,首先我着手的是写Lcd12864液晶的驱动这一块比较好写,之后显示汉字和字符也比较好写,接着就是绘图啦!可以说这一块我花的时间非常多当时差点放弃,然后经查资料发现原资料绘图有错,把绘图的程序搞反了。之后就着手写模数转换驱动并将所转换的值找到对应的坐标值,当时犯了一个小错误没有先写好画点函数而是转换一个点就直接绘图,说到画点这个程序也写了很久,这个资料里也说得很含糊。而后,通过反复的查资料和调试终于实拉画点这个功能,之后做出来的结果是波形出来了但是不连续,而后又查资料发现其有画线功能,不过需要用到Bresenham画线算法,之后就能画线和画圆啦!现在就好办啦!显示波形就连续拉。可是问题又出现啦!画出的方框图和坐标会出现严重闪烁的现象。经反复试验发现原来是绘图那一块有一个操作是先关绘图功能开始绘图后开绘图功能这样的顺序执行画图,尤其我需要反复执行这样的程序使得图形闪烁。其实不需要按这样的顺序只需在绘图时打开扩展及绘图即可,显示字符或汉字时则需关掉;所以说有时候不需要完全按照资料中的步骤去执行任何事情,需要的是灵活变通。至于硬件这一块还是比较好解决问题出现的不是那么多。总的来说还是软件这一方面编写的时间比较长。通过这十几天的时间做一件事情,我发现当你反复的去做时你会发现其中许许多多的问题,并能越做越好。绝不能说我不能做到而放弃。经过这次亲身实践才真正体会到了“纸上得来终觉浅,绝知此事要躬行”这句话的真理。最后,要感谢老师的热情指导和同学的支持。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!