1602显示数字不稳定一直跳动(AD转换)

2019-05-20来源: 互联网关键字:1602  显示数字  AD转换

程序如下所示:


首先说明下,此程序为AD转换芯片PCF8591采集电压数据,然后送到1602显示。


现象:1602显示的数字一直频繁的跳动,乱花眼。此现象不是一直出现的,有时候会出现,同样的硬件,同样的程序,昨天还是好好的,今天一开机就会跳动,让人捉摸不透,即使我把中断屏蔽了也不行,后来百度有人说可能是读AD的时候没有把中断关闭,可是我中断已经屏蔽了啊,不纯在不关闭的情况啊?但是我还是按照他给的建议在读AD前加上了EA=0,读后EA=1,然后再试,果然立马好了。


#include

#include

 

sbit SDA=P2^0;

sbit SCL=P2^1;

 

sbit lcd_rs=P1^0;

sbit lcd_rw=P1^1;

sbit lcd_en=P2^5;

sbit beep=P2^3;

 

bit ADFlag;

 

unsigned char num,count;

unsigned char table[]="Voltage: .    V";

unsigned char TempData[2];

char shi,ge,bai;

 

void Delay(unsigned char i)

{

unsigned char j,k;

for(j=i;j>0;j--)

for(k=110;k>0;k--);

}

 

 

void NOP()

{

    _nop_();

    _nop_();

    _nop_();    

    _nop_();

}

/****起始****/

void i2c_start()

{

    SDA=1;

    NOP();

    SCL=1;

    NOP();

    SDA=0;

    NOP();

    SCL=0;

    NOP();

}

/****停止****/

void i2c_stop()

{

    SDA=0;

    NOP();

    SCL=1;

    NOP();

    SDA=1;

    NOP();

}

/****写字节****/

void Write_Byte(unsigned char date)

{

     unsigned char i,temp;

      temp=date;

    for(i=0;i<8;i++)

    {

        temp=temp<<1;

        SDA=CY;

        NOP();

        SCL=1;

        NOP();

        SCL=0;

        NOP();

      }

        SDA=0;

        NOP();

        SCL=1;

        NOP();

        SCL=0;

        NOP();       

}

/****应答i2c****/

void Ack(void)

{

    SDA=0;

    NOP();

    SCL=1;

    NOP();

    SCL=0;

    NOP();

}

 

/****非应答i2c****/

void No_Ack(void)

{

    SDA=1;

    NOP();

    SCL=1;

    NOP();

    SCL=0;

    NOP();

}

 

//读字节。注意:读数据时SCL与SDA的先后顺序

unsigned char Read_Byte()

{

    unsigned char i,temp=0;

    SCL=0;

    NOP();

    SDA=1;

    for(i=0;i<8;i++)

    {

        temp=temp<<1;

        NOP();

        temp=temp|SDA;

        SCL=1;

        NOP();

        SCL=0;

        NOP();

  }

    return temp;

}

 

//读取AD模数转换的值,有返回值

unsigned char Read_PCF8591_ADC()

{

    unsigned char temp;

    i2c_start();

    Delay(20);

    Write_Byte(0x90);  //写入地址

    Delay(20);

    Write_Byte(0x42);  //选择通道

    Delay(20);

    i2c_start();

    Write_Byte(0x91);  //读命令

    temp= Read_Byte();

    i2c_stop();

    return temp;

}

 

void lcd1602_write_com(unsigned char a)

{

    lcd_rs=0;

    Delay(5);

    lcd_rw=0;

    Delay(5);

    P0=a;

    Delay(5);

    lcd_en=1;

    Delay(5);

    lcd_en=0;

}

 

void lcd1602_write_date(unsigned char b)

{

    lcd_rs=1;

    Delay(5);

    lcd_rw=0;

    Delay(5);

    P0=b;

    Delay(5);

    lcd_en=1;

        Delay(5);

      lcd_en=0;

 

}

 

void lcd1602_init()

{

      lcd_en=0;

      Delay(5);

    lcd1602_write_com(0x38);

    Delay(5);

    //lcd1602_write_com(0x08);

    Delay(5);

    lcd1602_write_com(01);

    Delay(5);

    lcd1602_write_com(0x06);

    Delay(5);

    lcd1602_write_com(0x0c);

    Delay(5);    

 

}

 

void lcd1602_Display()

{

    lcd1602_write_com(0x80+0x01);

    for(num=0;num<15;num++)

     {

        lcd1602_write_date(table[num]);

        Delay(20);

      }

     lcd1602_write_com(0x80+0x40+1); 

}

 

//定时器中断程序

void Timer0_init()

