【51单片机】【protues仿真】基于51单片机智能路灯控制系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、LCD1602液晶显示时间,光照值
2、按键设定系统时间、工作时间、光照阈值
(默认开始时间为18点,结束时间为6点)
3、工作时间内路灯点亮,凌晨12点后路灯关闭,
有人或车通过,路灯点亮10s
4、非工作时间光照强度低于阈值,路灯点亮
5、手动和自动模式可通过按键自己手动切换,
手动模式由开关控制路灯亮灭
二、使用步骤
系统采用STC89C52作为主控芯片,通过光敏电阻与ADC0832芯片检测环境光照强度,配合DS1302时钟芯片实现时间控制。LCD1602液晶屏用于显示时间、光强及工作状态,红外传感器和噪声模块用于检测,蜂鸣器实现故障报警功能。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、时钟模块传感器
4、蜂鸣器模块
5、LED灯模块
6、LCD1602显示模块
四、软件设计、
#include<reg52.h>
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define yh 0x80
#define er 0x80+0x40
sbit en=P2^7;
sbit rw=P2^6;
sbit rs=P2^5;
sbit KeySet=P2^0;
sbit KeyUp=P2^1;
sbit KeyDown=P2^2;
sbit Keyout=P2^3;
sbit key_5 = P1^6;
sbit key_6 = P1^7;
sbit AD_clk = P1^3;
sbit AD_do = P1^4;
sbit AD_di = P1^4;
sbit AD_cs = P1^5;
sbit SCLK = P1^0;
sbit IO = P1^1;
sbit RST = P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit Beep = P3^6;
sbit led_1 = P3^7;
sbit red_sr = P2^4;
uchar code tab1[]= {"20 - - "};
uchar code tab2[]= {" : : "};
uchar count=0;
uchar nian,yue,ri,shi,fen,miao;
uchar nian_temp,yue_temp,ri_temp,shi_temp,fen_temp,miao_temp;
bit p_r=0;
char time;
char work_time_Start = 18 ,work_time_zhon = 0,work_time_End = 6;
bit light_flag;
uchar light;
uchar light_limit=100;
uchar Mode_flag = 0;
void Timer0Init(void);
void Timer1Init(void);
void uart_init();
void delay(uint xms);
void main()
{
lcd_init();
Timer0Init(); //定时器0初始化
Timer1Init(); //定时器1初始化
while(1) //无限循环下面的语句:
{
qiehaun();
keyscan();
set_work_time();
set_limit_light();
light = 255-AD(0);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count == 20) //1s
{
count = 0;
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian= BCD_Decimal(read_1302(0x8d));
write_sfm(6,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
write_sfm(3,fen);//分,从第二行第5个字符后开始显示
write_sfm(0,shi);//小时,从第二行第2个字符后开始显示
//显示日、月、年数据:
write_nyr(8,ri);//日期,从第二行第9个字符后开始显示
write_nyr(5,yue);//月份,从第二行第6个字符后开始显示
write_nyr(2,nian);//年,从第二行第3个字符后开始显示
write_1602com(0x8e);
write_1602dat('0'+time%100/10);//显示计时
write_1602dat('0'+time%10);
write_1602com(0xcd); //显示当前光照强度
write_1602dat('0'+light/100);
write_1602dat('0'+light%100/10);
write_1602dat('0'+light%10);
}
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256; //50ms
TL1=(65536-50000)%256;
Led_count++;
if(Led_count == 20) //1s
{
Led_count = 0;
time ++;
if(time>9)
Beep = 0;
}
}
void Timer0Init(void) //50微秒
{
TMOD|=0x01; //TMOD=0000 0001B,使用定时器T0的模式1
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的高8位赋初值
ET0=1; //开T0中断
TR0=1; //定时开始
EA =1;
}
void Timer1Init(void) //50微秒
{
TMOD|=0x10; //TMOD=0000 0001B,使用定时器T0的模式1
TH1=(65536-50000)/256; //定时器T0的高8位赋初值
TL1=(65536-50000)%256; //定时器T0的高8位赋初值
ET1=0; //关T0中断
TR1=1; //定时开始
EA =1;
}
//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms; x>0; x--)
for(y=110; y>0; y--);
}
五、实验现象
演示视频:
【51单片机-B053】【protues仿真】基于51单片机智能路灯控制系统仿真