设计要求:本设计以MCS-51系列单片机为核心,采用常用电子器件设计,一个电源开关,用一台直流电机控制百叶窗叶片的旋转(正转/反转),用一个光敏电阻传感器测量室内光强度,并用两位数码管显示测量结果,设置三个按键:手动/自动、手动正转和手动反转用一个发光二极管显示手动/自动状态,自动状态时二极管亮。设置两个极限位置保护行程开关,用于保护百叶窗叶片:当正转到极限位置压下行程开关时,电机停止正转,但还可以反转;当反转到极限位置压下行程开关时,电机停止反转,但还可以正转。按键输入采用中断方式,按键中断请求信号接INT0。单片机根据设定光强S1和S2和实测光强P来控制电机M的动作,分别使电机正转、反转或者停转来达到控制光强弱的功能。

使用的设备:光敏电阻传感器,直流电机,两位数码管

实现功能:自动模式和手动模式

实现方式:采用中断方式

系统框图:

程序流程图:

目录

I2C总线的设定

代码如下:

ADC数据转换:通过PCF8591实现

寻址

控制字节

proteus仿真中的接线法

电机:通过L298N实现

引脚

proteus仿真中的接线法

两位数码管

代码

proteus仿真中的接线法

proteus仿真中的定时器外部中断

定时器和外部中断

代码

主函数


I2C总线的设定

代码如下:

#include <REGX52.H>
#include "I2C.h"void I2CStart()  //I2C开始
{I2C_SCL=1;I2C_SDA=1;I2C_SDA=0; I2C_SCL=0;
}void I2CStop()  //I2C结束
{I2C_SCL=0;I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}bit I2CWrite(unsigned char dat) //I2C写操作,dat-代写数值,ack-返回应答值
{bit ack;  //用来暂存应答值unsigned char mask;  //用来暂存数据for(mask=0x80;mask!=0;mask>>=1){if((mask&dat))I2C_SDA=1;elseI2C_SDA=0;I2C_SCL=1;    //拉高SCLI2C_SCL=0;    //再拉低SCL,完成一个周期}I2C_SDA=1;    //主机释放SDAI2C_SCL=1;ack=I2C_SDA;  //读取SDA值,即为应答值I2C_SCL=0;return (~ack); //因为原本的I2C是0表示应答,1表示非应答,所以这里取反
}unsigned char I2CReadNAK()  //I2C总线读操作,发送非应答信号并继续读下去,返回值-读到的字节
{unsigned char mask; unsigned char dat;  //暂存数据I2C_SDA=1;  //确保主机释放SDAfor(mask=0x80;mask!=0;mask>>=1){I2C_SCL=1;if(I2C_SDA)dat|=mask;elsedat&=~mask;I2C_SCL=0;}I2C_SDA=1;  //拉高SDA,发送非应答信号I2C_SCL=1;  //拉高SCLI2C_SCL=0;  //再拉低SCL完成非应答return dat; //返回数据
}unsigned char I2CReadACK()  //I2C总线读操作,发送应答信号并不再读下去,返回值-读到的字节
{unsigned char mask;unsigned dat; //暂存数据I2C_SDA=1;    //确保主机释放SDAfor(mask=0x80;mask!=0;mask>>=1){I2C_SCL=1;if(I2C_SDA)dat|=mask;elsedat&=~mask;I2C_SCL=0;}I2C_SDA=0;  //拉高SDA,发送应答信号I2C_SCL=1;  //拉高SCLI2C_SCL=0;  //再拉低SCL完成应答return dat; //返回数据
}

ADC数据转换:通过PCF8591实现

寻址

i2c总线系统中的每个PCF8591设备通过发送一个有效的地址来寻址。
地址由固定部分可编程部分组成。
可编程部分必须根据地址引脚AO、A1和A2进行设置。
地址总是必须作为I2c总线协议中的开始条件之后的第一个字节被发送。
地址字节的最后一位是读写位,它设定了接下来数据传输的方向。

控制字节

发送到PCF8591设备的第二个字节将存储在其控制寄存器中,并需要控制设备的功能。

1、最高位和第三位默认为0
2、第六位:AD使能位,为1开启,为0关闭
3、第四位和第五位:单端、差分选择位
4、第二位:自动增量位(一般位0)
5、读取选择位:比如读取AIN0,或者读取AIN2

(注意:最低位为第0位,最高位为第七位)

proteus仿真中的接线法

1、PCF8591 是一个单片集成、单独供电、8-bit CMOS数据获取器件。
2、AIN0、AIN1、AIN2、AIN3为模拟输入端
3、AOUT为模拟输出端
4、EXT为低电平时使用内部时钟,为高电平时使用外部时钟
5、A0、A1、A2为地址引脚
6、OCS振荡器、VREF基准电压、AGND接地

