找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机示波器制作(12864显示带字库)

查看数: 26632 | 评论数: 32 | 收藏 13
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-6-29 18:11

正文摘要:

  首先说明:我才接触51单片机3个星期(6月8号才高考完),对C语言还很陌生。我就是一个萌新,还希望大佬们多多指导。   12864(带字库st7920驱动)为显示器,XPT2046为AD转换芯片。(不要问我 ...

回复

ID:880853 发表于 2021-1-27 11:30
厉害了,一直都打算玩单片机,都不敢动手,看了你们的帖子有点跃跃欲试了
ID:689120 发表于 2021-1-23 09:59
谢谢楼主,有电路图就更好了。
ID:876818 发表于 2021-1-22 08:56
好资料,51黑有你更精彩!!!
ID:102800 发表于 2021-1-21 09:39
谢谢分享最近正在搞这个东东
ID:866313 发表于 2021-1-15 20:27
山椒鸡爪 发表于 2017-7-16 21:08
**** 作者被禁止或删除 内容自动屏蔽 ****

XPT2046的命令,0xE4选择的是AUX输入模拟信号
ID:253767 发表于 2020-5-26 07:38
谢谢分享!!!
ID:696556 发表于 2020-3-25 23:51
接线图分享一下呗
ID:288930 发表于 2020-3-19 15:01
很好,谢谢分享!
ID:702057 发表于 2020-3-17 18:22
跪拜,大神啊!
ID:118132 发表于 2020-3-17 17:14
谢谢分享,领教了
ID:544490 发表于 2019-5-25 09:36
用你这个程序有的点偏离比较大是什么原因
ID:481742 发表于 2019-5-3 11:31
试试能不能用
ID:481742 发表于 2019-5-3 11:30
看看
ID:511507 发表于 2019-4-14 20:04
这个read_data函数是干嘛用的
ID:229939 发表于 2018-10-20 10:46
学习中,谢谢分享
ID:399179 发表于 2018-10-12 19:29
这个能不能用?
ID:384206 发表于 2018-10-12 15:14
你好  我在用普中科技板子上的xpt2046写示波器的程序   但是 我是的外部输入端(12脚)  在没有输入的时候 数码管也会显示900=1500 的示数 ,  并且在我接上正弦信号后没有任何反应, 12脚接地也没反应 这是为什么 ...  求解
ID:8130 发表于 2018-6-8 21:15
19960601 发表于 2017-7-27 14:49
XPT2046是AD转换芯片?你确定?不是触摸屏控制芯片?楼主你逗我呢

别逗,XPT2046是一种典型的逐次逼近型模数转换器(SARADC),自己百度
ID:319015 发表于 2018-4-29 17:11
积分不够下,能透漏下XPT2046.c和 XPT2046.h的内容嘛?谢
ID:302712 发表于 2018-4-19 10:00
学习中,谢谢分享
ID:263148 发表于 2017-12-26 15:56
谢谢楼主的分享
ID:253767 发表于 2017-12-21 15:20
这是个很实用的家伙
ID:220927 发表于 2017-12-6 14:08
负半周期电压不见了是楼主对电位差没有理解,如果理解了这样就能采集到负半周期的波形了,频率这种定西还要启动定时器,真麻烦
ID:48413 发表于 2017-8-7 19:28
谢谢楼主的分享
ID:98792 发表于 2017-7-27 14:49
XPT2046是AD转换芯片?你确定?不是触摸屏控制芯片?楼主你逗我呢
ID:220115 发表于 2017-7-16 21:08
15576118519 发表于 2017-7-4 11:17
这几天我又对程序进行了修改——将AD检测过程与屏幕刷新过程分离,大大提高了检测速度。(此外我将程序修改 ...

a=Read_AD_Data(0xE4);这句代码怎么来的?
ID:217359 发表于 2017-7-5 14:45
6666
厉害了
ID:209954 发表于 2017-7-4 11:17
这几天我又对程序进行了修改——将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);
    }



}





ID:209954 发表于 2017-6-29 21:16
blink 发表于 2017-6-29 20:04
这个是可以测频率的吗

不可以,就只能显示波形。不过我参考别人写的程序后觉得加装LM393再修改一下程序也许就能测频率。我现在没有LM393,也许你可以试一试。
ID:215119 发表于 2017-6-29 20:04
这个是可以测频率的吗
ID:1 发表于 2017-6-29 18:16
好资料,51黑有你更精彩!!!

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表