找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 32145|回复: 97
收起左侧

基于stc89c51的示波器制作 程序,仿真,原理图分享

  [复制链接]
ID:93478 发表于 2015-10-25 22:09 | 显示全部楼层 |阅读模式
基于stc89c51的示波器制作,自己刚刚做出来的,程序,仿真,原理图
0.png
部分程序代码预览(完整版本请下载本帖最后的附件)
  1. #include "lcd12864.h"
  2. #include "osc.h"
  3. #include "common.h"
  4. #include "dots.h"

  5. unsigned char val_vdiv=2; //Y轴电压标度索引0~5
  6. unsigned char val_tdiv=0; //X轴时间标度索引0~5
  7. unsigned char acdc_flag=0; //交流直流档切换
  8. unsigned char run_flag=0;  //运行停止切换
  9. unsigned char pointxA;
  10. unsigned char pointxB;
  11. unsigned char pointyA;
  12. unsigned char pointyB;
  13. unsigned char xdata da_buffer[DATA_SIZE];
  14. unsigned char da_finish;
  15. char movx=0; //水平移动
  16. char movy=0; //垂直移动

  17. unsigned char code vdiv [] = {1,2,5,10,20,50};//电压标度索引是0到5,实际是0.1到5.0
  18. unsigned char code tdiv [] = {8,10,20,50,100};//扫描时间标度索引是0到5

  19. void disp_ypoint(void)
  20. {
  21.         unsigned char dat[ALL_LINE];
  22.         unsigned char j,i;       
  23.         for(j=0;j<3;j++) {
  24.                 for(i=0;i<7;i++) dat[i] = 0;
  25.                 if(j==0) {
  26.                         dat[(pointyA-2)/8] |= 0x01<<((pointyA-2)%8);
  27.                         dat[(pointyA-1)/8] |= 0x01<<((pointyA-1)%8);
  28.                         dat[(pointyA  )/8] |= 0x01<<((pointyA  )%8);
  29.                         dat[(pointyA+1)/8] |= 0x01<<((pointyA+1)%8);
  30.                         dat[(pointyA+2)/8] |= 0x01<<((pointyA+2)%8);
  31.                
  32.                         dat[(pointyB-2)/8] |= 0x01<<((pointyB-2)%8);
  33.                         dat[(pointyB-1)/8] |= 0x01<<((pointyB-1)%8);
  34.                         dat[(pointyB  )/8] |= 0x01<<((pointyB  )%8);
  35.                         dat[(pointyB+1)/8] |= 0x01<<((pointyB+1)%8);
  36.                         dat[(pointyB+2)/8] |= 0x01<<((pointyB+2)%8);
  37.                
  38.                         /*上下平移标志*/
  39.                         if(movy== (HEIGHT/2)) {                       
  40.                                 dat[(HEIGHT/2+4-movy)/8] |= 0x01<<((HEIGHT/2+4-movy)%8);
  41.                                 dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  42.                         }
  43.                         else if(movy==-(HEIGHT/2)) {
  44.                                 dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  45.                                 dat[(HEIGHT/2+6-movy)/8] |= 0x01<<((HEIGHT/2+6-movy)%8);
  46.                         }
  47.                         else {
  48.                                 dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  49.                         }                                               

  50.                         /*写LCD,刷新显示*/
  51.                         for(i=0;i<ALL_LINE;i++) {
  52.                                 lcd_cmd_wr(SETY+i,0);
  53.                                 lcd_cmd_wr(SETX+ZEROX-4,0);
  54.                                 lcd_data_wr(dat[i],0);
  55.                         }
  56.                 }
  57.                 else if(j==1){
  58.                         dat[(pointyA-1)/8] |= 0x01<<((pointyA-1)%8);
  59.                         dat[(pointyA  )/8] |= 0x01<<((pointyA  )%8);
  60.                         dat[(pointyA+1)/8] |= 0x01<<((pointyA+1)%8);
  61.                         dat[(pointyB-1)/8] |= 0x01<<((pointyB-1)%8);
  62.                         dat[(pointyB  )/8] |= 0x01<<((pointyB  )%8);
  63.                         dat[(pointyB+1)/8] |= 0x01<<((pointyB+1)%8);
  64.                
  65.                         /*上下平移标志*/
  66.                         dat[(HEIGHT/2+4-movy)/8] |= 0x01<<((HEIGHT/2+4-movy)%8);
  67.                         dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  68.                         dat[(HEIGHT/2+6-movy)/8] |= 0x01<<((HEIGHT/2+6-movy)%8);
  69.                        
  70.                         /*写LCD,刷新显示*/
  71.                                 for(i=0;i<ALL_LINE;i++) {
  72.                                 lcd_cmd_wr(SETY+i,0);
  73.                                 lcd_cmd_wr(SETX+ZEROX-3,0);
  74.                                 lcd_data_wr(dat[i],0);
  75.                         }
  76.                 }
  77.                 else {
  78.                         dat[(pointyA)/8] |= 0x01<<((pointyA)%8);
  79.                         dat[(pointyB)/8] |= 0x01<<((pointyB)%8);
  80.                
  81.                         /*上下平移标志*/
  82.                         if(movy==(HEIGHT/2)) {                       
  83.                                 dat[(HEIGHT/2+4-movy)/8] |= 0x01<<((HEIGHT/2+4-movy)%8);
  84.                                 dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  85.                         }
  86.                         else if(movy==-(HEIGHT/2)) {
  87.                                 dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  88.                                 dat[(HEIGHT/2+6-movy)/8] |= 0x01<<((HEIGHT/2+6-movy)%8);
  89.                         }
  90.                         else {
  91.                                 dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
  92.                         }
  93.                        
  94.                         /*写LCD,刷新显示*/
  95.                         for(i=0;i<ALL_LINE;i++) {
  96.                                 lcd_cmd_wr(SETY+i,0);
  97.                                 lcd_cmd_wr(SETX+ZEROX-2,0);
  98.                                 lcd_data_wr(dat[i],0);
  99.                         }
  100.                 }
  101.         }
  102. }
  103. //LCD波形显示区
  104. void disp(unsigned char x,unsigned char y,char l)
  105. {
  106.         unsigned char dat[ALL_LINE],j,k;       
  107.         x += ZEROX;       
  108.         y = ZEROY-1-y;//1是修正1行空白行
  109.         dat[0] = 0x10;
  110.         dat[1] = 0x0;
  111.         dat[2] = 0x0;
  112.         dat[3] = 0x0;
  113.         dat[4] = 0x0;
  114.         dat[5] = 0x0;
  115.         dat[6] = 0x40;

  116.        
  117.         if((x+1)%5==0) {
  118.                 dat[3] |= 0x20;        /*水平中心线*/
  119.                 dat[pointyA/8] |= 0x01<<pointyA%8;        /*水平测量线A*/
  120.                 dat[pointyB/8] |= 0x01<<pointyB%8;        /*水平测量线B*/
  121.         }

  122.         /*上下边框格点*/
  123.         //if(((x-ZEROX) ==WIDTH/2-1)||((x-ZEROX)%5==0)||((x-ZEROX) == WIDTH/2+1)) {
  124.         if((x-ZEROX)%5==0) {
  125.                 dat[0] |= 0x20;dat[ALL_LINE-1] |= 0x20;
  126.         }       

  127.         /*垂直测量线格点和垂直中心线*/
  128.         if(((x-ZEROX) == pointxA)||((x-ZEROX) == pointxB)||((x-ZEROX) == WIDTH/2)) {
  129.                 dat[0] |= 0x10;
  130.                 dat[1] |= 0x42;
  131.                 dat[2] |= 0x08;
  132.                 dat[3] |= 0x21;
  133.                 dat[4] |= 0x84;
  134.                 dat[5] |= 0x10;
  135.                 dat[6] |= 0x42;
  136.         }       

  137.         /*顶端测量线三角符号*/
  138.         if(x-ZEROX==(pointxA-2)) dat[0] |= 0x01;
  139.         if(x-ZEROX==(pointxA-1)) dat[0] |= 0x03;
  140.         if(x-ZEROX==(pointxA  )) dat[0] |= 0x07;       
  141.         if(x-ZEROX==(pointxA+1)) dat[0] |= 0x03;
  142.         if(x-ZEROX==(pointxA+2)) dat[0] |= 0x01;       
  143.         if(x-ZEROX==(pointxB-2)) dat[0] |= 0x01;
  144.         if(x-ZEROX==(pointxB-1)) dat[0] |= 0x03;
  145.         if(x-ZEROX==(pointxB  )) dat[0] |= 0x07;       
  146.         if(x-ZEROX==(pointxB+1)) dat[0] |= 0x03;
  147.         if(x-ZEROX==(pointxB+2)) dat[0] |= 0x01;       

  148.         /*顶端中点左右平移标志*/
  149.         if(movx == (WIDTH/2-1)) {
  150.                 if(x-ZEROX==WIDTH/2-movx-1) dat[0] |= 0x07;       
  151.                 if(x-ZEROX==WIDTH/2-movx  ) dat[0] |= 0x07;               
  152.                 if(x-ZEROX==WIDTH/2-movx+1) dat[0] |= 0x02;       
  153.         }
  154.         else if(movx==-(WIDTH/2-1)) {
  155.                 if(x-ZEROX==WIDTH/2-movx-1) dat[0] |= 0x02;       
  156.                 if(x-ZEROX==WIDTH/2-movx  ) dat[0] |= 0x07;               
  157.                 if(x-ZEROX==WIDTH/2-movx+1) dat[0] |= 0x07;       
  158.         }
  159.         else {
  160.                 if(x-ZEROX==WIDTH/2-movx-1) dat[0] |= 0x02;       
  161.                 if(x-ZEROX==WIDTH/2-movx) dat[0] |= 0x07;               
  162.                 if(x-ZEROX==WIDTH/2-movx+1) dat[0] |= 0x02;       
  163.         }

  164.         /*左边框*/       
  165.         if(x==ZEROX) {
  166.                 dat[0] = 0xf0;
  167.                 dat[1] = 0xff;
  168.                 dat[2] = 0xff;
  169.                 dat[3] = 0xff;
  170.                 dat[4] = 0xff;
  171.                 dat[5] = 0xff;
  172.                 dat[6] = 0x7f;       
  173.         }

  174.         /*左边框上格点*/
  175.         if(x==ZEROX+1) {
  176.                 dat[0] |= 0x10;
  177.                 dat[1] |= 0x42;
  178.                 dat[2] |= 0x08;
  179.                 dat[3] |= 0x21;
  180.                 dat[4] |= 0x84;
  181.                 dat[5] |= 0x10;
  182.                 dat[6] |= 0x42;       
  183.         }

  184.         /*右边框*/
  185.         if(x==ZEROX+WIDTH-1) {
  186.                 dat[0] = 0xf0;
  187.                 dat[1] = 0xff;
  188.                 dat[2] = 0xff;
  189.                 dat[3] = 0xff;
  190.                 dat[4] = 0xff;
  191.                 dat[5] = 0xff;
  192.                 dat[6] = 0x7f;       
  193.         }

  194.         /*右边框格点*/
  195.         if(x==ZEROX+WIDTH-2) {
  196.                 dat[0] |= 0x10;
  197.                 dat[1] |= 0x42;
  198.                 dat[2] |= 0x08;
  199.                 dat[3] |= 0x21;
  200.                 dat[4] |= 0x84;
  201.                 dat[5] |= 0x10;
  202.                 dat[6] |= 0x42;       
  203.         }

  204.         /*波形描点*/
  205.         if(l==0) dat[(y)/8] |= 0x01<<((y)%8);
  206.         else if(l>0) {
  207.                 for(j=0;j<l+1;j++) { //+1多描1点,波形更粗壮
  208.                         k=((y+j)/8);
  209.                         if(k>6) k=6;
  210.                         if(k==0) dat[0] |= (0x01<<((y+j)%8))&0xe0;
  211.                         else if(k==6) dat[6] |= (0x01<<((y+j)%8))&0x3f;
  212.                         else dat[k] |= 0x01<<((y+j)%8);
  213.                 }
  214.         }
  215.         else for(j=0;j<(-l)+1;j++) {
  216.                 k=((y-j)/8);
  217.                 if(k>6) k=6;               
  218.                 if(k==0) dat[0] |= (0x01<<((y-j)%8))&0xf0;
  219.                 else if(k==6) dat[6] |= (0x01<<((y-j)%8))&0x3f;
  220.                 else dat[k] |= 0x01<<((y-j)%8);
  221.         }


  222.         /*写入LCD*/
  223.         if(x<64) {
  224.                 for(j=0;j<ALL_LINE;j++) {
  225.                         lcd_cmd_wr(SETY+j,0);
  226.                         lcd_cmd_wr(SETX+x,0);
  227.                         lcd_data_wr(dat[j],0);
  228.                 }
  229.         }
  230.         else {
  231.                 x-=64;
  232.                 for(j=0;j<ALL_LINE;j++) {
  233.                         lcd_cmd_wr(SETY+j,1);
  234.                         lcd_cmd_wr(SETX+x,1);
  235.                         lcd_data_wr(dat[j],1);
  236.                 }               
  237.         }
  238. }

  239. void disp_vdiv(void)
  240. {               
  241.         unsigned int tmp;
  242.        
  243.         tmp = vdiv[val_vdiv];
  244.         /*y轴电压标度*/
  245.         lcd12864_put_xystr(0,7,4,Num+(tmp/10)*4);
  246.         lcd12864_put_xystr(5,7,1,Num+10*4);
  247.         lcd12864_put_xystr(7,7,4,Num+(tmp%10)*4);       

  248.         tmp = tdiv[val_tdiv];
  249.         /*x轴时间标度*/
  250.         if(tmp<100) {
  251.                 lcd12864_put_clr(23,7,8);
  252.                 lcd12864_put_xystr(23,7,4,Num+(tmp/10)*4);
  253.                 lcd12864_put_xystr(28,7,1,Num+10*4);
  254.                 lcd12864_put_xystr(30,7,4,Num+(tmp%10)*4);       
  255.         }
  256.         else {
  257.                 lcd12864_put_clr(23,7,8);
  258.                 lcd12864_put_xystr(25,7,4,Num+1*4);
  259.                 lcd12864_put_xystr(30,7,4,Num+0*4);       
  260.         }

  261.         /*AC,DC标识*/
  262.         lcd12864_put_xystr(47,7,12,ac_dc+acdc_flag*12);//0=ac,1=dc

  263.         /*RUN,PAUSE标识*/
  264.         lcd12864_put_xystr(60,7,17,run_paus+run_flag*17);//0=run,1=paus

  265.        
  266.         tmp=(pointyB-pointyA)*vdiv[val_vdiv];       
  267.         tmp/=5;

  268.         if(tmp < 100) {
  269.                 /*测量电压*/
  270.                 lcd12864_put_clr(79,7,11);
  271.                 lcd12864_put_xystr(79,7,4,Num + (tmp/10)*4);
  272.                 lcd12864_put_xystr(84,7,1,Num + 10*4);
  273.                 lcd12864_put_xystr(86,7,4,Num + (tmp%10)*4);       
  274.         }
  275.         else {       
  276.                 lcd12864_put_clr(79,7,11);
  277.                 lcd12864_put_xystr(79,7,4,Num+ (tmp/100)*4);
  278.                 lcd12864_put_xystr(85,7,4,Num+ (tmp/10 %10)*4);       
  279.         }

  280.        
  281.         tmp=50000/(pointxB-pointxA)/tdiv[val_tdiv];       
  282.         /*测量频率*/
  283.         lcd12864_put_clr(99,7,20);
  284.         if(tmp<10) {
  285.                 lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);       
  286.         }
  287.         else if(tmp <100) {
  288.                 lcd12864_put_xystr(109,7,4,Num+ (tmp/10%10)*4);       
  289.                 lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);
  290.         } else if(tmp <1000) {
  291.                 lcd12864_put_xystr(104,7,4,Num+ (tmp/100)*4);
  292.                 lcd12864_put_xystr(109,7,4,Num+ (tmp/10%10)*4);       
  293.                 lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);       
  294.         }
  295.         else {
  296.                 lcd12864_put_xystr(99,7,4,Num+ (tmp/1000)*4);
  297.                 lcd12864_put_xystr(104,7,4,Num+ (tmp/100%10)*4);
  298.                 lcd12864_put_xystr(109,7,4,Num+ (tmp/10%10)*4);       
  299.                 lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);       
  300.         }
  301. }

