基于51单片机的数码管智能百叶窗
设计要求:本设计以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使能右侧电机。
IN1和IN2为一组,对应OutA(输出A)
IN3和IN4为一组,对应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单片机的数码管智能百叶窗相关推荐
- 【51毕设案例】基于51单片机-定时喂食供氧智能鱼缸
目录 功能介绍: 整体功能简述: 硬件框图: 软件流程图: 原理图: 仿真图: 元器件清单: 主要部分代码展示:void main() 工程管理展示: 下载内容展示: 更详细代码视频讲解及代码下载请看 ...
- 基于51单片机与ESP8266的智能台灯设计
一.硬件设计 1. 硬件选型 主控芯片:选用STC89C52RC,单片机通过串口与EPS866模块通信. LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117- ...
- 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】
630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...
- 基于51单片机的RFID RC522智能钱包
RFID RC522智能钱包 基于51单片机的RFID RC522智能钱包,这个程序主要演示的是RFID RC522智能钱包中的设置及扣款功能,相信会扣款那么充值也就改一个数字的事,具体的功能要自己根 ...
- 基于51单片机的多功能智能语音循迹避障小车
目录 一.功能介绍及硬件准备 二.电机控制及调速 三.小车循迹方案 四.跟随功能实现 五.测速功能实现 六.OLED显示车速 七.摇头避障功能实现 八.SU-03T语音模块介绍 九.语音切换小车模式+ ...
- 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)
前言 该智能家居系统以 STC89C52单片机为控制核心,结合 LCD1602 液晶显示屏.L298N电机驱动模块.光敏电阻,ESP8266WiFi模块,DS18B20温度计设计并实现了自动感光窗帘与 ...
- 基于51单片机的数码录音放音系统设计
摘 要 随着语言的处理技术在工业生产.交通.通信等方面的运用得到不断创新.数码录音放音系统已得到了越来越多的人的青睐,通过对多种录音放音系统的设计方案进行了比较和分析,本论文最终选定以STC89C5 ...
- 35、基于51单片机自动灭火避障智能小车 消防灭火小车系统设计
摘要 智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途.智能小车就是其中的一个体现,本次设计的多功能智能灭火避障小车 ...
- 基于51单片机的数码管显示方案
这一次给大家带来的项目是课堂作业级别的51单片机数码管显示,本次的项目着重于讲解原理,让大家明白单片机的io对于外界设备的控制是如何进行的. 共阳极和共阴极数码管的差异 (1)驱动方法的差异.一个数码 ...
最新文章
- [转载]TFS与Project、Excel同步
- Universal-imageLoader缓存图片加载
- /usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: No such file or directory
- gensim在“中文查找(关键词)“与“txt文本“之间做相似度计算(返回最相似的文本)
- html 存储登录状态,Vue中保存用户登录状态实例代码
- wchar_t 的输出问题
- 契约测试:解决微服务测试的问题
- Django实现省市县级联菜单
- [网络流24题] 餐巾计划问题
- DevExpress控件TExtLookupComboBox实现多列模糊匹配输入的方法
- Java实体类与数据库表映射关系
- caj是什么格式的文件
- ASO优化|五步解锁关键词选择优化正确姿势!
- c#操作.mpp文件
- PAT-1068 万绿丛中一点红
- 为什么128KB的魂斗罗可以实现那么长的剧情?
- 2017年微商行业八大趋势
- win7系统安装 wifi连接到服务器,win7系统笔记本wifi无法连接到服务器1237的解决方法...
- 2021年茶艺师(中级)复审考试及茶艺师(中级)理论考试
- 门禁系统服务器未连接,门禁系统一般故障处理方法及如何选择电插锁
热门文章
- 「3D游戏建模」在Maya中加快建模速度的5种技巧
- 怎么样可以搭建自己的腾讯云服务器
- ubuntu16.04下 1080ti显卡驱动384.98+cuda9.0+cudnn+caffe 安装过程,本人新测,没毛病
- 加拿大约克大学计算机科学研究生如何申请,2020年加拿大约克大学研究生申请条件是什么?...
- 微信3.3.0内测版发布,Windows电脑可以刷朋友圈了
- 10行代码爬取英雄联盟皮肤全套。6不6?
- 视频批量剪辑,教你制作视频水平翻转的方法
- PHP微信企业付款接口完整源码微信企业付款到零钱功能接口DEMO源码
- JavaScript的算数运算符与比较运算符,附赠课程+题库
- C盘满了怎么分析C盘使用情况 找出C盘大文件