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