PCF8591

环境:

软件:

  • uVision
  • proteus

芯片

  • 80c51
  • PCF8591、LCD1602

仿真图

相关函数编写电平时

代码

1602

头文件

#include<reg51.h>
#include<intrins.h> //使用_nop_();
#include<string.h>

宏定义

// RS为寄存器选择,高电平时选择寄存器,低电平时选择指令寄存器
sbit RS = P2^0;
// RW为读写信号线,高电平时进行读操作,低电平时进行写操作
sbit RW = P2^1;
// EN为使能端,当EN端由高电平跳变成低电平时,液晶模块执行命令
sbit EN = P2^2;

初始化

/**
* LCD初始化
*
* @return
*/
void init()
{/*0011_1000 置功能DL=1 --> 8位总线N=0  --> 单行显示F=0  -->  显示5x7的点阵字符*/    write_cmd(0x38);/*0000_0001 清显示指令码01H,光标复位到地址00H位置*/ write_cmd(0x01);/*0000_0110 置输入模式I/D=1 --> 光标右移S=0   --> 屏幕上所有文字左移或右移*/write_cmd(0x06);/*0000_1100 显示开/关控制D=1 --> 开显示C=0 --> 无光标B=0 --> 光标不闪烁*/write_cmd(0x0C);
}

检测BF(busy flag)位状态