复制代码


0.png

基于STC89C52单片机数字示波器.zip

145.47 KB, 下载次数: 754, 下载积分: 黑币 -5

评分

参与人数 8黑币 +90 收起 理由
tieq1952 + 10 赞一个!
qjzyx + 4 赞一个!
18463580323 + 1 共享资料的黑币奖励!
sxsndhl + 5 这个好,手上就有单片机,有空试试看。
暗双魂 + 5 共享资料的黑币奖励!
随易而安 + 5 赞一个!
YJGG + 10
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:79544 发表于 2015-10-26 12:37 | 显示全部楼层
这么强的啊,尊敬!51黑有你更精彩!!!
回复

使用道具 举报

ID:93672 发表于 2015-10-26 20:54 | 显示全部楼层
没有图吗?

评分

参与人数 1黑币 +5 收起 理由
吾乐生世 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:93478 发表于 2015-10-27 16:01 来自手机 | 显示全部楼层
快乐516 发表于 2015-10-26 20:54
没有图吗?

你是要什么图?实物图吗?
回复

使用道具 举报

ID:92556 发表于 2015-10-27 18:39 | 显示全部楼层
额,,至少来点介绍内容吧
回复

使用道具 举报

ID:93764 发表于 2015-10-28 11:17 | 显示全部楼层
谢谢分享,下来看看
回复

