[问答] 是我程序问题还是仿真问题造成的LM016L没显示
422 仿真 程序 来自手机
分享
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>                       //包含必要的头文件

#define uint unsigned int
#define uchar unsigned char
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
#define NOP _nop_()


sbit HIGH=P2^3;
sbit LOW=P2^4 ;
sbit AD_CS =P1^0;
sbit SCK=P1^1;
sbit DO=P1^2;
sbit DI=P1^2;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;                            //必要的位定义

unsigned char adval;
uchar display_Buffer[] = "000.0KPa";
uchar code Line1[] = "Current Press:";          //初始化所显示的字符

   
uchar adc0832(uchar channel)      //读ADC0832函数,采集并返回
{
    uchar i=0;
    uchar j;
    uint dat2=0;
    uchar ndat=0;
    (channel==0)channel=2;
    if(channel==1)channel=3;
    AD_CS=0;NOP; NOP;                           //拉低CS端,AD片选
DI=1;NOP; NOP;  
//在第一个脉冲下降之前 DI 必须是高电平,表示启始信号
    SCK=1;NOP; NOP;
    SCK=0;NOP; NOP;
    SCK=1;                  
DI=channel&0x1;NOP;NOP;
  //在第二和第三个脉冲下降之前 DI 输入两位表示通道
   
    SCK=0;NOP; NOP;
    SCK=1;                  
    DI=(channel>>1)&0x1;NOP; NOP;
    SCK=0;                                  //写命令完成,DI失去输入作用
    DI=1;NOP;NOP;   
    dat2=0;
    for(i=0;i<8;i++)                                    //读出8字节数据
    {
       dat2|=DO;
       SCK=1;NOP; NOP;
       SCK=0;NOP; NOP;
       dat2<<=1;
       if(i==7)
               dat2|=DO;
}

    for(i=0;i<8;i++)
    {
      j=0;
      j=j|DO;
      SCK=1;NOP; NOP;
      SCK=0;NOP; NOP;
      j=j<<7;
      ndat=ndat|j;
      if(i<7)ndat>>=1;
}

    AD_CS=1;
    SCK=0;
    DO=1;
    dat2<<=8;
    dat2|=ndat;
    return(dat2);                                      //返回数据
}


void DelayMS(uint ms)             //延时程序,相应数值为相应毫秒数
{
    uchar i;
    while(ms--)
    {
      for(i=0;i<120;i++);                               //1mS延时
    }  
}


uchar Read_LCD_State()                         //检测LCD是否“忙”
{
    uchar state;
    RS=0;RW=1;E=1;DelayMS(1);
    state=P0;                                         //返回P0的值
    E= 0;DelayMS(1);
    return state;                                       //返回状态
}

void LCD_Busy_Wait()
{
    while((Read_LCD_State()&0x80)==0x80);
    DelayMS(5);
}


void LCD_Write_Command(uchar cmd)                      //写命令函数
{
     LCD_Busy_Wait();
     RS = 0;
     RW = 0;
     E  = 0;
     _nop_();
     _nop_();
     P0 = cmd;                   //将CMD值写入LCD产生相应的控制
     delay4us();
    E = 1;
     delay4us();
     E = 0;
}

void Set_LCD_Pos(uchar pos)     
{
    LCD_Write_Command(pos | 0x80);
}

void LCD_Write_Data(uchar dat)                        //写数据函数
{
    LCD_Busy_Wait();
    RS = 1;
    RW = 0;
    E  = 0;
    P0 = dat;
    delay4us();
   E = 1;  
    delay4us();
    E = 0;
}


void LCD_Initialise()                               //LCD初始化函数
{
     LCD_Write_Command(0x38); DelayMS(1);
     LCD_Write_Command(0x0c); DelayMS(1);
     LCD_Write_Command(0x06); DelayMS(1);
     LCD_Write_Command(0x01); DelayMS(1);
}


void Display_LCD_String(uchar p,uchar *s)              //LCD显示函数
{
    uchar i;
    Set_LCD_Pos(p);
    for(i=0;i<16;i++)
{  
   LCD_Write_Data(s);                                  //调用写数据函数
       DelayMS(1);  
    }
}


void write_sfm(uchar add,uchar num)                    //分秒函数
{   
     LCD_Write_Command(0x80+0x40+add);
                                            //第行数据指针位置调整
     LCD_Write_Data(0x30+num);  
}


void main()
{     
      uchar c;
      uint bai,sh,ge,xiaoshu;
           long d;                         //为得到小数部分,使用长整形数
      LCD_Initialise();
      DelayMS(10);
      Display_LCD_String(0x00,Line1);
      Display_LCD_String(0x46,Display_Buffer);
      HIGH=0;
           LOW=0;     

     while(1)
     {
          c=adc0832(0);
                   d=c;
                   d=d*10;                         //将数值扩大10倍得到小数
          d=((d-100)*1000/2360)+150;         //将电压值转换为压力值   
          bai=d/1000 ;                                 //分离出百位
          sh=d%1000/100;                               //分离出十位
          ge=d%100/10;                                 //分离出个位
                     xiaoshu=d%10        ;                            //分离出小数位
                    if(c>246)                                  //判断过压函数
                   {       HIGH=1;LOW=0;                     //开启过压报警灯
                           DelayMS(1) ;
                           write_sfm(6,bai);
                  write_sfm(7,sh);   
                  write_sfm(8,ge);
                           write_sfm(10,xiaoshu);                    //写数据
                   }
                   else if(c<10)                             //开启欠压报警灯                    {
                    {      LOW=1; HIGH=0;
                           write_sfm(6,bai);
                  write_sfm(7,sh);   
                  write_sfm(8,ge);
                           write_sfm(10,xiaoshu);                     //写数据
                   }
                   else
                   {  
                          HIGH=0;LOW=0;                           //正常状态,显示压力值                                 write_sfm(6,bai);
                 write_sfm(7,sh);   
                 write_sfm(8,ge);
                          write_sfm(10,xiaoshu);
                   }                     
}
}                                                            //程序完
0

IMG_20200624_190216.jpg (56.35 KB, 下载次数: 11)

IMG_20200624_190216.jpg
2020-6-25 17:05:21   评论 分享淘帖 邀请回答 举报

相关问题

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /7 下一条

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