/*
* 检测BF(busy flag)位状态
*  防止不能识别,需用延时函数代替
* @return
*/
void test_BF()
{unsigned char LCD_status;do{P0 = 0xFF; // LCD1602读取状态数据,必须有一个上拉电平EN = 0; RS = 0; RW = 1; // RS为0时,P0的数据为命令EN=1;// 让RS和RW设置有效LCD_status = P0;_nop_(); _nop_();EN = 0;}while(LCD_status&0x80); // 1000_0000 忙碌状态
}

写数据

/*
* 写数据(一位一位的写)
*
* @param data8 八位数据
* @return
*/
void write_data(unsigned char data8)
{test_BF();EN = 0; RS = 1; RW = 0;P0 = data8;EN = 1; _nop_(); EN = 0;
}

写命令

/*
* 写命令
*
* @param cmd8 八位命令
* @return
*/
void write_cmd(unsigned char cmd8)
{test_BF();EN = 0; RS = 0; RW = 0;P0 = cmd8;EN = 1; _nop_(); EN = 0;
}

写字符串

/**
* 写字符串
*
* @param r row 0---第一行  1---第二行
* @param c column
* @param str 字符串
* @return
*/
void write_str(int r, int c, char *str)
{int i=0;  unsigned char Addressx[] = {0x80, 0xC0};unsigned char StartAdd = (Addressx[r] | c);//按位或write_cmd(StartAdd);for(i = 0; i < 16; i++){if(str[i]==0) break;write_data(str[i]);}// 如果不够16位,用空格填充for(;i < 16; i++){write_data(' ');  }
}

LCD1602.c

#include<reg51.h>
#include<intrins.h> //使用_nop_();
#include<string.h>/*
* 宏定义
*/
// RS为寄存器选择,高电平时选择寄存器,低电平时选择指令寄存器
sbit RS = P1^0;
// RW为读写信号线,高电平时进行读操作,低电平时进行写操作
sbit RW = P1^1;
// EN为使能端,当EN端由高电平跳变成低电平时,液晶模块执行命令
sbit EN = P1^2;/*
* 延时(不准确延时)
*
* @param ms
* @return
*/
void delay_ms(int ms)
{while(ms--){int i = 100;while(i--){}}
}/*
* 检测BF(busy flag)位状态
*
* @return
*/
void test_BF()
{//unsigned char sta;// P2  = 0xFF;// RS = 0;// RW = 1;// do {//     EN = 1;//     sta = P2; //读取状态字//     EN = 0;// }while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止delay_ms(20);
}/*
* 写数据(一位一位的写)
*
* @param data8 八位数据
* @return
*/
void write_data(unsigned char data8)
{test_BF();EN = 0; RS = 1; RW = 0;P2 = data8;EN = 1; _nop_(); EN = 0;
}/*
* 写命令
*
* @param cmd8 八位命令
* @return
*/
void write_cmd(unsigned char cmd8)
{test_BF();EN = 0; RS = 0; RW = 0;P2 = cmd8;EN = 1; _nop_(); EN = 0;
}/**
* 写字符串
*
* @param r row
* @param c column
* @param str 字符串
* @return
*/
void LcdShowStr(int r, int c, char *str)
{int i=0;  unsigned char Addressx[] = {0x80, 0xC0};unsigned char StartAdd = (Addressx[r] | c);//按位或write_cmd(StartAdd);while (*str != '\0') //连续写入字符串数据,直到检测到结束符{write_data(*str++); //先取 str 指向的数据,然后 str 自加 1}
}/**
* LCD初始化
*
* @return
*/
void InitLcd1602()
{/*0011_1000 置功能DL=1 --> 8位总线N=0  --> 单行显示F=0  -->  显示5x7的点阵字符*/    write_cmd(0x38);/*0000_0001 清显示指令码01H,光标复位到地址00H位置*/ write_cmd(0x01);/*0000_0110 置输入模式I/D=1 --> 光标右移S=0   --> 屏幕上所有文字左移或右移*/write_cmd(0x06);/*0000_1100 显示开/关控制D=1 --> 开显示C=0 --> 无光标B=0 --> 光标不闪烁*/write_cmd(0x0C);
}

IIC.h

#include<intrins.h>
//总线引脚定义
sbit SCL = P3^6;  /* 数据线 */
sbit SDA = P3^7;  /* 时钟线 */void iic_Delay()  {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}//开始
void iic_Start()
{SCL = 1;SDA = 1;iic_Delay();SDA = 0;iic_Delay();SCL = 0;
}//停止
void iic_Stop()
{SCL = 0;SDA = 0;iic_Delay();SCL = 1;iic_Delay();SDA = 1;iic_Delay();
}/*读、写操作*/
bit iic_SendByte(unsigned char byt)
{   bit ack = 0;   unsigned char mask;for(mask=0x80;mask!=0;mask>>=1){if((byt&mask) == 0) SDA = 0;elseSDA = 1;iic_Delay();SCL = 1;iic_Delay();SCL = 0;}SDA = 1;iic_Delay();SCL = 1;ack = SDA;iic_Delay();SCL = 0;return ack;
}/*读数据并且继续下去*/
unsigned char iic_readNAK()
{unsigned char mask;unsigned char dat;SDA = 1;SCL = 0;for(mask=0x80;mask!=0;mask>>=1){iic_Delay();SCL = 1;if(SDA == 1) dat |= mask;else  dat &= (~mask);iic_Delay();SCL = 0;}SDA = 1;iic_Delay();SCL = 1;iic_Delay();SCL = 0;return dat;
}/*读数据但不再下去*/
unsigned char iic_readACK()
{unsigned char mask;unsigned char dat;SDA = 1;SCL = 0;for(mask=0x80;mask!=0;mask>>=1){iic_Delay();SCL = 1;if(SDA == 1) dat |= mask;else  dat &= (~mask);iic_Delay();SCL = 0;}SDA = 0;iic_Delay();SCL = 1;iic_Delay();SCL = 0;return dat;
}

详情代码 点击下载

PCF8591 +MQ3 +LCD1602+89C51RC(酒精传感器)相关推荐

  1. 基于ATMEGA16单片机,MQ-3酒精传感器,LCD1602液晶显示的酒精浓度检测阈值报警仪

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文章为个人单片机课程大作业,代码都是自己写的,只是记录自己的学习过程,不做任何商用. 目录 单片机大作业: 一.使用仪器.材料 二. ...

  2. 基于51单片机 + MQ-3酒精传感器 + ADC0832模数转换器 + LCD1602液晶显示器的酒精检测系统

    一.简介 废话不多说,直接上东西.本文是基于51单片机的酒精检测系统设计,用的元器件有:51单片机.MQ-3酒精传感器.ADC0832模数转换器. LCD1602液晶显示器.喇叭等元器件. 二.仿真题 ...

  3. 智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)

    智能安全辅助驾驶系统 STM32--MQ3酒精传感器的应用(HAL库) 准备: MQ3酒精传感器一个.STM32开发板(本实验采用F103RCT6,其他型号可参考本文同理设置) 一.MQ3酒精传感器的 ...

  4. 10.[STM32]ADC中断方式-采集MQ-3酒精传感器检测的酒精浓度

    文章目录 1. ADC介绍 1.1 时钟配置及设置模拟输入 1.2 ADC初始化 1.3 ADC状态寄存器 1.4 ADC控制寄存器 1.4.1 ADC控制寄存器 1(ADC_CR1) 1.4.2 A ...

  5. 「雕爷学编程」Arduino动手做(37)——MQ-3酒精传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  6. Arduino MQ-3酒精传感器实验

    相关资料链接 链接:https://pan.baidu.com/s/1eE0rkaSJsKJMU_RUorS5OA 提取码:3ujh 1.1 项目介绍: 传感器所使用的气敏材料是在清洁空气中电导率较低 ...

  7. 传感器系列之4.10 酒精传感器

    4.10 酒精传感器检测实验 一.实验目的 掌握LPC2378芯片的编程方法 掌握酒精传感器的工作原理 了解酒精电阻的用途 二.实验材料 具有USB 串口通讯的PC 机1 台 ADS1.2 集成开发软 ...

  8. stm32—酒精传感器的初步使用

    目录 一.简介 二.连线 三.代码 一.简介 型号:MQ-3 与毒气传感器相似 功能:检测酒精,用在酒精检测,是否酒驾 二.连线 引脚D0是开关信号输出,检测有没有雨滴(0和1),本处接到PD5引脚 ...

  9. 【Arduino 物联网云平台酒精传感器】

    在这里,我们将说明如何使用 Arduino 物联网云平台来监控酒精使用情况.这有助于检测工作场所是否有人或检查员工是否在办公室饮酒.它对于使用酒精的工业物联网也很有用,例如,在必须监测和控制酒精水平的 ...

