当前位置: 首页 > news >正文

【51单片机】【protues仿真】基于51单片机智能路灯PCF8591系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、LCD1602显示日期、时间、光照强度;
2、采用DS1302运行系统时间;
3、采用光敏电阻+PCF8591检测光照;
4、按键可修改系统时间、工作开始/结束时间、光照阈值;
5、工作时间:路灯点亮,
6、非工作时间:光照强度低于光照阈值,路灯点亮;

二、使用步骤

基于51单片机的智能路灯系统设计结合光控、时控、等多种功能,以实现节能和智能化管理,通过按键来切换模式和时间以及光敏阈值设置。

三、硬件资源

1、51单片机核心模块
2、按键模块
3、时钟模块
4、蜂鸣器模块
5、PCF8591模块
6、LCD1602显示模块

四、软件设计

#include<reg52.h>
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit en=P2^7;
sbit rw=P2^6;   //如果硬件上rw接地,就不用写这句和后面的rw=0了
sbit rs=P2^5;


sbit I2C_SCL = P1^3;//I2C通信的两个引脚
sbit I2C_SDA = P1^4;


//DS1302时钟芯片与C51之间的引脚连接定义
sbit SCLK = P1^0;
sbit IO   = P1^1;
sbit RST  = P1^2;

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

sbit led_1 = P3^7;

uchar code tab1[]= {"20  -  -        "};     //年显示的固定字符
uchar code tab2[]= {"  :  :          "};        //时间显示的固定字符


uchar count=0;                    
uchar Led_count=0;                         
uchar light;                           
uchar light_limit=100;                        
uchar Mode_flag = 0;
void Timer0Init(void);       
void uart_init(); 
void delay(uint xms);//延时函数,有参函数
void write_1602com(uchar com);
void write_1602dat(uchar dat);
void write_ShouNum(uchar x,uchar y,uchar dat);
void lcd_init();//***液晶初始化函数****
uchar read_byte();//读一个字节
void write_byte(uchar dat);//写一个字节
void I2C_delay()//I2C延时函数
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

void I2C_start()//I2C起始信号
{
    I2C_SDA = 1;
    I2C_SCL = 1;
    I2C_delay();
    I2C_SDA = 0;
    I2C_delay();
    I2C_SCL = 0;
    I2C_delay();
}

void I2C_stop()//I2C停止信号
{
    I2C_SDA = 0;
    I2C_SCL = 0;
    I2C_delay();
    I2C_SCL = 1;
    I2C_delay();
    I2C_SDA = 1;
    I2C_delay();
}

bit I2C_write(uint dat)//I2C写一个字节
{
    bit ack = 0;
    uint mask = 0;
    for(mask=0x80;mask!=0;mask>>=1)
    {
        if((mask&dat) == 0)
            I2C_SDA = 0;
        else
            I2C_SDA = 1;
        I2C_delay();
        I2C_SCL = 1;
        I2C_delay();
        I2C_SCL = 0;
        I2C_delay();
    }
    I2C_SDA = 1;
    I2C_delay();
    I2C_SCL = 1;
    I2C_delay();
    ack = I2C_SDA;
    I2C_delay();
    I2C_SCL = 0;
    I2C_delay();
    
    return (~ack);    
}

uint I2C_read_ACK()//I2C读一个字节,并发送应答位
{
    uint dat = 0;
    uint mask = 0;
    I2C_SDA = 1;
    for(mask=0x80;mask!=0;mask>>=1)
    {
        if(I2C_SDA == 0)
            dat = dat & (~mask);
        else
            dat = dat | mask;
        I2C_delay();
        I2C_SCL = 1;
        I2C_delay();
        I2C_SCL = 0;
        I2C_delay();
    }
    I2C_SDA = 0;
    I2C_delay();
    I2C_SCL = 1;
    I2C_delay();
    I2C_SCL = 0;
    I2C_delay();

    return dat;
}

uint I2C_read_NACK()//I2C读一个字节,并发送非应答位
{
    uint dat = 0;
    uint mask = 0;
    I2C_SDA = 1;
    for(mask=0x80;mask!=0;mask>>=1)
    {
        if(I2C_SDA == 0)
            dat = dat & (~mask);
        else
            dat = dat | mask;
        I2C_delay();
        I2C_SCL = 1;
        I2C_delay();
        I2C_SCL = 0;
        I2C_delay();
    }
    I2C_SDA = 1;
    I2C_delay();
    I2C_SCL = 1;
    I2C_delay();
    I2C_SCL = 0;
    I2C_delay();

    return dat;
}