使用道具 举报

ID:64913 发表于 2015-10-28 21:50 | 显示全部楼层
51单片机做的!强
回复

使用道具 举报

ID:85606 发表于 2015-12-10 16:36 | 显示全部楼层
楼主发帖辛苦了,谢谢分享!!!!!!!!
回复

使用道具 举报

ID:98031 发表于 2015-12-13 00:54 | 显示全部楼层
太强了搞不懂.
回复

使用道具 举报

ID:70330 发表于 2015-12-19 08:16 | 显示全部楼层
赞,51hei有你更精彩
回复

使用道具 举报

ID:70330 发表于 2015-12-19 08:17 | 显示全部楼层
有具体内容介绍吗?
回复

使用道具 举报

ID:106373 发表于 2016-2-25 19:43 | 显示全部楼层
我要做一个基于单片机与PC的虚拟示波器,在PC上用vb做一个示波器界面,用单片机测量收集电压数据传送给PC建立数据库,vb做的界面读取数据库显示电压波形,想你教我怎么在你这个上改,求回复
回复

使用道具 举报

ID:23303 发表于 2016-2-28 17:09 | 显示全部楼层
谢谢分享!下来看看
回复

使用道具 举报

ID:88673 发表于 2016-3-2 23:21 | 显示全部楼层
高手!先下来看看。谢谢!
回复

