目录

文章目录

前言

二、设计步骤

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仿真相关推荐

  1. 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 ...

  2. 实物设计|基于51单片机的温湿度检测报警系统

    目录 具体实现功能: 设计介绍 51单片机简介 设计方案 资料内容 原理图和PCB(AD19) 仿真实现(protues8.7) 程序(Keil5) 全部资料(压缩文件) 具体实现功能: 由STC89 ...

  3. 基于51单片机的火灾检测设计(仿真+程序+原理图+论文报告)

    本设计: 基于51单片机的火灾检测设计(仿真+程序+原理图+论文报告) Proteus仿真版本:proteus7.8 原理图:Altium Designer 程序编译器:keil 4 编程语言:C语言 ...

  4. 基于51单片机甲醛浓度检测系统仿真设计(仿真+程序+原理图+报告+讲解)

    文章目录 资料下载(可点击) 功能说明 仿真图 复位电路 晶振电路 程序 原理图: 设计报告: 器件清单: 基于51单片机甲醛浓度检测系统仿真设计(仿真+程序+原理图+报告+讲解) 原理图:Altiu ...

  5. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  6. 基于单片机超声波视力保护系统设计-基于51单片机8音键电子琴仿真设计-基于8086八路模拟信号采集均值显示系统设计-基于8086八路数据电压温度采集系统-基于8086波形发生器仿真设计【毕设课设分享】

    539基于单片机超声波视力保护系统设计-设计资料 硬件构成:单片机+最小系统+LCD1602液晶显示模块+超声波模块+DS18B20温度采集模块+光线检测模块+ADC0832模块+蜂鸣器模块+LED指 ...

  7. 基于51单片机的烟雾火灾报警器proteus仿真设计

    基于51单片机的烟雾火灾报警器proteus仿真设计 1 开发环境 仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0004 代码讲解+仿真讲解+仿真演示 ...

  8. 基于51单片机的温度检测报警系统

    目录 具体实现功能 设计背景 硬件设计 软件设计 原理图 程序 仿真实现 全部资料 具体实现功能 系统由STC89C51单片机+液晶1602显示+DS18B20温度传感器+按键模块+报警模块构成. 具 ...

  9. 【008】【毕业设计】基于51单片机的烟雾报警系统proteus仿真与实物设计

    ​一.压缩包资料内容(私信获取) (1).基于51单片机的烟雾报警系统proteus仿真设计一份: (2).基于51单片机的烟雾报警系统proteus仿真设计keli源代码一份: (3).基于51单片 ...

最新文章

  1. Linux操作系统及平台虚拟化技术漫谈
  2. flume源码学习4-SourceRunner与ExecSource实现
  3. php ci框架中载入css和js文件失败的原因及解决方法
  4. 在Win2003中安装bind【部署智能DNS】
  5. 如何清除tomcat缓存
  6. .net core 5 IIS Api网站部署需要注意
  7. java ip调天气预报接口_JAVA + WeatherWebService 实现天气预报接口调取
  8. ROS的学习(十九)用rosserial创建一个subscriber
  9. lintcode-397-最长上升连续子序列
  10. Stroustrup 谈 C++ 11的新特性
  11. c语言成绩管理系统1.0,c语言成绩管理系统完整附源码v1.0 免费版
  12. Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)...
  13. 网络安全——终端安全
  14. 【推荐】技术面试结束后,如何向技术面试官提问?
  15. 泰裤辣!五一烧烤倒计时,还有人没做好攻略吗?
  16. PTA 1100 校庆(Python3)
  17. 【Go资料】go语言学习资料书籍
  18. A - Fibonacci
  19. kwgt 歌词_kwgt桌面插件美化下载-Eight for kwgt专业版主题包v3.9.136.1 最新版-腾飞网...
  20. android preference 启动activity,Android PreferenceActivity 学习笔记

热门文章

  1. 计算机职业资格证书的权威部门是哪个部门?
  2. 看携程如何借助“预测式外呼”提高呼叫效率
  3. js清除浏览器缓存的几种方法
  4. 小程序springboot食堂预约订餐系统毕业设计-附源码221554
  5. Excel怎么调出开发工具选项
  6. 天源财富:意法半导体推出下一代MEMS加速度计 可用于高性能汽车
  7. [Swift]LeetCode334. 递增的三元子序列 | Increasing Triplet Subsequence
  8. c语言中文定义什么类型,typedef在c语言中是什么意思?
  9. 一文读懂机器学习,大数据/自然语言处理/算法全有了
  10. 【RFID实训】公交收费系统详细过程