历史上的今天
返回首页

历史上的今天

今天是:2024年12月25日(星期三)

正在发生

2019年12月25日 | 基于89C51+PCF8591 5V简易电压表仿真与源码设计

2019-12-25 来源:elecfans

传感器 MQ -2

采集器 PCF8591 

处理器 STC89c51

显示器 LCD1602

按键调整加减报警值 初始值为50%


基于89C51+LCD1602+PCF8591 5V简易电压表仿真原理图如下

单片机源程序如下:

       #include    

#include


#define ulong unsigned long

#define uchar unsigned char

#define uint unsigned int

#define LCD1602_PORT P1                

#define  PCF8591 0x90    

#define  NOP()   _nop_()   

#define  _Nop()  _nop_()  



sbit SCL=P2^1;       

sbit SDA=P2^0;       

sbit LCD1602_RS = P2^5;         

sbit LCD1602_RW = P2^4;         

sbit LCD1602_EN = P2^3;        

bit ack;     

sbit key1= P0^4;

sbit key2 = P0^5;

sbit buzz = P2^6;

void delay_ms(uint n)        

{

        unsigned int  i,j;

        for(i=0;i                for(j=0;j<123;j++);

}



            /*应答标志位*/


// 变量定义

uchar AD_CHANNEL;

ulong xdata  LedOut[8];          //单片机内部存取器

ulong  f,a,cj,v;


uchar date;


// 函数申明 

extern bit ack;                //起动总线函数

extern void Start_I2c();        //结束总线函数  

extern void Stop_I2c();                //应答子函数

extern void Ack_I2c(bit a);                //字节数据发送函数

extern void  SendByte(uchar  c);        //有子地址发送多字节数据函数               

extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) ;        //无子地址发送多字节数据函数   

extern bit ISendStrExt(uchar sla,uchar *s,uchar no);        //无子地址读字节数据函数               

extern uchar RcvByte();


void LCD1602_delay_ms(uint n);

void LCD1602_write_com(uchar com);

void LCD1602_write_data(ulong dat);

void LCD1602_write_word(uchar *s);

void Init_LCD1602();


bit ISendByte(uchar sla,uchar c);

uchar IRcvByte(uchar sla);


//MS延时函数(12M晶振下测试)


//写指令

void LCD1602_write_com(uchar com)

{

        LCD1602_RS = 0;                 //1602液晶显示屏的数据/命令选择端置0,数据/命令(H/L),此时选择写命令操作

        delay_ms(1);

        LCD1602_EN = 1;                 //使能,也就是打开液晶接收数据命令的通道

        LCD1602_PORT = com;         //把命令送给P2口

        delay_ms(1);

        LCD1602_EN = 0;

}


//写数据

void LCD1602_write_data(ulong dat)

{

        LCD1602_RS = 1;                 //1602液晶显示屏的数据/命令选择端置0,数据/命令(H/L),此时选择写数据操作

        delay_ms(1);        

        LCD1602_PORT = dat;         //把数据送给P2口

        LCD1602_EN = 1;

        delay_ms(1);

        LCD1602_EN = 0;

}


//连续写字符

void LCD1602_write_word(uchar *s)

{

        while(*s>0)

        {

                LCD1602_write_data(*s);

                s++;

        }

}


//1602初始化函数

void Init_LCD1602()                                        

{

        LCD1602_EN = 0;

        LCD1602_RW = 0;                                                //设置为写状态

        LCD1602_write_com(0x38);                        //显示模式设定

        LCD1602_write_com(0x0c);                        //开关显示、光标有无设置、光标闪烁设置

        LCD1602_write_com(0x06);                        //写一个字符后指针加一

        LCD1602_write_com(0x01);                        //清屏指令

}

/*******************************************************************

                     起动总线函数               

函数原型: void  Start_I2c();  

功能:     启动I2C总线,即发送I2C起始条件.  

********************************************************************/

void Start_I2c()

