标题:
单片机AD0808双通道,显示结果出了点问题
[打印本页]
作者:
wlqqc123
时间:
2019-5-2 21:41
标题:
单片机AD0808双通道,显示结果出了点问题
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)
2019-5-2 21:41 上传
点击文件名下载附件
原理图选ad0809的
作者:
wlqqc123
时间:
2019-5-2 21:47
还想请教一个问题,就是怎么在记录2通道出现波峰的同时,记录1通道的电压值,将他们作为一组数据保存起来
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1