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的
|