幸运时时彩平台

单片机+LCD12864数字示波器程序+Proteus仿真

2020-01-31来源: 51hei关键字:单片机  LCD12864  数字示波器  Proteus仿真

基于51单片机和Proteus仿真的数字示波器
 
#include
#include
//12864控制引脚定义
sbit DI = P2 ^ 2; //数据指令选择引脚
sbit RW = P2 ^ 1; //读写选择引脚
sbit E= P2 ^ 0;   //读写使能引脚
sbit CS1 = P2 ^ 4;    //片选1引脚
sbit CS2 = P2 ^ 3;    //片选2引脚
sbit BUSY= P1 ^ 7;    //忙标志位
//按键控制定义
sbit Y1 = P3 ^ 0;
sbit Y2 = P3 ^ 1;
sbit X1 = P3 ^ 3;
sbit X2 = P3 ^ 7;
//ADC0832控制引脚
sbit START=P3^4;
sbit OE=P3^6;
sbit EOC=P3^5;

unsigned int ADdata;    //AD采集值
unsigned int Ldata;
unsigned char ye,lei,shu;
unsigned char ADViewdata[91]; //AD显示数据存储区

char code FrameData[]={                     //提示字符存储区                                                                                                                                         
0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,    //示
0x00,0x20,0x20,0x20,0x10,0x20,0x13,0xFE,0x82,0x22,0x42,0x24,0x4A,0x20,0x0B,0xFC,
0x12,0x84,0x12,0x88,0xE2,0x48,0x22,0x50,0x22,0x20,0x24,0x50,0x24,0x88,0x09,0x06,                //波                
0x00,0x00,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,0x01,0x20,0x01,0x10,0xFF,0xFE,
0x02,0x80,0x0C,0x60,0x30,0x18,0xC0,0x06,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,    //器 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    //" "
};
//AD转换软件
void ADCChage()
{
  START=1;
  START=0;
  while(EOC==0)  //等待转换完成
{
   OE=1;
}
  ADdata = P0;   //读取AD数据
        OE=0;
}
//检查12864液晶状态                               
void CheckState()
{
  DI=0;
        RW=1;
        do
        {
          E=1; 
          E=0;
   //仅当第7位为0时才可操作(判别busy信号)
        }while(BUSY==1);
}
//向12864写入一个字节的命令
void WriteCommand(unsigned char cmd)         
{
        CheckState();         //检查当前的12864状态
        DI = 0;
        RW = 0;
        P1 = cmd;             //送出相应的命令
        E = 1;
        E = 0;
}  
//向12864写入一个字节的数据
void WriteData(unsigned char dat)                
{
   CheckState();   //检查当前的12864状态
   DI = 1; 
   RW = 0;
   P1 = dat;       //送出相应的数据
   E = 1; 
   E = 0; 
}
//12864液晶的选择控制引脚
void LCMCSControl(unsigned int csl)
{
  if(csl==1)    //根据参数不同判断当前的12864控制引脚状态
  { 
    CS1=0,
    CS2=1;
  }
  if(csl==2)
  {
    CS1=1,
    CS2=0;
  }
  if(csl==3)
  {
    CS1=0,
    CS2=0;
  }
}
//12864显示函数
void LCMView()
{
  LCMCSControl(Ldata);     //先发送控制命令
  WriteCommand(ye);
  WriteCommand(lei);
  WriteData(shu);         //然后发送数据
}
//12864的清屏函数
void CleanScreen()                                                
{
        unsigned char page,i;
        LCMCSControl(3);
        for(page=0xb8;page<=0xbf;page++)
        {   
                WriteCommand(page);
                WriteCommand(0x40);
                for(i=0;i<64;i++)
    {
                  WriteData(0x00);
    }
        }
        LCMCSControl(1);
  lei=0x40;
        for(ye=0xb8;ye<0xbf;ye++)
        {
         shu=0xff;
         LCMView();
        }
        ye=0xb8;
        for(lei=0x40;lei<=0x7f;lei++)
        {
          shu=0x80;
          LCMView();
        }
        ye=0xbf;
        for(lei=0x40;lei<=0x7f;lei++)
        {
          shu=0x01;
          LCMView();
        }
  LCMCSControl(2);
  ye=0xb8;
        for(lei=0x40;lei<=0x5b;lei++)
  {
          shu=0x80;
          LCMView();
        }
        ye=0xbf;
        for(lei=0x40;lei<=0x5b;lei++)
        {
          shu=0x01;
          LCMView();
        }
        lei=0x5b;
        for(ye=0xb9;ye<=0xbe;ye++)
        {
         shu=0xff;
         LCMView();
        } 
}
//12864的初始化函数
void InitLCM(void)   
{        
  WriteCommand(0xc0);
        WriteCommand(0x3f);
}
//50us的延时函数
void Delay50us(unsigned int t)
{
unsigned char j;  
for(;t>0;t--)   
  for(j=19;j>0;j--);
}
//刷新12864液晶
void RefreshLCM()
{
  unsigned char i;
  for(i=0xb9;i<=0xbe;i++)
  {
    ye=i;
          shu=0x00;
          LCMView();
        }
}
//主函数
void main()
{
    unsigned int r,j,q,k;
    unsigned int Xaxis =0;
    unsigned int Yaxis = 1;
    unsigned char l;
    unsigned char d1,d2,d3,d4,d5;
    CleanScreen();
    InitLCM();
          LCMCSControl(2);
          l=0xb8;
          for(k=0;k<4;k++,l=l+0x02)         //首先显示右侧的提示
          {
            ye=l;
            lei=0x70;
            for(r=0;r<16;r++)
      {
        shu=FrameData[2*r+1+32*k];
              LCMView();
              lei++;
            }
            ye=l+0x01;
            lei=0x70;
            for(r=0;r<16;r++)
      { 
        shu=FrameData[2*r+32*k];
              LCMView();
              lei++;
            }
        }
  while(1)
  {
    while(X2==0)      //调节X轴
    {
      while(X2==0);
      Xaxis = Xaxis + 1;
    }
    while(X1==0)
    {
      while(X1==0);
      if(Xaxis!=0) 
      {
        Xaxis = Xaxis - 1;
      }
    }
    while(Y1==0)     //调节Y轴
    {
      while(Y1==0);
      Yaxis = Yaxis + 1;
    }
    while(Y2==0)
    {
      while(Y2==0);
      if(Yaxis!=1) 
      {
        Yaxis=Yaxis-1;
      }
    }
    for(j=0;j<90;j++) //AD采样最大值
    {
      ADCChage();
      ADViewdata[j]=ADdata;
      if(ADViewdata[j]>ADViewdata[91])
      {
        ADViewdata[91]=ADViewdata[j];
      }
      Delay50us(Xaxis);
    }
    while(ADdata!=ADViewdata[91])    //如果采集值不相等,则继续
    {
      ADCChage();
    }
    for(j=0;j<90;j++)      //连续采样90次
    {
       ADCChage();
       ADViewdata[j]=ADdata; 
       Delay50us(Xaxis);
    }
    lei=0x41;
    for(r=0,j=0;r<90;r++,j++)
          {
             if(j<63)
      { 
        Ldata=1;
      }
            if(j==63)
      { 
        lei=0x40;
      }
            if(j>=63)
      {
        Ldata=2;
      }
            RefreshLCM();     //刷新当前显示
            if(ADViewdata[j>=127])//正电压
            {                             
        ADdata=(ADViewdata[j]-127)*0.196/Yaxis;  //计算电压值
        if(ADdata<=7)       
        {
          ye=0xbb;
          shu=(0x80>>ADdata);
        }
              else if(ADdata<=15) 
        {
          ye=0xba;
          shu=(0x80>>(ADdata-8));
        }
        else if(ADdata<=23)
        {
          ye=0xb9;
          shu=(0x80>>(ADdata-16));
         }
        else if(ADdata<=31) 
        {
          ye=0xb9;
          shu=(0x80>>(ADdata-24));
        }
            }
            if(ADViewdata[j]<127)     //负电压
            {
                ADdata=(127-ADViewdata[j])*0.196/Yaxis;    //计算电压值
          if(ADdata<=7)
          {
              ye=0xbc;
              shu=(0x01<<(ADdata));
          }
          else if(ADdata<=15)
          {
              ye=0xbd;
              shu=(0x01<<(ADdata-8));
          }
          else if(ADdata<=23) 
          {
              ye=0xbe;
              shu=(0x01<<(ADdata-16));
          }
                else if(ADdata<=31)
          {
              ye=0xbe;
              shu=(0x01<<(ADdata-24));
          }
            }
      if(r==0)//判断正负
            {
              d1=shu;
              d2=ye;
             }
             if(r!=0)
            {
              d3=shu;
              d4=ye;
              if(ye==d2)  //如果相等,则判断是否显示完成
              {
                if(shu>d1)
                {
                  d5=shu;
                  d5=d5>>1;
                  while(d5!=d1)
                  {
              d5=d5>>1;
                    shu=shu|(shu>>1);
            }
                }
                if(shu                {
                  d5=shu;
                  d5=d5<<1;
                  while(d5!=d1)
                 {
              d5=d5<<1;
              shu=shu|(shu<<1);
           } 
                }
              }
        if(ye              {  
                for(q=0;q<7;q++) 
                {
                        shu=shu|(shu<<1);
                      } 
                    LCMView();
                     ye++;
                    while(ye        {
          shu=0xff;
          LCMView();
          ye++;
        }
                    if(ye==d2)
        {
                        shu=0x01;
                                          if(shu                  {
                    d5=shu;
                    d5=d5<<1;
                    while(d5!=d1)
                    {
                d5=d5<<1;
                shu=shu|(shu<<1);
               } 
                   }
                                          }
        }
              if(ye>d2)
              {
                for(q=0;q<7;q++) 
                {
                        shu=shu|(shu>>1);
                      }
                    LCMView();
                     ye--;
                    while(ye>d2) {shu=0xff,LCMView(),ye--;}
                    if(ye==d2)
        {
                        shu=0x80;
                                          if(shu>d1)
                  {
                    d5=shu;
                    d5=d5>>1;
                    while(d5!=d1)
                    {
                d5=d5>>1;
                shu=shu|(shu>>1);
               } 
                   }
                                } 
      }
          }
          if(r!=0)
          {
            d1=d3;
            d2=d4;
          }
    LCMView();
    if(lei!=0x7f)
    {
      lei++;
    }
   }
        }
}

关键字:单片机  LCD12864  数字示波器  Proteus仿真 编辑:什么鱼 引用地址:http://news.sonata9.com/mcu/ic486812.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机驱动TEA5767 FM立体声收音机C51通用源码
下一篇:单片机PWM+红外对管控制直流电机设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于52单片机控制编码器显示程序
#include "reg52.h"    #define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;sbit DIR=P1^0;sbit STEP=P1^1;sbit K1=P3^1;sbit K2=P3^0;typedef unsigned int u16;   //对数据类型进行声明定义typedef unsigned char
发表于 2020-02-08
单片机步进电机转速控制程序(速度LED显示)
单片机源程序如下://数码管位 高位-----低位//四个按键控制步进电机:正转,反转,加1,减1//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式//电机转速一共10档,通过按键调节转速 //电机正转时最高位数码管显示0,反转时显示1  #include<reg51.h>#define uchar unsigned char#define uint unsigned int#define led P0//数码管段选#define haha P2sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit
发表于 2020-02-08
单片机步进电机转速控制程序(速度LED显示)
STC单片机+DM134实现LED多段控制
 单片机源程序如下://============================================================================//================翼芯科技 LED流星灯8段16段==软件生成生成数据=================//============================================================================   //  此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知//         
发表于 2020-02-08
STC单片机+DM134实现LED多段控制
基于51单片机的数字电容测量仪设计
本设计详细介绍了一种基于单片机的数字式电容测量仪设计方案及实现方法。设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度。通过单片机的计时器测量脉宽, 根据已知的R值,通过单片机的运算功能,计算出电容容量,最后,再通过单片机的普通I/O口控制液晶屏显示出电容容量的计算结果。系统的测量范围为10pF~ 500uF, 具有多个量程,可根据用户需要由用户选择,与用户的交互是通过键盘实现,不同量程的实现是通过单片机的I/O口控制继电器的吸合与断开来选择不同的R值,从而实现不同的量程。同时,本设计注重设计方法及流程,首先根据原理设计电路,再通过protues仿真,利用keil编程,进而借助altium designer
发表于 2020-02-08
基于51单片机的数字电容测量仪设计
基于51单片机的pwm直流电机调速
仿真原理图如下单片机源程序如下:#include <reg52.h>/********************************************** 定时器初值*********************************************/#define T0HIGH        0xec#define T0LOWW        0x8a
发表于 2020-02-08
基于51单片机的pwm直流电机调速
手把手教你单片机串口通信-基础篇
1的个数之和应为偶数。接收字符时,对1的个数进行校验,若字符不一致,则说明传输数据过程中出现错误。代码和校验发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时,同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,一致则无差。循环冗余校验通过某种数学预算实现有效信息与校验位之间的循环校验,常用语对磁盘信息的传输、存储区的完整性校验。串口的基本结构SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。当发送使用时,就采用SBUF=XXX;  
发表于 2020-02-08
手把手教你单片机串口通信-基础篇
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD。com。cn, Inc。 All rights reserved
福建11选5官网 山东11选5 500万彩票开奖记录数据分析 小米彩票投注 广西快3走势 吉林快3计划 幸运时时彩 彩票高賠率好平台 北京pk10 安徽快3走势