標(biāo)題:
單片機AD0808雙通道,顯示結(jié)果出了點問題
[打印本頁]
作者:
wlqqc123
時間:
2019-5-2 21:41
標(biāo)題:
單片機AD0808雙通道,顯示結(jié)果出了點問題
AD0808輸入兩條波形,想要對第二條波形提取峰值,并且顯示在12864上,程序中是顯示第二通道的數(shù)據(jù),可是仿真結(jié)果卻有問題,希望能幫忙看一下
單片機源程序如下:
#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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬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;//狀態(tài)信息(判斷是否忙)
RS=0; // 數(shù)據(jù)\指令選擇,D/I(RS)=“L” ,表示 DB7∽DB0 為顯示指令數(shù)據(jù)
RW=1; //R/W=“H” ,E=“H”數(shù)據(jù)被讀到DB7∽DB0
do{
LCD_databus=0x00;
EN=1; //EN下降沿
dat=LCD_databus;
EN=0;
dat=0x80 & dat; //僅當(dāng)?shù)?位為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; //選屏參數(shù),page選頁參數(shù),column選列參數(shù),number選第幾漢字輸出
SelectScreen(ss);
lie=lie&0x3f;
Set_page(page); //寫上半頁
Set_lie(lie); //控制列
for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
{write_LCD_data(Hzk[i+32*number]);} //i+32*number漢字的前16個數(shù)據(jù)輸出
Set_page(page+1); //寫下半頁
Set_lie(lie); //控制列
for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
{write_LCD_data(Hzk[i+32*number+16]);}//i+32*number+16漢字的后16個數(shù)據(jù)輸出
}
void Displayen(uchar ss,uchar page,uchar lie,uchar number)/*顯示半角漢字和數(shù)字和字母*/
{int i;//選屏參數(shù),pagr選頁參數(shù),column選列參數(shù),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;//啟動轉(zhuǎn)換
while(EOC==0); //等待轉(zhuǎn)換結(jié)果
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;
}
復(fù)制代碼
全部資料51hei下載地址:
原理圖選ad.zip
(277.14 KB, 下載次數(shù): 6)
2019-5-2 21:41 上傳
點擊文件名下載附件
原理圖選ad0809的
作者:
wlqqc123
時間:
2019-5-2 21:47
還想請教一個問題,就是怎么在記錄2通道出現(xiàn)波峰的同時,記錄1通道的電壓值,將他們作為一組數(shù)據(jù)保存起來
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1