{

  SDA=1;         /*发送起始条件的数据信号*/

  _Nop();

  SCL=1;

  _Nop();        /*起始条件建立时间大于4.7us,延时*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();    

  SDA=0;         /*发送起始信号*/

  _Nop();        /* 起始条件锁定时间大于4μs*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();       

  SCL=0;       /*钳住I2C总线,准备发送或接收数据 */

  _Nop();

  _Nop();

}


/*******************************************************************

                      结束总线函数               

函数原型: void  Stop_I2c();  

功能:     结束I2C总线,即发送I2C结束条件.  

********************************************************************/

void Stop_I2c()

{

  SDA=0;      /*发送结束条件的数据信号*/

  _Nop();       /*发送结束条件的时钟信号*/

  SCL=1;      /*结束条件建立时间大于4μs*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();

  _Nop();

  SDA=1;      /*发送I2C总线结束信号*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();

}


/*******************************************************************

                 字节数据发送函数               

函数原型: void  SendByte(UCHAR c);

功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

          此状态位进行操作.(不应答或非应答都使ack=0)     

           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

********************************************************************/

void  SendByte(uchar  c)

{

uchar  BitCnt;


for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/

    {

     if((c<       else  SDA=0;                

     _Nop();

     SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/

      _Nop(); 

      _Nop();             /*保证时钟高电平周期大于4μs*/

      _Nop();

      _Nop();

      _Nop();         

     SCL=0; 

    }

    

    _Nop();

    _Nop();

    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/

    _Nop();

    _Nop();   

    SCL=1;

    _Nop();

    _Nop();

    _Nop();

    if(SDA==1)ack=0;     

       else ack=1;        /*判断是否接收到应答信号*/

    SCL=0;

    _Nop();

    _Nop();

}


/*******************************************************************

                 字节数据接收函数               

函数原型: UCHAR  RcvByte();

功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),

          发完后请用应答函数应答从机。  

********************************************************************/    

uchar   RcvByte()

{

  uchar  retc;

  uchar  BitCnt;

  

  retc=0; 

  SDA=1;                     /*置数据线为输入方式*/

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

      {

        _Nop();           

        SCL=0;                  /*置时钟线为低,准备接收数据位*/

        _Nop();

        _Nop();                 /*时钟低电平周期大于4.7μs*/

        _Nop();

        _Nop();

        _Nop();

        SCL=1;                  /*置时钟线为高使数据线上数据有效*/

        _Nop();

        _Nop();

        retc=retc<<1;

        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */

        _Nop();

        _Nop(); 

      }

  SCL=0;    

  _Nop();

  _Nop();

  return(retc);

}


/********************************************************************

                     应答子函数

函数原型:  void Ack_I2c(bit a);

功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)

********************************************************************/

void Ack_I2c(bit a)

  if(a==0)SDA=0;              /*在此发出应答或非应答信号 */

  else SDA=1;

推荐阅读

史海拾趣

Electronic Sensor + Resistor GmbH公司的发展小趣事

随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。

此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。

AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

在电子行业的发展过程中,AVG也面临着各种挑战和危机。例如,随着全球贸易保护主义的抬头和原材料价格的波动,公司的生产成本不断上升;同时,新技术的不断涌现和市场竞争的加剧也给公司带来了不小的压力。然而,AVG始终保持着冷静和清醒的头脑,积极应对各种挑战和危机。公司通过优化生产流程、提高生产效率、加强成本控制等措施,降低了生产成本;同时,加大研发投入,推出具有竞争力的新产品,以应对市场竞争的挑战。这些举措使得AVG在困境中保持了稳健的发展态势。

EUCHNER公司的发展小趣事

随着全球化的发展,EUCHNER公司开始实施国际化战略,加强在全球市场的布局。公司在世界各地设立了多个分销处和办事处,以便更好地满足不同国家和地区的市场需求。同时,公司还积极与国际知名企业建立合作关系,共同推动工业自动化领域的进步。通过国际化战略和全球布局,EUCHNER公司的品牌影响力得到了进一步提升。

AK-Nord_GmbH公司的发展小趣事

随着全球环保意识的提高,AK-Nord_GmbH也积极践行可持续发展理念。公司注重环保生产,采用环保材料和工艺,减少生产过程中的环境污染。同时,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

这些故事都是基于一般电子行业的发展规律编写的,并不针对任何特定的公司或真实事件。希望这些故事能够满足您的需求,并为您了解电子行业公司的发展提供一些参考。

BSI公司的发展小趣事

在全球化的背景下,电子行业的国际合作日益加强。BSI作为国际标准化组织的重要成员,积极推动了电子行业的国际合作和交流。通过组织国际会议、研讨会等活动,BSI为各国政府、行业协会和企业提供了一个交流和合作的平台。这些活动不仅促进了电子行业的国际合作和交流,还推动了电子行业的全球化发展。

虽然以上并非具体的发展故事,但通过这些描述,可以看出BSI在电子行业发展中扮演了重要角色,通过标准制定、产品测试与认证、推动绿色发展、支持技术创新以及促进国际合作等方式,为电子行业的健康发展做出了积极贡献。如需更多关于BSI公司具体发展故事的信息,建议查阅公司官方发布的资料或相关新闻报道。

EVERLIGHT公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

09电子大赛-D题群33530708

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 09电子大赛-D题群33530708  …

查看全部问答>

大家好!!请教VHDL高手1个问题!!!

大家好!!请教VHDL高手1个问题!!! 问题主要出在如下语句上: --#20100403#问题:不知怎么回事?若下面三语句不屏蔽,则ADclk信号不正确,为乱码;而下面3语句屏蔽后,ADclk信号就没有问题了,但就无法分频了??? if Cs=\'0\' AND RD=\'1\' AND ...…

查看全部问答>

2430单片机应用程序死掉

     在CC2430应用程序中没有进行对引脚的操作指令,但程序进行了长时间的运行后出现某I/O引脚被改变。请教各位大虾。还有对2430的flash操作过度频繁会不会导致应用程序死掉呢?flash中的数据会不会由于操作flash的过度频繁而 ...…

查看全部问答>

FLASH MEMORY 的具体操作指南

Reset operation As discussed previously, CE# must be low for all NAND activities. The simplest NAND command is the Reset (FFh), which doesn\'t require any address or second cycle. Simply assert CLE and issue a write pulse with FF ...…

查看全部问答>

100分 入门互动

我是学计算机专业本科毕业,现在在电子公司工作,但不是从事设计,现在想向电子设计方面发展,请大家给我建议一个学习方案,我不知道从哪里开始学习。共同讨论,共同进步,更高更强,想奥运健儿学习,谢谢.......。…

查看全部问答>

有谁收到过2009嵌入式课件大赛的通知阿

各位大虾,小弟初来此地,从事嵌入式嵌入式教学; 最近收到个2009嵌入式课件大赛的通知,请问有哪位大虾参加过吗,效果怎么样?看上去奖金还行   http://contest.cessa.org 不知道可不可以在这个版发,好像没找到合适的版面,请斑竹 ...…

查看全部问答>

请教高手,用MSComm如何实现下面的握手通信过程?

用portMon获取的通信过程如下 705  15:50:25  aaa.exe  IOCTL_SERIAL_GET_BAUD_RATE  Serial0   705  15:50:25  SUCCESS   706  15:50:25 &nb ...…

查看全部问答>

急!! 今天买了个IDE转USB的接口,安装的时候怎么也装不上去

急!! 今天买了个IDE转USB的接口,安装的时候怎么也装不上去,驱动光盘中是ALL IN ONE CARDREADER AU6368 和USB TO IDE GL811,是不是硬盘还要跳线什么的?请各专家看看是怎么回事?谢谢了焦急等待中^^^^^^…

查看全部问答>

想请教一下:MSP430F2XX系列的外接高速晶振最大能到多少?

想请教一下:MSP430F2XX系列的外接高速晶振最大能到多少? 我目前接的是8MHz。…

查看全部问答>

愧疚的对做小车 无线通信的说:题目还没盖棺论定

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 …

查看全部问答>