![]() |
發布時間: 2017-6-29 18:11
正文摘要:首先說明:我才接觸51單片機3個星期(6月8號才高考完),對C語言還很陌生。我就是一個萌新,還希望大佬們多多指導。 12864(帶字庫st7920驅動)為顯示器,XPT2046為AD轉換芯片。(不要問我 ... |
厲害了,一直都打算玩單片機,都不敢動手,看了你們的帖子有點躍躍欲試了 |
謝謝樓主,有電路圖就更好了。 |
好資料,51黑有你更精彩!!! |
謝謝分享最近正在搞這個東東 |
山椒雞爪 發表于 2017-7-16 21:08 XPT2046的命令,0xE4選擇的是AUX輸入模擬信號 |
謝謝分享!!! |
接線圖分享一下唄 |
很好,謝謝分享! |
跪拜,大神啊! |
謝謝分享,領教了 |
用你這個程序有的點偏離比較大是什么原因 |
試試能不能用 |
看看![]() |
這個read_data函數是干嘛用的 |
學習中,謝謝分享 |
這個能不能用? |
你好 我在用普中科技板子上的xpt2046寫示波器的程序 但是 我是的外部輸入端(12腳) 在沒有輸入的時候 數碼管也會顯示900=1500 的示數 , 并且在我接上正弦信號后沒有任何反應, 12腳接地也沒反應 這是為什么 ... 求解 |
19960601 發表于 2017-7-27 14:49 別逗,XPT2046是一種典型的逐次逼近型模數轉換器(SARADC),自己百度 |
![]() |
學習中,謝謝分享 |
謝謝樓主的分享 |
這是個很實用的家伙 |
負半周期電壓不見了是樓主對電位差沒有理解,如果理解了這樣就能采集到負半周期的波形了,頻率這種定西還要啟動定時器,真麻煩 |
謝謝樓主的分享 |
XPT2046是AD轉換芯片?你確定?不是觸摸屏控制芯片?樓主你逗我呢 |
15576118519 發表于 2017-7-4 11:17 a=Read_AD_Data(0xE4);這句代碼怎么來的? |
6666 厲害了 |
這幾天我又對程序進行了修改——將AD檢測過程與屏幕刷新過程分離,大大提高了檢測速度。(此外我將程序修改為5秒自動刷新,以方便觀察。) 修改后的main.c如下。 #include <reg52.h> #include"XPT2046.h" #define uint unsigned int #define uchar unsigned char uchar xdata a[128]; sbit RS=P2^6; //這個是LCD的數據命令選擇端 sbit RW=P2^5; //這個是LCD的寫入或是讀出選擇端 sbit RST=P1^0; //這個是LCD的復位端口 sbit LCDE=P2^7; // 這個是LCD的使能端 sbit PSB=P3^2; void delay(uchar i) { while(i--); } void delayms(uint c) //誤差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } void lcd_busy() { RS=0; RW=1; P0=0XFF; LCDE=1; delay(14); while((P0&0x80)==0x80); LCDE=0; } void write_com(uchar com) { lcd_busy();RS=0; RW=0; LCDE=0; P0=com; delay(9); LCDE=1; delay(9); LCDE=0; } void write_num(uchar num) { lcd_busy(); RS=1; RW=0; LCDE=0; P0=num; delay(7); LCDE=1; delay(9); LCDE=0; } uchar read_data() { uchar read; lcd_busy(); RS=1; RW=1; LCDE=0; delay(7); LCDE=1; delay(9); read=P0; LCDE=0; delay(11);; return read; } void clear_lcd() { uchar i,j; write_com(0x34); for(i=0;i<32;i++) //因為LCD有縱坐標32格所以寫三十二次 { write_com(0x80+i); //先寫入縱坐標Y的值 write_com(0x80); //再寫入橫坐標X的值 for(j=0;j<32;j++) //橫坐標有16位,每位寫入兩個字節的的數據,也就寫入32次 { //因為當寫入兩個字節之后橫坐標會自動加1,所以就不用再次寫入地址了。 write_num(0x00); } } write_com(0x36); write_com(0x30); } void put_point(uchar x,uchar y) { uint bt=0,read=0; uchar x_adr,y_adr,h_bit,l_bit; y_adr=0x80+y%32; //計算Y軸的地址,應為縱坐標有64個,所有對32求余,當Y大于31時,Y的坐標是下半屏的。 if(y>31) //計算X軸的地址當Y大于31時X的地址在下半屏,從0X88開始,小于31時X的地址是在上半屏,從0X80開始 x_adr=0x88+x/16; else x_adr=0x80+x/16; bt=0x8000>>(x%16); //求這個點到底是在哪個點 write_com(0x34); write_com(0x34); write_com(y_adr); //讀取數據的時候要先寫入所取數據的地址 write_com(x_adr); read_data(); //讀取的第一個字節不要, read=read_data(); //從第二個字節開始接收。 read<<=8; read|=read_data(); bt=bt|read; h_bit=bt>>8; l_bit=bt; write_com(y_adr); //寫入點的時候,重新寫入地址,因為地址已經改變。 write_com(x_adr); write_num(h_bit); write_num(l_bit); write_com(0x36); //開顯示 write_com(0x30); //轉回基本指令集 } /* 液晶初始化 */ void lcd_init() { PSB=1; RST=1; write_com(0x30); //基本指令操作 write_com(0x0c); //開顯示 write_com(0x01); //清除LCD顯示 } void main() { while(1) { uchar x,i,y; lcd_init(); clear_lcd(); write_com(0x34); write_com(0x34); write_com(0x80); write_com(0x88); for(i=16;i>0;i--) //畫出X軸 { write_num(0xff); } for(i=0;i<64;i++) //畫出Y軸 { put_point(0,i); } for(i=0;i<128;i++) { a[i] = Read_AD_Data(0xE4); } for(i=0;i<128;i++) { x=i; y=32-(a[i]/10); put_point(x,y); } write_com(0x36); write_com(0x30); delayms(5000); } } |
blink 發表于 2017-6-29 20:04 不可以,就只能顯示波形。不過我參考別人寫的程序后覺得加裝LM393再修改一下程序也許就能測頻率。我現在沒有LM393,也許你可以試一試。 |
這個是可以測頻率的嗎 |
好資料,51黑有你更精彩!!! |