找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1483|回复: 1
打印 上一主题 下一主题
收起左侧

单片机AD0808双通道,显示结果出了点问题

[复制链接]
跳转到指定楼层
楼主
ID:393114 发表于 2019-5-2 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD0808输入两条波形,想要对第二条波形提取峰值,并且显示在12864上,程序中是显示第二通道的数据,可是仿真结果却有问题,希望能帮忙看一下

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar  unsigned char
  3. #define unit  unsigned int
  4. #define LCD_databus P0
  5. #define data P1
  6. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
  7. uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xdf} ;
  8. unsigned char dat[]="0000";
  9. unsigned int AD_value[2],rec[20][2];
  10. unsigned char adc,res,min,xiudai,i,max,n;
  11. unsigned int om,od,dt,RP,MP,tmp;
  12. sbit EN=P2^0;
  13. sbit RW=P2^1;
  14. sbit RS=P2^2;
  15. sbit CS2=P2^3;
  16. sbit CS1=P2^4;
  17. sbit ST=P3^0;
  18. sbit A=P3^7;
  19. sbit OE=P3^1;
  20. sbit EOC=P3^2;
  21. sbit CLK=P3^3;
  22. sbit IN1=P2^5;
  23. sbit IN2=P2^6;
  24. sbit PWM=P2^7;
  25. sbit Key1=P3^4;
  26. sbit Key2=P3^5;
  27. sbit beef=P3^6;
  28. uchar code Hzk[]={  
  29. /*--  文字:  舒  --*/
  30. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  31. 0x10,0x28,0x24,0xE3,0x24,0x28,0x50,0x42,0x42,0x4A,0xD2,0x6A,0x46,0x40,0xC0,0x00,
  32. 0x01,0xF9,0x49,0x4F,0x49,0xF9,0x01,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x00,0x00,

  33. /*--  文字:  张  --*/
  34. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  35. 0x02,0xE2,0x22,0x22,0x3E,0x80,0x80,0xFF,0x80,0xA0,0x90,0x88,0x86,0x80,0x80,0x00,
  36. 0x00,0x43,0x82,0x42,0x3E,0x00,0x00,0xFF,0x40,0x21,0x06,0x08,0x10,0x20,0x40,0x00,

  37. /*--  文字:  压  --*/
  38. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  39. 0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,0xFA,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
  40. 0x80,0x60,0x1F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x00,

  41. /*--  文字:  收  --*/
  42. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  43. 0x00,0xFC,0x00,0x00,0xFF,0x00,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00,
  44. 0x00,0x0F,0x04,0x02,0xFF,0x00,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00,

  45. /*--  文字:  缩  --*/
  46. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  47. 0x20,0x38,0xE7,0x30,0x00,0x8C,0xC4,0x34,0x24,0x25,0xA6,0x64,0x24,0x24,0x2C,0x00,
  48. 0x22,0x27,0x12,0x12,0x01,0x00,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0xFF,0x00,0x00,

  49. /*--  文字:  :  --*/
  50. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52. 0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  53. /*--  文字:  mm  --*/
  54. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  55. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  56. 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,

  57. /*--  文字:  H  --*/
  58. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  59. 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
  60. 0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,

  61. };
  62. uchar code Ezk[]={





  63. /*--  文字:  0  --*/
  64. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  65. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

  66. /*--  文字:  1  --*/
  67. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  68. 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

  69. /*--  文字:  2  --*/
  70. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  71. 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

  72. /*--  文字:  3  --*/
  73. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  74. 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

  75. /*--  文字:  4  --*/
  76. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  77. 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

  78. /*--  文字:  5  --*/
  79. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  80. 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

  81. /*--  文字:  6  --*/
  82. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  83. 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

  84. /*--  文字:  7  --*/
  85. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  86. 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

  87. /*--  文字:  8  --*/
  88. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  89. 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

  90. /*--  文字:  9  --*/
  91. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  92. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
  93. };
  94. void delay1ms(uchar t)  
  95. {
  96.     uchar a,b;
  97.     for(b=t;b>0;b--)
  98.        {
  99.             for(a=110;a>0;a--);
  100.         }          
  101. }
  102. void Positive_dianji()
  103. {
  104.     IN1 = 0;
  105.         IN2 = 1;
  106. }
  107. void Reverse_dianji()
  108. {
  109.     IN1 = 1;
  110.         IN2 = 0;
  111. }
  112. void Stop_dianji()
  113. {
  114.         IN1 = 1;
  115.         IN2 = 1;
  116. }
  117. void Key_Scan()
  118. {
  119.         if(Key1 == 0)
  120.         {
  121.            delay1ms(10);
  122.            if(Key1 == 0)
  123.            {
  124.                      Positive_dianji();
  125.            }
  126.         }
  127. }
  128. void Read_busy()
  129. {
  130.         uchar dat;//状态信息(判断是否忙)
  131.         RS=0; // 数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令数据
  132.         RW=1; //R/W=“H” ,E=“H”数据被读到DB7∽DB0
  133.         do{
  134.         LCD_databus=0x00;
  135.     EN=1;        //EN下降沿
  136.         dat=LCD_databus;
  137.     EN=0;
  138.     dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
  139.     }while(!(dat==0x00));
  140. }
  141. void write_LCD_command(uchar value)
  142. {
  143.         Read_busy();
  144.         RS=0;
  145.         RW=0;
  146.         LCD_databus=value;
  147.         EN=1;
  148.         delay1ms(1);
  149.         EN=0;
  150. }
  151. void write_LCD_data(uchar value)
  152. {
  153.         Read_busy();
  154.         RS=1;
  155.         RW=0;
  156.         LCD_databus=value;
  157.         EN=1;
  158.         delay1ms(1);
  159.         EN=0;
  160. }
  161. void Set_page(uchar page)       
  162. {
  163.         page=0xb8|page;
  164.         write_LCD_command(page);
  165. }
  166. void Set_line(uchar startline)
  167. {
  168.         startline=0xc0|startline;
  169.         write_LCD_command(startline);       
  170. }
  171. void Set_lie(uchar lie)
  172. {
  173.         lie=lie&0x3f;
  174.         lie=0x40|lie;
  175.         write_LCD_command(lie);
  176. }
  177. void Setonoff(uchar onoff)
  178. {
  179.         onoff=0x3e|onoff;
  180.         write_LCD_command(onoff);
  181. }
  182. void SelectScreen(uchar screen)
  183. {
  184.         switch(screen)
  185.         {
  186.                 case 0:CS1=0;CS2=0 ;break;
  187.                 case 1:CS1=0;CS2=1 ;break;
  188.                 case 2:CS1=1;CS2=0 ;break;
  189.                 default: break;
  190.         }
  191. }
  192. void ClearScreen(uchar screen)
  193. {
  194.         uchar i,j;
  195.         SelectScreen(screen);
  196.         for(i=0;i<8;i++)
  197.         {
  198.           Set_page(i);
  199.           Set_lie(0);
  200.            for(j=0;j<64;j++)
  201.            {
  202.                 write_LCD_data(0x00);          
  203.            }
  204.         }
  205. }
  206. void Display(uchar ss,uchar page,uchar lie,uchar number)  /*显示全角汉字*/
  207. {
  208. int i;        //选屏参数,page选页参数,column选列参数,number选第几汉字输出
  209. SelectScreen(ss);
  210. lie=lie&0x3f;
  211. Set_page(page);        //写上半页
  212. Set_lie(lie); //控制列
  213. for(i=0;i<16;i++)  //控制16列的数据输出
  214. {write_LCD_data(Hzk[i+32*number]);} //i+32*number汉字的前16个数据输出
  215. Set_page(page+1);                 //写下半页
  216. Set_lie(lie);           //控制列
  217. for(i=0;i<16;i++)          //控制16列的数据输出
  218. {write_LCD_data(Hzk[i+32*number+16]);}//i+32*number+16汉字的后16个数据输出
  219. }
  220. void Displayen(uchar ss,uchar page,uchar lie,uchar number)/*显示半角汉字和数字和字母*/
  221. {int i;//选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
  222. SelectScreen(ss);
  223. lie=lie&0x3f;
  224. Set_page(page);        //写上半页
  225. Set_lie(lie);
  226. for(i=0;i<8;i++)
  227. {write_LCD_data(Ezk[i+16*number]);}
  228. Set_page(page+1);        //写下半页
  229. Set_lie(lie);
  230. for(i=0;i<8;i++)
  231. {write_LCD_data(Ezk[i+16*number+8]);}
  232. }

  233. void InitLCD()
  234. {
  235.         Read_busy();
  236.         SelectScreen(0);
  237.         Setonoff(0);
  238.            SelectScreen(0);
  239.         Setonoff(1);
  240.         SelectScreen(0);
  241.         ClearScreen(0);
  242.         Set_line(0);
  243. }
  244. void InitDingshi()
  245. {

  246. TMOD=0x01;
  247. TH0=(65536-150)/256;
  248. TL0=(65536-150)%256;
  249. ET0=1;
  250. TR0=1;
  251. EA=1;
  252. }
  253. void Xianshi()
  254. {
  255. adc=max;//maibo  
  256. tmp=adc*1.96;
  257. om=tmp*0.8;
  258. od=tmp*0.5;
  259. dat[4]=om%10;
  260. om=om/10;                       
  261. dat[5]=om%10;
  262. om=om/10;
  263. dat[6]=om%10;
  264. dat[7]=om/10;
  265. dat[0]=od%10;                       
  266. dat[1]=od/10%10;
  267. dat[2]=od/100%10;
  268. dat[3]=od/1000;
  269. Display(1,2,0,0);
  270. Display(1,2,16,1);
  271. Display(1,2,32,2);
  272. Display(1,2,48,5);
  273. Display(1,4,0,3);
  274. Display(1,4,16,4);
  275. Display(1,4,32,2);
  276. Display(1,4,48,5);
  277. Display(2,4,32,6);
  278. Display(2,4,48,7);
  279. Display(2,2,32,6);
  280. Display(2,2,48,7);
  281. Displayen(2,2,24,dat[4]);
  282. Displayen(2,2,16,dat[5]);
  283. Displayen(2,2,8,dat[6]);
  284. Displayen(2,4,24,dat[0]);
  285. Displayen(2,4,16,dat[1]);
  286. Displayen(2,4,8,dat[2]);
  287. }
  288. void tiqufengzhi()
  289. {
  290. if(max<AD_value[1])
  291.    max=AD_value[1];
  292.    rec[1][1]=max;

  293. }

  294. void main()
  295. {
  296. InitLCD();
  297. InitDingshi();
  298. while(1)
  299. {
  300. Key_Scan();
  301. ST=0;
  302. ST=1;
  303. ST=0;//启动转换
  304. while(EOC==0);    //等待转换结果      
  305. OE=1;   //允许输出
  306. res=P1;
  307. OE=0;
  308. if(A==0)
  309. {
  310.   AD_value[0]=res;
  311. if(AD_value[0]>180)
  312. {
  313.   Reverse_dianji();
  314. }
  315. }
  316. if(A==1)
  317. {
  318. AD_value[1]=res;
  319. }
  320. A=!A;
  321. tiqufengzhi();
  322. Xianshi();
  323. }               

  324. }
  325. void Timer0() interrupt 1
  326. {
  327. TH0=(65536-150)/256;
  328. TL0=(65536-150)%256;
  329. CLK =~CLK;//ADC0809时钟信号
  330. PWM =~PWM;
  331. }
复制代码

全部资料51hei下载地址:
原理图选ad.zip (277.14 KB, 下载次数: 6)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:393114 发表于 2019-5-2 21:47 | 只看该作者
还想请教一个问题,就是怎么在记录2通道出现波峰的同时,记录1通道的电压值,将他们作为一组数据保存起来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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