AD0808输入两条波形,想要对第二条波形提取峰值,并且显示在12864上,程序中是显示第二通道的数据,可是仿真结果却有问题,希望能帮忙看一下
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define unit unsigned int
- #define LCD_databus P0
- #define data P1
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
- uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xdf} ;
- unsigned char dat[]="0000";
- unsigned int AD_value[2],rec[20][2];
- unsigned char adc,res,min,xiudai,i,max,n;
- unsigned int om,od,dt,RP,MP,tmp;
- sbit EN=P2^0;
- sbit RW=P2^1;
- sbit RS=P2^2;
- sbit CS2=P2^3;
- sbit CS1=P2^4;
- sbit ST=P3^0;
- sbit A=P3^7;
- sbit OE=P3^1;
- sbit EOC=P3^2;
- sbit CLK=P3^3;
- sbit IN1=P2^5;
- sbit IN2=P2^6;
- sbit PWM=P2^7;
- sbit Key1=P3^4;
- sbit Key2=P3^5;
- sbit beef=P3^6;
- uchar code Hzk[]={
- /*-- 文字: 舒 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x28,0x24,0xE3,0x24,0x28,0x50,0x42,0x42,0x4A,0xD2,0x6A,0x46,0x40,0xC0,0x00,
- 0x01,0xF9,0x49,0x4F,0x49,0xF9,0x01,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x00,0x00,
- /*-- 文字: 张 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x02,0xE2,0x22,0x22,0x3E,0x80,0x80,0xFF,0x80,0xA0,0x90,0x88,0x86,0x80,0x80,0x00,
- 0x00,0x43,0x82,0x42,0x3E,0x00,0x00,0xFF,0x40,0x21,0x06,0x08,0x10,0x20,0x40,0x00,
- /*-- 文字: 压 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,0xFA,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
- 0x80,0x60,0x1F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x00,
- /*-- 文字: 收 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0xFC,0x00,0x00,0xFF,0x00,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00,
- 0x00,0x0F,0x04,0x02,0xFF,0x00,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00,
- /*-- 文字: 缩 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x20,0x38,0xE7,0x30,0x00,0x8C,0xC4,0x34,0x24,0x25,0xA6,0x64,0x24,0x24,0x2C,0x00,
- 0x22,0x27,0x12,0x12,0x01,0x00,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0xFF,0x00,0x00,
- /*-- 文字: : --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: mm --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
- 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,
- /*-- 文字: H --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
- 0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,
- };
- uchar code Ezk[]={
- /*-- 文字: 0 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
- /*-- 文字: 1 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
- /*-- 文字: 2 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
- /*-- 文字: 3 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
- /*-- 文字: 4 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
- /*-- 文字: 5 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
- /*-- 文字: 6 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
- /*-- 文字: 7 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
- /*-- 文字: 8 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
- /*-- 文字: 9 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
- };
- void delay1ms(uchar t)
- {
- uchar a,b;
- for(b=t;b>0;b--)
- {
- for(a=110;a>0;a--);
- }
- }
- void Positive_dianji()
- {
- IN1 = 0;
- IN2 = 1;
- }
- void Reverse_dianji()
- {
- IN1 = 1;
- IN2 = 0;
- }
- void Stop_dianji()
- {
- IN1 = 1;
- IN2 = 1;
- }
- void Key_Scan()
- {
- if(Key1 == 0)
- {
- delay1ms(10);
- if(Key1 == 0)
- {
- Positive_dianji();
- }
- }
- }
- void Read_busy()
- {
- uchar dat;//状态信息(判断是否忙)
- RS=0; // 数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令数据
- RW=1; //R/W=“H” ,E=“H”数据被读到DB7∽DB0
- do{
- LCD_databus=0x00;
- EN=1; //EN下降沿
- dat=LCD_databus;
- EN=0;
- dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
- }while(!(dat==0x00));
- }
- void write_LCD_command(uchar value)
- {
- Read_busy();
- RS=0;
- RW=0;
- LCD_databus=value;
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void write_LCD_data(uchar value)
- {
- Read_busy();
- RS=1;
- RW=0;
- LCD_databus=value;
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void Set_page(uchar page)
- {
- page=0xb8|page;
- write_LCD_command(page);
- }
- void Set_line(uchar startline)
- {
- startline=0xc0|startline;
- write_LCD_command(startline);
- }
- void Set_lie(uchar lie)
- {
- lie=lie&0x3f;
- lie=0x40|lie;
- write_LCD_command(lie);
- }
- void Setonoff(uchar onoff)
- {
- onoff=0x3e|onoff;
- write_LCD_command(onoff);
- }
- void SelectScreen(uchar screen)
- {
- switch(screen)
- {
- case 0:CS1=0;CS2=0 ;break;
- case 1:CS1=0;CS2=1 ;break;
- case 2:CS1=1;CS2=0 ;break;
- default: break;
- }
- }
- void ClearScreen(uchar screen)
- {
- uchar i,j;
- SelectScreen(screen);
- for(i=0;i<8;i++)
- {
- Set_page(i);
- Set_lie(0);
- for(j=0;j<64;j++)
- {
- write_LCD_data(0x00);
- }
- }
- }
- void Display(uchar ss,uchar page,uchar lie,uchar number) /*显示全角汉字*/
- {
- int i; //选屏参数,page选页参数,column选列参数,number选第几汉字输出
- SelectScreen(ss);
- lie=lie&0x3f;
- Set_page(page); //写上半页
- Set_lie(lie); //控制列
- for(i=0;i<16;i++) //控制16列的数据输出
- {write_LCD_data(Hzk[i+32*number]);} //i+32*number汉字的前16个数据输出
- Set_page(page+1); //写下半页
- Set_lie(lie); //控制列
- for(i=0;i<16;i++) //控制16列的数据输出
- {write_LCD_data(Hzk[i+32*number+16]);}//i+32*number+16汉字的后16个数据输出
- }
- void Displayen(uchar ss,uchar page,uchar lie,uchar number)/*显示半角汉字和数字和字母*/
- {int i;//选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
- SelectScreen(ss);
- lie=lie&0x3f;
- Set_page(page); //写上半页
- Set_lie(lie);
- for(i=0;i<8;i++)
- {write_LCD_data(Ezk[i+16*number]);}
- Set_page(page+1); //写下半页
- Set_lie(lie);
- for(i=0;i<8;i++)
- {write_LCD_data(Ezk[i+16*number+8]);}
- }
-
- void InitLCD()
- {
- Read_busy();
- SelectScreen(0);
- Setonoff(0);
- SelectScreen(0);
- Setonoff(1);
- SelectScreen(0);
- ClearScreen(0);
- Set_line(0);
- }
- void InitDingshi()
- {
- TMOD=0x01;
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- ET0=1;
- TR0=1;
- EA=1;
- }
- void Xianshi()
- {
- adc=max;//maibo
- tmp=adc*1.96;
- om=tmp*0.8;
- od=tmp*0.5;
- dat[4]=om%10;
- om=om/10;
- dat[5]=om%10;
- om=om/10;
- dat[6]=om%10;
- dat[7]=om/10;
- dat[0]=od%10;
- dat[1]=od/10%10;
- dat[2]=od/100%10;
- dat[3]=od/1000;
- Display(1,2,0,0);
- Display(1,2,16,1);
- Display(1,2,32,2);
- Display(1,2,48,5);
- Display(1,4,0,3);
- Display(1,4,16,4);
- Display(1,4,32,2);
- Display(1,4,48,5);
- Display(2,4,32,6);
- Display(2,4,48,7);
- Display(2,2,32,6);
- Display(2,2,48,7);
- Displayen(2,2,24,dat[4]);
- Displayen(2,2,16,dat[5]);
- Displayen(2,2,8,dat[6]);
- Displayen(2,4,24,dat[0]);
- Displayen(2,4,16,dat[1]);
- Displayen(2,4,8,dat[2]);
- }
- void tiqufengzhi()
- {
- if(max<AD_value[1])
- max=AD_value[1];
- rec[1][1]=max;
- }
- void main()
- {
- InitLCD();
- InitDingshi();
- while(1)
- {
- Key_Scan();
- ST=0;
- ST=1;
- ST=0;//启动转换
- while(EOC==0); //等待转换结果
- OE=1; //允许输出
- res=P1;
- OE=0;
- if(A==0)
- {
- AD_value[0]=res;
- if(AD_value[0]>180)
- {
- Reverse_dianji();
- }
- }
- if(A==1)
- {
- AD_value[1]=res;
- }
- A=!A;
- tiqufengzhi();
- Xianshi();
- }
- }
- void Timer0() interrupt 1
- {
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- CLK =~CLK;//ADC0809时钟信号
- PWM =~PWM;
- }
复制代码
全部资料51hei下载地址:
原理图选ad.zip
(277.14 KB, 下载次数: 6)
|