uint get_ADC_vaule(uint chn)//获取AD值
{
    uint value = 0;
    I2C_start();//I2C起始信号
    if(!I2C_write(0X90))//写入PCF8591地址及读写选择位为写
    {
        I2C_stop();
        return 0;
    }
//    I2C_write(0X40 | chn);//写入PCF8591通道0
    I2C_write(0x00 | chn);//写入PCF8591通道0
    I2C_start();//I2C起始信号
    I2C_write(0x48<<1 | 0x01);
    I2C_read_ACK();//提供转换所需的时钟信号
    value = I2C_read_NACK();//读取上一次转换的结果
    I2C_stop();//I2C结束信号

    return value;
}
//*******************主函数**************************
void main()
{

    lcd_init();      //调用液晶屏初始化子函数
    Timer0Init();   //定时器0初始化
//    ds1302_init();   //调用DS1302时钟的初始化子函数
    while(1)  //无限循环下面的语句:
    {        
        qiehaun();//模式切换
        keyscan();//时间设置
        set_work_time();                //设定工作时间
        set_limit_light();                //设定光照阈值
        light = 255-get_ADC_vaule(0);                    //读取ADC数值     
    }
}

五、实验现象

演示视频:


文章转载自:

http://hsp1bJjn.npmpn.cn
http://dA3gT64w.npmpn.cn
http://xmv5EkNG.npmpn.cn
http://DyakQXcl.npmpn.cn
http://5VbT6Ug2.npmpn.cn
http://FALoUHba.npmpn.cn
http://kA97ETls.npmpn.cn
http://ZpnjIfSx.npmpn.cn
http://QU9S8fvv.npmpn.cn
http://2RvZ17xE.npmpn.cn
http://ueNw3814.npmpn.cn
http://s136jXbS.npmpn.cn
http://7aBztgX3.npmpn.cn
http://sGUS5iXX.npmpn.cn
http://QjrrfnML.npmpn.cn
http://7YEVYSpZ.npmpn.cn
http://XTtObPqF.npmpn.cn
http://Z2B9AHx8.npmpn.cn
http://eKUisR6s.npmpn.cn
http://IKZYWfVQ.npmpn.cn
http://Osa2V63I.npmpn.cn
http://6Qsr7gt9.npmpn.cn
http://v5AuTdCM.npmpn.cn
http://QKMUHgis.npmpn.cn
http://LaQvhtzc.npmpn.cn
http://eDqvlwtP.npmpn.cn
http://GV1wEyah.npmpn.cn
http://okw0PZfY.npmpn.cn
http://NGjrz9Zp.npmpn.cn
http://mdOy8bFr.npmpn.cn
http://www.dtcms.com/a/377060.html

相关文章:

  • 虚拟局域网(VLAN)入门指南:打破物理界限的网络划分术
  • 【HD-RK3576-PI】LoRa无线串口模块
  • 自动驾驶中的传感器技术42——Radar(3)
  • kafka消息积压出现的原因、危害及解决方案
  • 《sklearn机器学习——数据预处理》非线性转换
  • 登顶 NAVSIM!博世最新IRL-VLA:逆强化学习重构自动驾驶VLA闭环训练
  • 速度与安全双突破:大视码垛机重构工业自动化新范式​
  • Java全栈开发面试实录:从基础到微服务的深度解析
  • 智慧养老:科技的温度,生命的尊严——构建银发时代的幸福图景
  • 【SpringBoot3】与myBatis-plus不兼容解决
  • 阿尔泰科技ARTS-3002U USB总线多功能数据采集卡 技术解析
  • Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
  • 行业学习【电商】:订阅制电商
  • 【Halcon】Halcon HObject 转 Bitmap 的几种实现方法
  • 单片机启动文件——数据段重定位,BSS段清零
  • [xboard]ARM汇编基础学习
  • rv1126bp之mipi sensor驱动
  • 手机上可以记录每日工作计划的待办提醒工具?
  • 今天开始我们学习安全管理模块Linux防火墙
  • 反爬API接口:技术实现与应用场景
  • 10.3 马尔可夫矩阵、人口和经济
  • OpenResty 中实现限流(Rate Limiting)的实战案例
  • 告别“人肉API”时代:AI智能体如何重构人机协同新范式
  • Centos7部署ceph存储
  • 【Pywinauto库】10.1 pywinauto.base_wrapper控件
  • 机器人/人形机器人无法商业化落地的原因
  • 十一旅游气象的关键影响与“用大模型拿到更好天气数据”的落地路线
  • 软考系统架构设计师之软件测试篇
  • 【竞赛系列】机器学习实操项目04——客户信用评估模型开发全流程(baseline)
  • 爆破mysql登录密码