厉害了,一直都打算玩单片机,都不敢动手,看了你们的帖子有点跃跃欲试了 |
谢谢楼主,有电路图就更好了。 |
好资料,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黑有你更精彩!!! |