使用道具 举报

ID:112190 发表于 2016-4-4 17:56 | 显示全部楼层
bubu 发表于 2016-3-2 23:21
高手!先下来看看。谢谢!

高手,下载来学习学习,谢谢
回复

使用道具 举报

ID:111876 发表于 2016-4-5 16:49 | 显示全部楼层
抚你柔发的风 发表于 2016-2-25 19:43
我要做一个基于单片机与PC的虚拟示波器,在PC上用vb做一个示波器界面,用单片机测量收集电压数据传送给PC建 ...

想法不错,要是能把带宽做到100M,那就更好了!
回复

使用道具 举报

ID:114599 发表于 2016-5-4 14:01 来自手机 | 显示全部楼层
现在很需要有关示波器方面的资料
回复

使用道具 举报

ID:118566 发表于 2016-5-5 13:01 | 显示全部楼层
谢谢分享,下来看看
回复

使用道具 举报

ID:89152 发表于 2016-5-5 21:42 | 显示全部楼层
x下来看看11!!!!!!!!
回复

使用道具 举报

ID:101629 发表于 2016-5-6 20:28 | 显示全部楼层
受益匪浅 顶! 这种帖子才是精华
回复

使用道具 举报

ID:119041 发表于 2016-5-15 12:04 | 显示全部楼层
谢谢分享,51黑有你分享更精彩
回复

