基于51单片机的废气检测I2Cproteus仿真
目录
文章目录
前言
二、设计步骤
1.proteus设计
2.keil5代码编程设计
总结
前言
前段时间高中同学让我帮忙给她做一个数电课设,反正也没事做就随便做了做,现在总结一下,话不多说直接上效果。
一、课设要求
二、设计步骤
1.proteus设计
最终效果如下:
2.keil5代码编程设计
代码如下:
main.c
//废气检测。
#include <reg52.h>
#include <intrins.h>
#include <I2C.h>
#define uchar unsigned char
#define uint unsigned int
#define _Nop( ) _nop_( ) //定义空操作,1μs
sbit oe=P1^3; //数码管段选、位选锁存器输出控制信号
sbit dula=P1^4; //数码管段选锁存器控制信号
sbit wela=P1^5; //数码管位选锁存器控制信号
sbit LED=P2^0;
sbit k3=P3^2; //定义按键K3
sbit k4=P3^3; //定义按键K4
uchar j=0;
int s,t,k,flag=1;
uchar code sled_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义点亮数码管位选码
data uchar disp[8]={1,6,16,16,16,16,16,16}; // 8位数码管都不亮
uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴极数码管显示段码(0-F)
sbit P3_5=P3^5;void delay(u16 i)
{while(i--);
}
void Int0Init()
{//设置INT0IT0=1;//跳变沿出发方式(下降沿)EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断
}
void Int1Init()
{//设置INT1IT1=1;//跳变沿出发方式(下降沿)EX1=1;//打开INT1的中断允许。 EA=1;//打开总中断
}
void main(void)
{ unsigned long d;P3_5=0; TMOD=0x01; // 设置定时器T0为方式1定时TH0=(65536-500)/256; // 给T0装入初值TL0=(65536-500)%256; // 给T0装入初值ET0=1; // 允许T0中断EA=1; // CPU开中断TR0=1; // 启动T0oe=0; Int0Init();Int1Init(); // 设置外部中断1LED=0;sen: erflags=0;Start( ); //发送起始信号SendByte(0x90); //发送写PCF8591的寻址字节(写)cAck( ); //检查应答if(erflags) goto sen; //无应答,重来SendByte(0x00); //发送写入PCF8591的控制字,选择0通道cAck( ); //检查应答if(erflags) goto sen; //无应答,重来sen1: Start( ); //发送起始信号SendByte(0x91); //发送写PCF8591的寻址字节(读)cAck( ); //检查应答if(erflags) goto sen1; //无应答,重来d=RcvByte( ); //第1次读的数据无效Ack( ); //应答位函数,while(1){ d=RcvByte( );Ack( ); //应答位函数,d=(d*5*1000)/256; //电压值disp[0]=(int)d/1000;disp[1]=(int)d%1000/100;s = (disp[0]*10+disp[1])*2+2; if(s>=100)s=99;if(s<=50&&flag)LED=1;else if(s>50&&flag)LED=0;t = s/10;k = s%10;}}void T0_int(void) interrupt 1
{ TH0=(65536-1000)/256;TL0=(65536-1000)%256;oe=1; // 关闭2个573输出,防止在送数据时相互影响 switch(j){case 0:P0 = table[0];break;case 1:P0 = 0xe6;break;case 2:P0 = table[5];break;case 3:P0 = table[0];break;case 4:P0 = table[2];break;case 5:P0 = 0x40;break;case 6:P0 = table[t];break;case 7:P0 = table[k];break;}dula=1;dula=0; // 锁存段码P0=sled_bit[j]; // 选择相应数码管位选 wela=1;wela=0; // 锁存位码oe=0; // 打开2个573三态门,输出段码和位码 j++; // 为下一个显示做准备if(j>=8)j=0;
}
void Int0() interrupt 0 //外部中断0的中断函数
{delay(1000); //延时消抖if(k3==0){if(flag==1){flag=0;LED=0;} else if(flag==0)flag=1;}
}
void Int1() interrupt 2 //外部中断1的中断函数
{int i;delay(1000); //延时消抖if(k4==0){while(1){for(i=0;i<8;i++){oe=1; // 关闭2个573输出,防止在送数据时相互影响 P0 = 0x40;dula=1;dula=0; // 锁存段码P0=sled_bit[i]; // 选择相应数码管位选 wela=1;wela=0; // 锁存位码oe=0; // 打开2个573三态门,输出段码和位码delay(500);}}}
}
I2C.c
#include <reg52.h>
#include <intrins.h>
#include "I2C.h"
#define uchar unsigned char
#define uint unsigned int
#define _Nop( ) _nop_( ) //定义空操作,1μs
bdata uchar b;
sbit b_7=b^7;
sbit SDA=P3^4; //模拟I2C数据传送位
sbit SCL=P3^6; //模拟I2C时钟控制位void Start(void) //起始位函数
{ SDA=1;SCL=1;_Nop( ); _Nop( ); _Nop( ); _Nop( ); SDA=0; _Nop( ); _Nop( ); _Nop( ); _Nop( ); SCL=0;
}void Stop(void) //终止位函数,
{ SDA=0;SCL=1;_Nop( ); _Nop( ); _Nop( ); _Nop( ); SDA=1;_Nop( ); _Nop( ); _Nop( ); _Nop( );
}void Ack(void ) //应答位函数,
{ SDA=0;_Nop( ); _Nop( ); _Nop( ); _Nop( );SCL=1;_Nop( ); _Nop( ); _Nop( ); _Nop( ); SCL=0;SDA=1;}void NoAck(void ) //非应答位函数
{ SDA=1;_Nop( ); _Nop( ); _Nop( ); _Nop( ); SCL=1;_Nop( ); _Nop( ); _Nop( ); _Nop( ); SCL=0;}void cAck( void ) //检查应答函数
{ uchar i=0; SCL=1; while((SDA==1)&&(i<255)) i++; erflags=SDA; SCL=0; //函数结束,使SCL=0
} void SendByte(uchar temp) //写入1字节数据函数
{ uchar i;b=temp;for(i=0; i <8; i++) // 8位数据长度{ SCL=0;SDA=b_7; //发送数据最高位送到SDAb= b<<1; //左移一位,准备下一发送位SCL=1; //SCL↑送入_Nop( ); _Nop( ); _Nop( ); _Nop( ); }SCL=0;SDA=1; //发送完后使SDA=1,等待应答
}uchar RcvByte(void) //读出1字节数据函数{ uchar i,temp;SCL=0;SDA=1; //作输入先输出1 for(i=0; i <8; i++) // 8位数据长度{ SCL=1; //SCL↑数据输入到SDA_Nop( ); _Nop( ); _Nop( ); _Nop( ); temp<<=1; //接收数据变量左移一位,最低位腾空if(SDA) temp|=0x01; //读1位数据到最低位SCL=0; //SCL=0,为SCL↑作准备} return temp; //返回接收数据 }
I2C.h
#ifndef __I2C_H__
#define __I2C_H__sbit erflags=P3^7; //检查应答错误标志extern void Start(void); //起始位函数
extern void Stop(void); //终止位函数,
extern void Ack(void ); //应答位函数
extern void NoAck(void); //非应答位函数
extern void cAck( void ); //检查应答函数
extern void SendByte(unsigned char temp); //写入1字节数据函数
extern unsigned char RcvByte(void); //读出1字节数据函数#endif
总结
本课设是涉及到了51的AD转换,数码管显示,I2C,中断等的综合实验,需要学习的同学呢麻烦点赞关注,然后在评论区留下邮箱有空我就会私发,当然工程下载链接等审核通过后我也会附上。
工程链接:基于51单片机的废气检测proteus仿真
基于51单片机的废气检测I2Cproteus仿真相关推荐
- 基于51单片机多路温度检测proteus仿真 ds18b20
本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 ...
- 实物设计|基于51单片机的温湿度检测报警系统
目录 具体实现功能: 设计介绍 51单片机简介 设计方案 资料内容 原理图和PCB(AD19) 仿真实现(protues8.7) 程序(Keil5) 全部资料(压缩文件) 具体实现功能: 由STC89 ...
- 基于51单片机的火灾检测设计(仿真+程序+原理图+论文报告)
本设计: 基于51单片机的火灾检测设计(仿真+程序+原理图+论文报告) Proteus仿真版本:proteus7.8 原理图:Altium Designer 程序编译器:keil 4 编程语言:C语言 ...
- 基于51单片机甲醛浓度检测系统仿真设计(仿真+程序+原理图+报告+讲解)
文章目录 资料下载(可点击) 功能说明 仿真图 复位电路 晶振电路 程序 原理图: 设计报告: 器件清单: 基于51单片机甲醛浓度检测系统仿真设计(仿真+程序+原理图+报告+讲解) 原理图:Altiu ...
- matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc
基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...
- 基于单片机超声波视力保护系统设计-基于51单片机8音键电子琴仿真设计-基于8086八路模拟信号采集均值显示系统设计-基于8086八路数据电压温度采集系统-基于8086波形发生器仿真设计【毕设课设分享】
539基于单片机超声波视力保护系统设计-设计资料 硬件构成:单片机+最小系统+LCD1602液晶显示模块+超声波模块+DS18B20温度采集模块+光线检测模块+ADC0832模块+蜂鸣器模块+LED指 ...
- 基于51单片机的烟雾火灾报警器proteus仿真设计
基于51单片机的烟雾火灾报警器proteus仿真设计 1 开发环境 仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0004 代码讲解+仿真讲解+仿真演示 ...
- 基于51单片机的温度检测报警系统
目录 具体实现功能 设计背景 硬件设计 软件设计 原理图 程序 仿真实现 全部资料 具体实现功能 系统由STC89C51单片机+液晶1602显示+DS18B20温度传感器+按键模块+报警模块构成. 具 ...
- 【008】【毕业设计】基于51单片机的烟雾报警系统proteus仿真与实物设计
一.压缩包资料内容(私信获取) (1).基于51单片机的烟雾报警系统proteus仿真设计一份: (2).基于51单片机的烟雾报警系统proteus仿真设计keli源代码一份: (3).基于51单片 ...
最新文章
- Linux操作系统及平台虚拟化技术漫谈
- flume源码学习4-SourceRunner与ExecSource实现
- php ci框架中载入css和js文件失败的原因及解决方法
- 在Win2003中安装bind【部署智能DNS】
- 如何清除tomcat缓存
- .net core 5 IIS Api网站部署需要注意
- java ip调天气预报接口_JAVA + WeatherWebService 实现天气预报接口调取
- ROS的学习(十九)用rosserial创建一个subscriber
- lintcode-397-最长上升连续子序列
- Stroustrup 谈 C++ 11的新特性
- c语言成绩管理系统1.0,c语言成绩管理系统完整附源码v1.0 免费版
- Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)...
- 网络安全——终端安全
- 【推荐】技术面试结束后,如何向技术面试官提问?
- 泰裤辣!五一烧烤倒计时,还有人没做好攻略吗?
- PTA 1100 校庆(Python3)
- 【Go资料】go语言学习资料书籍
- A - Fibonacci
- kwgt 歌词_kwgt桌面插件美化下载-Eight for kwgt专业版主题包v3.9.136.1 最新版-腾飞网...
- android preference 启动activity,Android PreferenceActivity 学习笔记
热门文章
- 计算机职业资格证书的权威部门是哪个部门?
- 看携程如何借助“预测式外呼”提高呼叫效率
- js清除浏览器缓存的几种方法
- 小程序springboot食堂预约订餐系统毕业设计-附源码221554
- Excel怎么调出开发工具选项
- 天源财富:意法半导体推出下一代MEMS加速度计 可用于高性能汽车
- [Swift]LeetCode334. 递增的三元子序列 | Increasing Triplet Subsequence
- c语言中文定义什么类型,typedef在c语言中是什么意思?
- 一文读懂机器学习,大数据/自然语言处理/算法全有了
- 【RFID实训】公交收费系统详细过程