#include <REGX52.H>
#include "I2C.h"//通过I2C读取AD值
unsigned char GetADCValue(unsigned char chn)
{unsigned char val;I2CStart();if(!I2CWrite(0x48<<1))     //判断最后一位是读或写{I2CStop();             return 0;}I2CWrite(0x40|chn);        //AD使能位,为1开启,为0关闭  I2CStart();I2CWrite(0x48<<1 | 0x01);  //读写位置1,即为读出数据I2CReadACK();val=I2CReadNAK();I2CStop();return val;
}

电机:通过L298N实现

通过将引脚接为高电平或低电平控制接通还是关断,ENA使能左侧电机,ENB使能右侧电机。

 IN1IN2为一组,对应OutA(输出A)

IN3IN4为一组,对应OutB(输出B)

引脚

proteus仿真中的接线法

两位数码管

SMG1控制第一位数码管,SMG2控制第二位数码管

RP与段码表配合,可以显示想要输出的数字

代码

#include <REGX52.H>
#include "Display.h"
//数码管的动态扫描
unsigned char  Number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管显示当前值0-9
void Display(unsigned char num)
{static unsigned char t;SMG1=0;  //控制第一位数码管暗灭SMG2=0;  //控制第二位数码管暗灭if(t==0){t=1;PR=Number[num/10];  //显示十位SMG1=1;  //点亮第一位数码管SMG2=0;}else{t=0;PR=Number[num%10];  //显示个位SMG1=0;SMG2=1;  //点亮第二位数码管}
}

proteus仿真中的接线法

 注:由于I0口的输出有效,要加“上拉电阻”拉高电平才能驱动。

proteus仿真中的定时器外部中断

XTAL1:反向振荡放大器的输入。

XTAL2:来自反向振荡器的输出。

RST:接复位按钮。

PSEN:外部程序存储器的选通信号。

EA/VPP:当/EA保持低电平时,则在此期间读取外部程序存储器,不管是否有内部程序存储器。当/EA端保持高电平时,此期间读取内部程序存储器。

ALE/PROG:在编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,

定时器和外部中断

代码