使用道具 举报

ID:129909 发表于 2016-7-10 15:25 | 显示全部楼层
谢谢分享,下来看看
回复

使用道具 举报

ID:110502 发表于 2016-7-21 15:51 | 显示全部楼层
这个太强悍了,只能膜拜!
回复

使用道具 举报

ID:120628 发表于 2016-7-24 21:51 | 显示全部楼层
大神啊,敬慕
回复

使用道具 举报

ID:97181 发表于 2016-7-27 08:01 | 显示全部楼层
希望楼主将参数写出来,相比PIC18F2550做的有什么区别
回复

使用道具 举报

ID:137219 发表于 2016-8-20 22:39 | 显示全部楼层
一直在找,这个不错试试怎么样。
回复

使用道具 举报

ID:100525 发表于 2016-8-28 22:37 | 显示全部楼层
谢谢分享,在找这方面的资料
回复

使用道具 举报

ID:116662 发表于 2016-8-31 23:52 来自手机 | 显示全部楼层
51做的很有才下载一份学习一下,谢谢分享
回复

使用道具 举报

ID:105415 发表于 2016-9-1 10:14 | 显示全部楼层
楼主高手啊!
回复

使用道具 举报

ID:138130 发表于 2016-9-1 10:30 | 显示全部楼层
我在学单片机,正好用的上,收藏了。
回复

使用道具 举报

ID:138130 发表于 2016-9-1 10:31 | 显示全部楼层
我在学单片机,正好用的上,收藏了。
回复

使用道具 举报

ID:72088 发表于 2016-9-1 11:51 | 显示全部楼层
图不管用啊,99SE打不开
回复

使用道具 举报

ID:138664 发表于 2016-9-6 22:55 | 显示全部楼层
这个真不错,楼主厉害
回复

使用道具 举报

ID:79034 发表于 2016-10-12 08:36 | 显示全部楼层
下载下来参考下。。
回复

使用道具 举报

ID:142835 发表于 2016-10-15 15:07 | 显示全部楼层
谢谢分享,楼主辛苦了
回复

使用道具 举报

ID:82098 发表于 2016-11-17 19:00 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:150294 发表于 2016-11-26 11:31 | 显示全部楼层
仿真不能用呀
回复

使用道具 举报

ID:153993 发表于 2016-12-11 21:20 | 显示全部楼层
154646464163456
回复

使用道具 举报

ID:85702 发表于 2016-12-15 01:21 | 显示全部楼层
下载学习下
回复

使用道具 举报

ID:18376 发表于 2016-12-15 14:31 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表