PCF8591 +MQ3 +LCD1602+89C51RC(酒精传感器)
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(酒精传感器)相关推荐
- 基于ATMEGA16单片机,MQ-3酒精传感器,LCD1602液晶显示的酒精浓度检测阈值报警仪
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文章为个人单片机课程大作业,代码都是自己写的,只是记录自己的学习过程,不做任何商用. 目录 单片机大作业: 一.使用仪器.材料 二. ...
- 基于51单片机 + MQ-3酒精传感器 + ADC0832模数转换器 + LCD1602液晶显示器的酒精检测系统
一.简介 废话不多说,直接上东西.本文是基于51单片机的酒精检测系统设计,用的元器件有:51单片机.MQ-3酒精传感器.ADC0832模数转换器. LCD1602液晶显示器.喇叭等元器件. 二.仿真题 ...
- 智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)
智能安全辅助驾驶系统 STM32--MQ3酒精传感器的应用(HAL库) 准备: MQ3酒精传感器一个.STM32开发板(本实验采用F103RCT6,其他型号可参考本文同理设置) 一.MQ3酒精传感器的 ...
- 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 ...
- 「雕爷学编程」Arduino动手做(37)——MQ-3酒精传感器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- Arduino MQ-3酒精传感器实验
相关资料链接 链接:https://pan.baidu.com/s/1eE0rkaSJsKJMU_RUorS5OA 提取码:3ujh 1.1 项目介绍: 传感器所使用的气敏材料是在清洁空气中电导率较低 ...
- 传感器系列之4.10 酒精传感器
4.10 酒精传感器检测实验 一.实验目的 掌握LPC2378芯片的编程方法 掌握酒精传感器的工作原理 了解酒精电阻的用途 二.实验材料 具有USB 串口通讯的PC 机1 台 ADS1.2 集成开发软 ...
- stm32—酒精传感器的初步使用
目录 一.简介 二.连线 三.代码 一.简介 型号:MQ-3 与毒气传感器相似 功能:检测酒精,用在酒精检测,是否酒驾 二.连线 引脚D0是开关信号输出,检测有没有雨滴(0和1),本处接到PD5引脚 ...
- 【Arduino 物联网云平台酒精传感器】
在这里,我们将说明如何使用 Arduino 物联网云平台来监控酒精使用情况.这有助于检测工作场所是否有人或检查员工是否在办公室饮酒.它对于使用酒精的工业物联网也很有用,例如,在必须监测和控制酒精水平的 ...
最新文章
- 【数据结构】链式队列的实现(C语言)
- java练气期(3)----java高级(网络编程)
- 撩妹学会这一招,就没有人能拒绝你!
- 数列分段(洛谷P1181题题解,Java语言描述)
- php调用外站数据,dedecms数据库外部调用,两dedecms站点数据远程调用
- 计算机三级之嵌入式系统学习笔记5
- C++ 的门门道道 | 技术头条
- gcIntermediate_航线图_必知必会
- EOS技术研究:合约与数据库交互
- 取色工具和RGB网页颜色在线取色器
- 【原创】flv文件的三种下载方法
- 安卓推送、android文本推送、安卓富媒体推送解决方案
- 当谈判处于下风怎么办?五大策略助你逆势翻盘
- (转)逃脱者可获生机(上)
- 运用fiddler工具深度配置证书抓苹果IOS微信小程序或app数据请求
- Typora编辑的.md文档突然消失或未保存,恢复方式
- Linux下输出大字、艺术字--figlet
- HotSpot GC及参数设置
- 关于向上转型和向下转型
- python123测验答案数值运算程序_Python程序基础-中国大学mooc-题库零氪