魏坤示波器源程序.docx

上传人:飞****2 文档编号:54337364 上传时间:2022-10-28 格式:DOCX 页数:23 大小:16.20KB
返回 下载 相关 举报
魏坤示波器源程序.docx_第1页
第1页 / 共23页
魏坤示波器源程序.docx_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《魏坤示波器源程序.docx》由会员分享,可在线阅读,更多相关《魏坤示波器源程序.docx(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Noto:这是在魏坤的示波器基础上改的示波器程序,主控mega128,显示驱动ili9320,看我的文库里面有ili9320的函数。自己备注了一些,不懂可以发邮件到lewisz1990#include #include #include #include #include #include #include #define fifodata PINC#define FF_FIFO PORTD.7#define RES_FIFO PORTD.4#define EN_FIFO PINB.3#define R_FIFO PORTD.5unsigned char eep;unsigned long i

2、nt time0_old,time0_new,freq_time;/计数的几个变量unsigned long int freq,ffreq=0,datt,datty; /bit time_ok,RAMINC=0,RAMDEC=0,RUN=1,XINC=0,XDEC=0,YINC=0,YDEC=0;unsigned int x1_add=10,x2_add=310,y1_add=24,y2_add=216;unsigned char time=4,volt=4,dcac=1,T_ok=1,BIAO=0;/中断用到的几个变量unsigned int q=0;unsigned char sdata2

3、500,cl330; /cl前320个的初值为145,用来画线/时间计数interrupt TIM2_COMP void timer2_comp_isr(void) time0_new = TCNT1;/ 8ms到,记录当前T/C0的计数值 if (time0_new = time0_old) freq = freq + (time0_new - time0_old); else freq = freq + (65536 - time0_old + time0_new); time0_old = time0_new; if (+freq_time =125) /计数到一秒整 freq_time

4、 = 0; ffreq=freq*1.25; /ffreq的作用?真正的频率值,freq*1.25的意义?freq不是1s的计数值 time_ok=1; freq = 0; /切换BIAO的显示,x,y,或者空白interruptEXT_INT0 void ext_int0_isr(void) delay_ms(25); if(PIND.0=0) /INT0 低电平有效 if(PINB.6=0) / if(RUN=0) /RUN?全局的使能 if(BIAO=0) /这是一个复用键,和pb4到6和用 BIAO=1; LCD_PutString(20,250,X,0x0000,back); els

5、e if(BIAO=1) BIAO=2; LCD_PutString(20,250,Y,0x0000,back); else BIAO=0; /三个档位一次变换 LCD_PutString(20,250, ,0x0000,back); else if(PINB.5=0) /控制线的左移和右移 if(BIAO=1)XINC=1; else if(BIAO=2)YINC=1; else if(PINB.7=0) if(BIAO=1)XDEC=1; else if(BIAO=2)YDEC=1; while(PIND.0=0);/扫速减interruptEXT_INT1 void ext_int1_i

6、sr(void) delay_ms(25); if(PIND.1=0) /INT1 if(RUN=1) /RUN? if(time!=13) /对time计数 time+; spi_out(time); /spi传输time,volt,dcac spi_out(volt); spi_out(dcac); Write_EEPROM(time,0); /写eeprom,time的值和地址0 while(PIND.1=0); else RAMDEC=1; /? /灵敏度加interruptEXT_INT2 void ext_int2_isr(void) delay_ms(25); if(PIND.2

7、=0) /INT2 if(volt!=0) / volt-; spi_out(time); spi_out(volt); spi_out(dcac); Write_EEPROM(volt,1); /把电压灵敏度写到eeprom的地址1 while(PIND.2=0);/RUN/STOPinterruptEXT_INT3 void ext_int3_isr(void) delay_ms(25); if(PIND.3=0) /INT3 if(RUN=1) /run? RUN=0; LCD_PutString(20,265,STOP,0x0000,back); else RUN=1; LCD_Put

8、String(20,265,RUN,0x0000,back); while(PIND.3=0);/扫速加interruptEXT_INT4 void ext_int4_isr(void) delay_ms(25); if(PINE.4=0) if(RUN=1) if(time!=0) time-; spi_out(time); spi_out(volt); spi_out(dcac); Write_EEPROM(time,0); while(PINE.4=0); else RAMINC=1; /*T-ok?显示NT,ST*/interruptEXT_INT5 void ext_int5_isr

9、(void) delay_ms(25); if(PINE.5=0) if(T_ok=1) T_ok=0; LCD_PutString(20,10,NT,0x0000,back); else T_ok=1; LCD_PutString(20,10,ST,0x0000,back); Write_EEPROM(T_ok,3); while(PINE.5=0);/灵敏度减interruptEXT_INT6 void ext_int6_isr(void) /灵敏度减 delay_ms(25); if(PINE.6=0) if(volt!=11) volt+; spi_out(time); spi_out

10、(volt); spi_out(dcac); Write_EEPROM(volt,1); while(PINE.6=0);/*控制触发方式*/interruptEXT_INT7 void ext_int7_isr(void) delay_ms(25); if(PINE.7=0) if(dcac=1) dcac=0; LCD_PutString(20,230,DC,0x0000,back); else dcac=1; LCD_PutString(20,230,AC,0x0000,back); spi_out(time); spi_out(volt); spi_out(dcac); Write_E

11、EPROM(dcac,2); while(PINE.7=0);/*显示画线*/void DSO_out() unsigned char k=0,y=0;unsigned int i=0,s=0,x=0; for(i=0;i220)sdatai+q=220; /控制sdata【】中的值不要大于215,小于24 else if(sdatai+q20) sdatai+q=20; for(s=10;s310;s+) /这一部分应该就是显示波形数据的语句了,x坐标一次右移一位, /通过调用数组的相应量画点 LCD_SetPoint(cls,s,back) ; LCD_Line(cls,s,cls+1,s

12、,back);/由小点向大值的电画垂直的线 for(s=10;s24) /哦,原来是用红色表示峰峰值 LCD_Line(y1_add-1,10,y1_add-1,310,0xfffa); LCD_Line(y2_add,10,y2_add,310,0xf800); if(y2_add10) LCD_Line(20,x1_add-1,220,x1_add-1,0x0efffa); LCD_Line(20,x2_add,220,x2_add,0x0eff); if(x2_add310) LCD_Line(20,x2_add-1,220,x2_add-1,0x0efffa); /*关于各种指标的显示

13、*/void DSO() unsigned char c=0,vv=0,k,m; unsigned int i=0,d=0,v=0,a=0,b=0,s; while(1) if(time_ok) /计时到,显示频率 if(ffreq1000)sprintf(lcd_buffer, %3dHz ,ffreq); else if(ffreq)sprintf(lcd_buffer,%3d.%03dk ,ffreq/1000,ffreq%1000); else ffreq=ffreq/1000; sprintf(lcd_buffer,%3d.%03dM ,ffreq/1000,ffreq%1000);

14、 display_ascii_16bit(236,30,3,7); / LCD_PutString(1,20,0x0000,0xfff8); time_ok=0; switch(volt)/电压分辨率 case 0:sprintf(lcd_buffer, 5mv/div);break; case 1:sprintf(lcd_buffer, 10mv/div);break; case 2:sprintf(lcd_buffer, 20mv/div);break; case 3:sprintf(lcd_buffer, 50mv/div);break; case 4:sprintf(lcd_buffe

15、r, 100mv/div);break; case 5:sprintf(lcd_buffer, 200mv/div);break; case 6:sprintf(lcd_buffer, 500mv/div);break; case 7:sprintf(lcd_buffer, 1v/div);break; case 8:sprintf(lcd_buffer, 2v/div);break; case 9:sprintf(lcd_buffer, 5v/div);break; case 10:sprintf(lcd_buffer, 10v/div);break; case 11:sprintf(lcd

16、_buffer, 20v/div);break; default:break; display_ascii_16bit(20,130,3,7); /送显示(x,y,颜色,背景颜色) / LCD_PutString(1,20,0x0000,0xfff8); switch(time)/水平分辨率 case 0:sprintf(lcd_buffer, 1us/div);break; case 1:sprintf(lcd_buffer, 2us/div);break; case 2:sprintf(lcd_buffer, 5us/div);break; case 3:sprintf(lcd_buffe

17、r, 10us/div);break; case 4:sprintf(lcd_buffer, 20us/div);break; case 5:sprintf(lcd_buffer, 50us/div);break; case 6:sprintf(lcd_buffer, 100us/div);break; case 7:sprintf(lcd_buffer, 200us/div);break; case 8:sprintf(lcd_buffer, 500us/div);break; case 9:sprintf(lcd_buffer, 1ms/div);break; case 10:sprint

18、f(lcd_buffer, 2ms/div);break; case 11:sprintf(lcd_buffer, 5ms/div);break; case 12:sprintf(lcd_buffer, 10ms/div);break; case 13:sprintf(lcd_buffer, 20ms/div);break; default:break; display_ascii_16bit(236,210,3,7); / LCD_PutString(1,20,0x0000,0xfff8); EN_FIFO=1; /显示完,使能FIFO/ if(T_ok=1) ?/ / hile(FF=1)

19、;/ PORTB.4=PORTB.4;/? /停止给时钟信号 for(i=0;i50;i+) /? R_FIFO=0; R_FIFO=1; delay_ms(10); EN_FIFO=0; if(RUN) /RUN键是使能FIFO的?是全局使能 for(i=0;i800;i+) /7204要改一下 R_FIFO=0; sdatai=fifodata-8; /sdata赋值了 为什么要减8? R_FIFO=1; else for(i=0;i2500;i+) R_FIFO=0; sdatai=fifodata-8; / sdata赋值 R_FIFO=1; RES_FIFO=0; delay_us(

20、5); RES_FIFO=1; EN_FIFO=1; q=10; a=sdata0; b=sdata1; for(i=0;ia) a=sdatai; else if(sdatai=5) /5次显示一次,减少刷新次数 switch(volt)/计算键值 case 0:v=c*0.2083;break; /因为显示c是一个小于240的值,要把显示的值换算成量程的 case 1:v=c*0.4167;break; case 2:v=c*0.8333;break; case 3:v=c*2.083;break; case 4:v=c*4.167;break; case 5:v=c*8.333;brea

21、k; case 6:v=c*20.83;break; case 7:v=c*41.67;break; case 8:v=c*83.33;break; case 9:v=c*208.33;break; case 10:v=c*416.7;break; case 11:v=c*833.3;break; default:break; if(v=1000)sprintf(lcd_buffer, %3dmVpp,v); else sprintf(lcd_buffer,%3d.%03dVpp,v/1000,v%1000); display_ascii_16bit(20,30,3,7); /显示电压值 /

22、LCD_PutString(1,20,0x0000,0xfff8); vv=0; vv+; if(RUN)/选择触发方式,这里是符合d值的上升沿 while(!(sdataq=d) /触发 q+=1; q-=10; /这里的q为什么要这样定义 DSO_out(); /调用实时画线的函数了 else q=0; while(RUN=0) #asm(cli) DSO_out(); #asm(sei) stor_disp(q); / while(RAMINC=0&RAMDEC=0) / / if(RUN=1)break; / if(RAMINC=1) /这里的作用是干什么的 if(q=2070) q+=30; RAMINC=0; else RAMINC=0; else if(RAMDEC=1)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com