#include <REGX52.H>//定时器初始化
void Time1_init()
{TMOD |= 0x10;          //使用模式1,16位定时器TH1   = (65536-10000)/256;  //定时器装入初始值10msTL1   = (65536-10000)%256;EA    = 1;  //总中断ET1   = 1;//定时器1初始化TR1   = 1;}//外部中断初始化
void EX_Init()
{EA=1;IT0=1;EX0=1;
}

主函数

#include <REGX52.H>
#include "I2C.h"
#include "Init.h"
#include "ADC.h"
#include "Display.h"
bit flag=0;//模式选择
sbit LED=P1^7;  //LED指示灯引脚
sbit IN1=P1^0;    //电机
sbit IN2=P1^1;
sbit K2=P3^3;          //按键控制正反转
sbit K3=P3^4;
sbit xianwei1=P3^6;       //限位开关
sbit xianwei2=P3^7;
unsigned char Light_val; //光照(电阻)强度void main()
{Time1_init();  //定时器初始化EX_Init();     //中断初始化while(1){Light_val=(char)(GetADCValue(0)/3);  //获取ADC数值if(flag==0)  //自动模式{LED=0;           //灯亮xianwei1=1;xianwei2=1;if((xianwei1==1)&&(Light_val<30))       //如果光照强度小于30并且限位开关1没有关闭{IN1=1;IN2=0;}   //正转else if((xianwei2==1)&&(Light_val>50))  //如果光照强度大于50并且限位开关2没有关闭{IN1=0;IN2=1;}   //反转else{IN1=1;IN2=1;}   //刹车}if(flag==1)  //手动模式{K2=1;K3=1;xianwei1=1;xianwei2=1; if((K2==0)&&(xianwei1==1))  //如果摁下K2并且限位开关1没有关闭{IN1=1;IN2=0;while(!K2);}   //正转,并且摁下K2不松手时一直循环if((K3==0)&&(xianwei2==1))  //如果摁下K3并且限位开关2没有关闭{IN1=0;IN2=1;while(!K3);}   //反转,并且摁下K3不松手时一直循环else{IN1=1;IN2=1;}  //刹车}}
}//中断函数
void Int0() interrupt 0
{flag=~flag;  //模式变换
}//定时器中断服务函数为计时器使用
void time1(void)interrupt 3
{TH1=(65536-10000)/256;TL1=(65536-10000)%256;Display(Light_val);  //数码管显示数值}

仿真

基于51单片机的数码管智能百叶窗相关推荐

  1. 【51毕设案例】基于51单片机-定时喂食供氧智能鱼缸

    目录 功能介绍: 整体功能简述: 硬件框图: 软件流程图: 原理图: 仿真图: 元器件清单: 主要部分代码展示:void main() 工程管理展示: 下载内容展示: 更详细代码视频讲解及代码下载请看 ...

  2. 基于51单片机与ESP8266的智能台灯设计

    一.硬件设计 1. 硬件选型 主控芯片:选用STC89C52RC,单片机通过串口与EPS866模块通信. LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117- ...

  3. 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】

    630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...

  4. 基于51单片机的RFID RC522智能钱包

    RFID RC522智能钱包 基于51单片机的RFID RC522智能钱包,这个程序主要演示的是RFID RC522智能钱包中的设置及扣款功能,相信会扣款那么充值也就改一个数字的事,具体的功能要自己根 ...

  5. 基于51单片机的多功能智能语音循迹避障小车

    目录 一.功能介绍及硬件准备 二.电机控制及调速 三.小车循迹方案 四.跟随功能实现 五.测速功能实现 六.OLED显示车速 七.摇头避障功能实现 八.SU-03T语音模块介绍 九.语音切换小车模式+ ...

  6. 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)

    前言 该智能家居系统以 STC89C52单片机为控制核心,结合 LCD1602 液晶显示屏.L298N电机驱动模块.光敏电阻,ESP8266WiFi模块,DS18B20温度计设计并实现了自动感光窗帘与 ...

  7. 基于51单片机的数码录音放音系统设计

    摘  要 随着语言的处理技术在工业生产.交通.通信等方面的运用得到不断创新.数码录音放音系统已得到了越来越多的人的青睐,通过对多种录音放音系统的设计方案进行了比较和分析,本论文最终选定以STC89C5 ...

  8. 35、基于51单片机自动灭火避障智能小车 消防灭火小车系统设计

    摘要 智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途.智能小车就是其中的一个体现,本次设计的多功能智能灭火避障小车 ...

  9. 基于51单片机的数码管显示方案

    这一次给大家带来的项目是课堂作业级别的51单片机数码管显示,本次的项目着重于讲解原理,让大家明白单片机的io对于外界设备的控制是如何进行的. 共阳极和共阴极数码管的差异 (1)驱动方法的差异.一个数码 ...

最新文章

  1. [转载]TFS与Project、Excel同步
  2. Universal-imageLoader缓存图片加载
  3. /usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: No such file or directory
  4. gensim在“中文查找(关键词)“与“txt文本“之间做相似度计算(返回最相似的文本)
  5. html 存储登录状态,Vue中保存用户登录状态实例代码
  6. wchar_t 的输出问题
  7. 契约测试:解决微服务测试的问题
  8. Django实现省市县级联菜单
  9. [网络流24题] 餐巾计划问题
  10. DevExpress控件TExtLookupComboBox实现多列模糊匹配输入的方法
  11. Java实体类与数据库表映射关系
  12. caj是什么格式的文件
  13. ASO优化|五步解锁关键词选择优化正确姿势!
  14. c#操作.mpp文件
  15. PAT-1068 万绿丛中一点红
  16. 为什么128KB的魂斗罗可以实现那么长的剧情?
  17. 2017年微商行业八大趋势
  18. win7系统安装 wifi连接到服务器,win7系统笔记本wifi无法连接到服务器1237的解决方法...
  19. 2021年茶艺师(中级)复审考试及茶艺师(中级)理论考试
  20. 门禁系统服务器未连接,门禁系统一般故障处理方法及如何选择电插锁

热门文章

  1. 「3D游戏建模」在Maya中加快建模速度的5种技巧
  2. 怎么样可以搭建自己的腾讯云服务器
  3. ubuntu16.04下 1080ti显卡驱动384.98+cuda9.0+cudnn+caffe 安装过程,本人新测,没毛病
  4. 加拿大约克大学计算机科学研究生如何申请,2020年加拿大约克大学研究生申请条件是什么?...
  5. 微信3.3.0内测版发布,Windows电脑可以刷朋友圈了
  6. 10行代码爬取英雄联盟皮肤全套。6不6?
  7. 视频批量剪辑,教你制作视频水平翻转的方法
  8. PHP微信企业付款接口完整源码微信企业付款到零钱功能接口DEMO源码
  9. JavaScript的算数运算符与比较运算符,附赠课程+题库
  10. C盘满了怎么分析C盘使用情况 找出C盘大文件