最新文章

  1. 【数据结构】链式队列的实现(C语言)
  2. java练气期(3)----java高级(网络编程)
  3. 撩妹学会这一招,就没有人能拒绝你!
  4. 数列分段(洛谷P1181题题解,Java语言描述)
  5. php调用外站数据,dedecms数据库外部调用,两dedecms站点数据远程调用
  6. 计算机三级之嵌入式系统学习笔记5
  7. C++ 的门门道道 | 技术头条
  8. gcIntermediate_航线图_必知必会
  9. EOS技术研究:合约与数据库交互
  10. 取色工具和RGB网页颜色在线取色器
  11. 【原创】flv文件的三种下载方法
  12. 安卓推送、android文本推送、安卓富媒体推送解决方案
  13. 当谈判处于下风怎么办?五大策略助你逆势翻盘
  14. (转)逃脱者可获生机(上)
  15. 运用fiddler工具深度配置证书抓苹果IOS微信小程序或app数据请求
  16. Typora编辑的.md文档突然消失或未保存,恢复方式
  17. Linux下输出大字、艺术字--figlet
  18. HotSpot GC及参数设置
  19. 关于向上转型和向下转型
  20. python123测验答案数值运算程序_Python程序基础-中国大学mooc-题库零氪

热门文章

  1. Type mismatch: inferred type is MainActivity but FlutterEngine was expected
  2. pathon包傻瓜升级
  3. Wishbone总线快速了解
  4. OpenRisc-6-wishbone实验
  5. 用HTML/CSS制作一个美观的个人简介网页——学习周记1
  6. 利用frps进行内网穿透
  7. bryntum gantt 5.0.6
  8. git查看stash里面的具体内容
  9. 通过仿淘宝静态网页我的总结
  10. JuliaFEM中的数据格式——fields.jl