ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STC实时用PCF8591采集温度LCD显示

2020-06-01 11:04:13  阅读:429  来源: 互联网

标签:dat STC Delay10us unsigned char LCD PCF8591 SDA SCL


一、主函数如下:

#include <reg52.h>    //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd1602.h"
#include"fpc8591.h"
#include"i2c.h"


/*******************************************************************************
* 函 数 名       : main
* 函数功能         : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
    unsigned int temp; 
    int_1602();//lcd1602初始化
    while(1)
    {
        temp=Read_D(0);//pcf8591通道0采集温度
        display(temp);//lcd1602显示
    }        
}

二、现象如下:

三、LCD1602显示部分程序

void display(unsigned int temp)            //显示温度
{
    uchar rev_data[16]={" -temperature!- "};
    com_1602(0x80);
    for(i=0;i<16;i++)                //发送数据第一行
    {
        dat_1602(rev_data[i]);
    }
    temp*=10;
    com_1602(0xc0);//第二行
    dat_1602('T');
    dat_1602('H');
    dat_1602('=');
    dat_1602(temp/100%10+0x30);
    dat_1602(temp/10%10+0x30);
    dat_1602('.');
    dat_1602(temp%10+0x30);
    dat_1602(0xdf);
    dat_1602('C');
}

LCD1602显示完整程序见:

 

四、PCF8591模数部分程序

unsigned char Read_D(unsigned char Channel)
{
    unsigned char dat;
    I2cStart();
    I2cSendByte(0x90); //器件地址+0
    I2cAck(0);
    I2cSendByte(Channel); //控制字0x01表示通道1
    I2cAck(0);
    I2cStart();
    I2cSendByte(0x91); //器件地址+1,下一个字节要读取
    I2cAck(0);
    dat=I2cReadByte();
    I2cAck(0);
    I2cStop();
    // AD_led=0; //转换成功显示
    return dat;
}

PCF8591模数完整程序见:

 

五、IIC驱动部分程序

unsigned char I2cSendByte(unsigned char dat)
{
    unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。        
    for(a=0;a<8;a++)//要发送8位,从最高位开始
    {
        SDA=dat>>7;     //起始信号之后SCL=0,所以可以直接改变SDA信号
        dat=dat<<1;
        Delay10us();
        SCL=1;
        Delay10us();//建立时间>4.7us
        SCL=0;
        Delay10us();//时间大于4us        
    }
    SDA=1;
    Delay10us();
    SCL=1;
    while(SDA)//等待应答,也就是等待从设备把SDA拉低
    {
        b++;
        if(b>200)     //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
        {
            SCL=0;
            Delay10us();
            return 0;
        }
    }
    SCL=0;
    Delay10us();
     return 1;        
}

unsigned char I2cReadByte()
{
    unsigned char a=0,dat=0;
    SDA=1;            //起始和发送一个字节之后SCL都是0
    Delay10us();
    for(a=0;a<8;a++)//接收8个字节
    {
        SCL=1;
        Delay10us();
        dat<<=1;
        dat|=SDA;
        Delay10us();
        SCL=0;
        Delay10us();
    }
    return dat;        
}

IIC驱动完整程序见:

 

标签:dat,STC,Delay10us,unsigned,char,LCD,PCF8591,SDA,SCL
来源: https://www.cnblogs.com/wlei5206/p/13023977.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有