{

    TMOD=0x01;  //定时器0,模式1,16位定时器    

    TR0=1;

    TH0=(65535-50000)/256;   //高8位,=60

    TL0=(65536-50000)%256;  //低8位

    ET0=1;  //使能定时器0中断

    EA=1;   //开总中断

}

 

 

void main()

{

     // unsigned char AD_temp;  //如果用此语句,会在值达到255后溢出,并重新计数

   long AD_temp;

   long kk;

     lcd1602_init();

     Timer0_init();

     while(1)

        {

           if(ADFlag)

             {

              ADFlag=0;

  lcd1602_Display();

       EA=0;

 

                AD_temp=Read_PCF8591_ADC();

      EA=1;

kk=AD_temp*5*100/256;

bai=kk/100;

shi=kk%100/10;

ge=kk%10;

               // shi=AD_temp*5*100/256;

               // ge=(AD_temp%50)/10;  

 

                  lcd1602_write_com(0x80+0x40+7);

                  lcd1602_write_date(0x30+bai);

 

                  lcd1602_write_com(0x80+0x40+8);

                  lcd1602_write_date(0x2e); //小数点

 

                  lcd1602_write_com(0x80+0x40+9);

                  lcd1602_write_date(0x30+shi);

 

                  lcd1602_write_com(0x80+0x40+10);

                  lcd1602_write_date(0x30+ge);                                 

              

               Delay(2000);

                }

 

        }

}

 

void timer0() interrupt 1

{

  TH0=(65536-50000)/256;

  TL0=(65535-50000)%256;  //50000*(11.0592/12)ms定时,若晶振为12MHz,则为50ms

  count++;

    if(count=18)

    {

        count=0;

        ADFlag=1;

     }

}

 

 


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

上一篇:ESP8266 WIFI模块学习之路(1)——模块的USB串口连接
下一篇:ADC采样芯片ADS7822使用方法

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

推荐阅读

单片机小白学习之路(四十一)---LCD1602液晶理解
目标:理解LCD1602液晶工作原理1.LCD1602简介1602液晶也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符,所以简称1602。它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。1602引脚作用VL是液晶显示偏压信号,当感觉屏幕过暗或过亮是可以调节此电压来调整亮度RS是高电平是是数据选项,是低电平是命令选项R/W 是高电平是读操作,是低电平是写操作E是使能信号D0 ~ D7是数据I/O口,单片机
发表于 2020-03-30
单片机小白学习之路(四十一)---LCD1602液晶理解
PIC16F1933点亮LCD1602(汇编)
;;       TEST-GPIO;;  FileName:        main.S;  Dependencies:    p16f1933.h;;  Processor:       PIC16F1933;;  Complier:        GPASM;;  Company:         xx;;  Author:  &n
发表于 2020-03-10
实现单片机计算器与LCD1602字幕滚动
;=9999// 乘最大9999*9999=99980001// 除 1/9=0.1111 保留小数点后4位#include<reg51.h>#define uint unsigned int#define uchar unsigned char//--------LCD1602-------------------//P00-07==== D0-7sbit rs=P2^6;        //指令or数据sbit wela=P2^5;      //读or写sbit lcden=P2^7;         
发表于 2020-03-03
实现单片机计算器与LCD1602字幕滚动
MSP430G2553 1602显示字符
;msp430G2553.h"# define uchar unsigned char # define uint unsigned int # define LCD1602_RS_H  P2OUT|=BIT0# define LCD1602_RS_L  P2OUT&=~BIT0# define LCD1602_RW_H  P2OUT|=BIT1# define LCD1602_RW_L  P2OUT&=~BIT1# define LCD1602_EN_H  P2OUT|=BIT2# define LCD1602_EN_L  P2OUT&
发表于 2020-02-26
LCD1602动态显示--基于MSP430F149单片机
main.c/***************************************************程序功能:动态显示文字“welcome!”----------------------------------------------------测试说明:观察液晶显示****************************************************/#include  <msp430.h>#include  "Cry1602.h"#define uchar unsigned charuchar *s1 = "welcome
发表于 2020-02-24
MSP430F5529与LCD1602显示模块(上)
LCD1602介绍外观主要技术参数显示容量: 16X2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V字符尺寸: 2.95X4.35(WXH)mm接口说明并口传输模式VSS 电源地VDD 电源正极(5V)V0 液晶显示偏压信号RS 数据/命令选择端(H/L)RW 读/写选择端(H/L)E 使能信号D0 Data I/OD1 Data I/OD2 Data I/OD3 Data I/OD4 Data I/OD5 Data I/OD6 Data I/OD7 Data I/OA 背光源正极K 背光源负极IIC/I2C模式GND 电源地VCC 电源正极(5V)SDA 数据I/O口SCL
发表于 2020-02-24
MSP430F5529与LCD1602显示模块(上)
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved