本文主要是介绍基于51单片机的定时插座设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、方案流程及技术规格书设计
二、系统硬件电路设计
三、软件编写及调试
四、系统调试测试与分析
前言
随着现代社会的不断进步,人们的生活水平也不断提高,人们对生活品质的要求也就越来越高,开始追求个性化、智能化,追求快捷、高效,充满乐趣的生活方式。人们在居住条件不断改善和提升的基础上,对家庭电器的档次要求越来越高,对家居环境也追求一种人性化、智能化,智能家居也就应运而生。由此,智能电子技术也开始在智能家居电子产品中得到广泛了应用,而网络通信技术的飞速发展,给现代人们的家居生活也带来了全新的体验。智能家居正在口渐兴起,插座智能化正在成为一种趋势。
智能化系统是从上个世纪八十年代兴起于欧美国家和口本,并于九十年代末进入我国,经过十几年发展,尤其是伴随我国住宅与房地产业的高速发展。“智能插座”是以住宅为平台,集系统、结构、服务、管理、控制于一体,利用先进的网络通讯技术、电力自动化技术、计算机技术、将与居家生活有关的各种设备有机地结合起来,通过网络化的综合管理家中插座设备,来创造一个优质、高效、安全、便利、节能、健康、环保的居住生活环境空间。
传统的家居插座系统一般采用集中控制器为中心,采用界面按键操作的方式来控制家居家电。采用界面操作控制的弊端是操作复杂,必须在固定地点操作。随着定时识别技术的快速发展,定时识别的准确率和可靠性大幅提高。定时识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。定时识别TTI(Timing To Identify)的最大优势在于使得人机用户界面更加自然和容易使用。
基于定时识别技术的上述特点,同时结合当代智能家居在控制中的实际需求,我们选择定时控制插座系统。本系统具有良好的开发和应用前景,在智能插座这个概念广为人知的时代,定时控制技术与智能插座的融合,最终会让智能插座引领市场并且走向更为广泛的应用。
软件工具准备
软件:
电路设计:protel99 se(up主使用版本) 或者其他版本,或者其他电路设计软件;
单片机开发:Keil5;
调试测试:串口调试助手,逻辑分析仪等;
工具:
电路焊接:电烙铁,SMT(有条件的);
调试:
万用表、示波器(基础入门即可,可以白嫖学校或者公司)USB转串口工具、仿真器;
一、方案流程及技术规格书设计
方案流程设计
技术规格书设计
1.单片机读取实时时钟DS1302时间。
2.实时时钟信号输入单片机IAP15F2K61S2,单片机处理相关数据并在LCD1602液晶显示。
3.有信息提示,当系统检测到达设定定时时间,蜂鸣器发出鸣响, 控制继电器断开电源,控制插座断电。
4.按键可以设置当前时间和定时时间并通过LCD1602显示。
5.设计运用单片机来控制系统,DS1302实时时钟、LCD1602显示和蜂鸣器模块在与它周围连接,模块与模块之间传送信号实现最终要求。本设计采用IAP15F2K61S2芯片。IAP15F2K61S2 是一款有4k字节FLASH的8位单片机。本芯片是一款可以为许多嵌入式控制应用提供高效灵活低成本解决方案的微控器。我对其中原理的理解是:单片机读取DS1302实时时钟芯片时间,在IAP15F2K61S2单片机识别按键操作后,单片机根据命令设定定时时间,使用LCD1602闪烁显示,判断是否检测到达设定时间,检测到蜂鸣器发出鸣响,控制继电器断开电源,控制插座断电。综上总体硬件设计框图如图所示。
系统的硬件整体框图如下:
二、系统硬件电路设计
2.1微处理控制电路
单片机采用了宏晶公司的IAP15F2K61S2,单片或微型计算机集成电路中通常有复位电路、晶振时钟电路等,从而避免了外部的复位环和周边晶振。
2.2 LCD1602液晶显示电路
LCD1602A是LCD1602A的 LCD驱动 IC (HD44780 LCD)的功率电路,以及与 LCD组件连接的16个插头,电路如上图;LCD1602是一个具有32个字符的显示单元,、一行16个字符,可以同时显示两行16*2个字符,电路如图所示。
2.3 继电器驱动电路
继电器由永久磁铁保持释放状态,加上工作电压后,电磁感应使衔铁与永久磁铁产生吸引和排斥力矩,产生向下运动,最后达到吸合状态。1,它具有控制系统和被控制系统之间的互动关系。2,继电器是一种当输入量变化到某一定值时。3,继电器是一种电控制器件,当输入量的变化达到规定要求时。
2.4 DS1302实时时钟电路
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。电路如上图。
2.5 蜂鸣器电路设计
采用被动式蜂鸣器,当蜂鸣器不响时,P33端口输出低电平,Q1不导电,没有电流通过蜂鸣器,P33端口输出4 KHz的方波,Q1在P33高电平时导通,在低压时导通。蜂鸣器的电流也是4千赫兹,因此蜂鸣器发出声音。
2.6 电平转换电路
本系统采用外部9 V的电源适配器,但 MCU、 LCD均要求5 V的电压,采用7805三端稳压集成电路。
2.7 原理图及PCBA版图
三、软件编写及调试
3.1 protues软件仿真设计
电路的仿真使用了Proteus软件,Proteus是一款电路设计和模拟的软件。
上电初始状态的仿真如图,显示当前时间00-00-00。
上电后通过控制按键设定目标时间为00-01-00,当当前时间为00-01-00时继电器闭合,插座通电,蜂鸣器提示。
一分钟继电器闭合后通过控制按键设定目标时间为00-02-00,当当前时间为00-02-00时继电器断开,插座断电,蜂鸣器提示。
四、系统调试测试与分析
4.1 步进电机
/* 步进电机启动函数、angle-需要转过的角度 */
void StartMotor(unsigned long angle)
{
//在计算前关闭中断,完成再开启,避免中断打断计算过程而造成错误
//EA = 0;
beats = (angle * 4076) / 360; // 实测为4076拍转一圈
//EA = 1;
}
void turn_motor_1(unsigned long angle)
{
unsigned char tmp;
unsigned char index;
unsigned char BeatCode[8] = {0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6}; //步进电机节拍对应的IO控制代码
if (beats != 0) //节拍不为0产生一个驱动节拍
{
tmp = P1; //用tmp把p1口当前值暂存
tmp = tmp & 0xF0; //用&操作清零低4位
tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低4位
P1 = tmp; //把低4位的节拍代码和高4位的原值送回P1
index++; //节拍输出索引递增
index = index & 0x07; //用&操作实现到8归零
beats--; //总节拍数减一
}
else //节拍为0则关闭电机所有的相
{
P1 = P1 | 0x0F;
}
}
4.2 LCD1602液晶显示
/***写命令***/
void cmd_w(uchar cmd)
{
RW=0;
RS=0;
E=1;
P1=cmd;
delay(1);
E=0;
}
/***写数据***/
void dat_w(uchar dat)
{
RW=0;
RS=1;
E=1;
P1=dat;
delay(1);
E=0;
}
/***清屏****/ /*
void lcd_clear(void)
{
cmd_w(0x01); //清屏
cmd_w(0x02); //清屏回到左上角
} */
/***初始化**/
void Lcd1602_init(void)
{
cmd_w(0x38);
cmd_w(0x0c);
cmd_w(0x06);
cmd_w(0x01);
cmd_w(0x80);
}
/***光标定位****/
void gotoxy(uchar x,uchar y) //x是行数,y是列数
{
if(x==1)
{cmd_w(0x80+y);}
else
{cmd_w(0xc0+y);}
}
void dsp_ch(uchar _ch)
{
dat_w(_ch);
}
4.3 LCD1602液晶显示
void inputbyte(unsigned char dat)
{
unsigned char i;
for ( i=8; i>0; i-- )
{
SCLK_1302 = 0;
NOP;
NOP;
if(dat&0x01)
{
DIO_1302 = 1;
}
else
{
DIO_1302 = 0;
}
NOP;
NOP;
dat >>= 1;
SCLK_1302 = 1;
NOP;
NOP;
NOP;
NOP;
}
}
unsigned char outputbyte(void)
{
unsigned char i;
unsigned char dat=0;
for ( i=8; i>0; i-- )
{
dat >>= 1;
NOP;
NOP;
SCLK_1302 = 0;
NOP;
NOP;
if(DIO_1302)
{
dat|=0X80;
}
NOP;
NOP;
SCLK_1302 = 1;
NOP;NOP;NOP;NOP;
}
return(dat);
}
void write1302 ( unsigned char addr,dat )
{
CE_1302 = 0;
NOP;
NOP;
SCLK_1302 = 0;
NOP;
NOP;
CE_1302 = 1;
NOP;NOP;NOP;NOP;
inputbyte(addr);
inputbyte(dat);
CE_1302 = 0;
}
unsigned char read1302 (unsigned char addr)
{
unsigned char dat,data_buff;
CE_1302 = 0;
NOP;
NOP;
SCLK_1302 = 0;
NOP;
NOP;
CE_1302 = 1;
NOP;NOP;NOP;NOP;
inputbyte(addr);
dat=outputbyte();
SCLK_1302 = 1;
NOP;
NOP;
CE_1302 = 0;
data_buff=dat;
data_buff/=16;
dat=dat%16;
dat=data_buff*10+dat;
return (dat);
}
void ds1302_init(void)
{
write1302 (WRITE_PROTECT,0X00);
write1302 (WRITE_SECOND,0);
write1302 (WRITE_MINUTE,0);
write1302 (WRITE_HOUR,0);
write1302 (WRITE_DAY,1);
write1302 (WRITE_DATE,1);
write1302 (WRITE_MONTH,1);
write1302 (WRITE_YEAR,0x22);
write1302 (WRITE_CHARG,0xA9);
write1302 (WRITE_TIMEINIT,0x55);
write1302 (WRITE_PROTECT,0x80);
}
4.3 LCD1602液晶显示
void buzz_on(void)
{
if(buzz_state)
{
buzz_state = 0;
}
else
{
buzz_state = 1;
}
if(buzz_state) //PA8口0.25ms取反
{
BUZZ = 1;
}
else
{
BUZZ = 0;
}
}
void buzz_off(void)
{
BUZZ = 0;
}
void task_buzz(void) //蜂鸣器任务函数,250us运行
{
if(buzz_time) //蜂鸣器响时长
{
buzz_on();
}
else
{
buzz_off();
}
}
void buzz_run_time(void) //buzz_time计时,250us定时器运行,1s减1
{
int i = 4;
if(buzz_time)
{
i--;
if(i == 0)
{
i = 4;
buzz_time--;
}
}
}
void start_buzz(unsigned int _time)
{
buzz_time = _time; //设置蜂鸣器响时长
}
这篇关于基于51单片机的定时插座设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!