您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页基于STC15F2K60S单片机的光控灯设计

基于STC15F2K60S单片机的光控灯设计

来源:小侦探旅游网


基于STC15F2K60S单片机的光控灯设计

摘要:本设计为遥控调光控制系统,主要由触摸感应模块、无线发射与接收模块、显示模块、调光电路模块和主控模块构成,通过感应触摸屏输入控制信号经无线收发模块将信号送至主控器处理,主控器接到信号后控制调光电路实现对白炽灯的光强度控制,同时并用128液晶屏显示。本设计感应灵敏,发射距离长,调光连续,电路结构简单,成本低,操作方便。

关键词:遥控 感应 信号收发 调光

一、整体系统电路分析

遥控技术广泛应用到通信系统和其他电子系统中。如电视跳台、空调调温,若发收距离长时,还可以进行远程控制。系统是基于STC15F2K60S单片机的无线遥控灯光控制系统,通过感应触摸屏输入控制信号经无线收发模块将信号送至主控器处理,主控器接到信号后控制调光电路实现对白炽灯的强度控制。题目要求遥控传输距离大于7米,实现触屏感应按键对白炽灯进行光暗控制。基于以上要求,信号传输我们使用无线传输模块,触摸按键使用电容型按键,调光控制电路使用光耦和双向晶闸管进行调光,并实时显示光照强度。

根据要求,总体电路可由五个模块构成:1.感应触摸键盘模块; 2.无线收发模块; 3.主控CPU模块; 4.128液晶显示模块; 5.调光电路模块。系统的设计框图如下图1所示:

图1 遥控调光系统框图

二、系统方案设计与论证

2.1主控器选择

0

方案一:主控部分采用STCC51单片机,STCC51是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。该单片机使用方便,控制简单,单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制。由于其功耗低、体积小、技术成熟和成本低等优点,各个领域应用广泛。并且,由于芯片引脚少,在硬件很容易实现。但考虑到对负载连续控制,就要求单片机要产生占空比连续可调的方波,程序较复杂。

方案二:主控部分采用STC15F2K60S单片机,STC15F2K60S是一种新型的低功耗、高性能CMOS8位微控制器,具有 61K 在系统可编程Flash 存储器。该单片机使用方便,控制简单,单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制。由于其功耗低、体积小、功能齐全和成本低等优点。

基于以上比较我们选择方案二满足题目要求。 2.2感应触摸按键选择

方案一:采用触摸屏实现触摸遥控功能,这种触摸屏是电阻式的,电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转化为代表X坐标和Y坐标的电压来判断按键的位置。这种方案也可以实现,但是不符合题意。

方案二:采用市场上的全触电容屏,这种电容式触摸感应按键的基本原理是当人体(手指)接触金属感应片的时候,由于人体相当于一个接大地的电容,因此会在感应片和大地之间形成一个电容,感应电容量通常有几pF到几十pF。利用这个最基本的原理,在外部搭建相关电路,就可以根据这个电容量的变化,检测是否有人体接触金属感应片。电容式触摸按键比

电阻式的更加灵敏,所以选择方案二。 图2 按键示意图 2.3无线收发模块选择

方案一:我们可以选择NRF2401无线发射模块,NRF2401是单片射频收发芯片,芯片内置频率合成器功率放大器,晶体振荡器和调制器等模块,芯片功耗非常低,但是成本比较高,发射信号过程容易受到干扰。

方案二:选择红外线编码发射信号,在接收端通过解码芯片解码后给单片机处理,发射速度NRF2401快,我们选择红外发射模块。 2.4调光电路选择

方案一:选用固态继电器的开关来控制交流电,固态继电器原理跟继电器比

1

较相似,但是固态继电器的频率可以达到120HZ,这样用PWM波控制它的开关通断就可以实现灯光亮度的调节,不过灯光闪烁不停。

方案二:选用高频,高压的晶体管和光耦,光耦用作隔离,而且速度很快,利用光耦的通断在输出端输出高低电平来控制晶体管的通断,我们试了以后发现交流电电压太高,将晶体管烧坏了。

方案三:我们用光耦和双向晶闸管来做调压电路,晶闸管交流开关门级毫安级电流的通断可控制晶闸管阳极几十到几百安培电流的通断,交流开关的特点是晶闸管在承受正版周期电压时触发导通,而它的关断是利用电源负半周期在管子上加反电压来实现,在电流过零是自然关断。因此过零检测很重要,要保持同步触发,我们选择方案三。 2.5光传感器

采用光敏电阻采集光的强度,与电阻串联进行分压,然后用A/D采样后送给单片机处理实时检测并且显示光亮的强度。由于光敏电阻的随光照的强度非线性,我们在软件上进行补偿。

三、系统电路设计

3.1触摸按键电路

触摸按键采用STM8S103K3可编程芯片对采集的按键信息采集,进过处理后输出高低电平,从而达到触摸的目的。 3.2红外发射电路

红外发射电路我们采用集成发射、接受模块,只需对发射和接受进行编码和解码,然后送给单片机进行处理,该模块价格低且使用起来较简单。 3.3调光电路

本调光控制器的框图如下:

图3调光电路框图

(1)控制部分

为了便于灵活设计,选择可多次写入的可编程器件,本设计方案中选用的是ATMEL公司生产的ATC51单片机。

(2)驱动部分

由于驱动的对象是交流负载,且为了实现连续调节的目的,本电路中采用了

2

无触点开关元件双向可控硅。双向可控硅能够对交流电源的导通进行无触点连续控制,以小电流控制大电流,且动作快、寿命长、可靠性高。

(3)负载部分

本电路的负载是60W白炽灯(纯阻负载)。 3.4交流电源过零检测电路

交流电源同步信号的产生如图4电路所示,图中的同步信号就是我们需要的交流电压过零点信号。各部分波形如图5所示。

图中整流后波形中的水平虚线表示光耦P52l输入二极管的门限电压。P521是TLP521的简称。

图4过零点信号提取电路

图5 过零点信号(同步信号)波形图

3

图7 可控硅主电源导通区间,同步信号和触发信号时序图

图8 调光电路

3.5光传感器电路

4

图9采光电路

如上图,光敏电阻串联50欧的电阻供给+5V的电源,分析可知当光照强度强市AD口电压低,光照弱时电压高,通过AD采样送单片机处理获取光照强度。由于光敏电阻的特性曲线是非线性的,所以我们在软件中进行了补偿,从而得到光照强度。

3.6时钟控制电路

图10 DS1302时钟芯片 图11 DS1302工作原理

DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM,可通过简单的串行接口与单片机进行通信。

Vcc1:主电源; Vcc2:备份电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电, 当Vcc2< Vcc1时,由Vcc1向DS1302供电。 SCLK:串行时钟,输入,控制数据的输入与输出; I/O:三线接口时的双向数据线;

CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。

利用DS1302时钟芯片设计硬件电路及程序控制其灯的亮灭时间,实现定时控制。室内照明灯定时控制开启,分时段关闭,同时可扩展到小区路灯需要随季节天气变化及黑夜的长短来设定自动开启和关闭的时间。可以利用常有的装置进行组合设计,用来控制灯的定时开关,做到既便宜,性能又稳定可靠。

四、系统软件设计

5

开始 初始化 N 检测按键 是否按下? Y 0%亮度 30%亮度 60%亮度 100%亮度 亮度 增 亮度 减 调用触发 延时函数 显示相 应亮度

图12 系统软件流程图

五、系统测试

5.1测试方法

连接好电路,在距离为一米处通过遥控器调节灯光的亮度和准确率,依次每间隔一米增加遥控距离,记录相关测试数据。为了更准确直观地观测测试结果,我们可以借助示波器观察晶闸管的输入波形和单片机的触发信号是否同步,以及通过不同的出发点从而实现不同的灯光亮度。 5.2.遥控距离测试 传12345输距离 米 米 米 米 米

6

6米 米 7米 >7

能否实现 能 能 能 能 能 能 能 能 表1遥控距离测试表 由表可以看出遥控距离大于7米,满足题目要求。

六、结论与改进措施

经过一个星期的努力,本系统能达成课程设计的基本要求。 6.1 基本要求

(1)遥控器的遥控距离大于7米。

(2)遥控器不少于6个感应触摸按键。 (3)负载L为60W白炽灯。

(4)各个按键的功能及调光效果,如表2所示。

要求 达到程度 按键1 白炽灯打开,亮度100% (基本满足 要求) 按键2 白炽灯关闭,亮度0%(基本要满足 求) 按键3 白炽灯打开,亮度 60% (基本满足 要求) 按键4 白炽灯打开,亮度 30%(基本满足 要求) 按键5 按着按键白炽灯渐变暗,松开满足 按键后亮度为当前松开按键时的亮度(发挥部分) 按键6 按着按键白炽灯渐变亮,松开满足 按键后亮度为当前松开按键时的亮度 (发挥部分) 表2 按键功能及对应调光效果

6.2 存在的问题与改进措施

(1)同步触发信号比较难以实现,实现多路分别控制十分有难度。 (2)光敏传感器是非线性的,用A/D转换器采样显示的时候比较难以做到很精确,只能得到近似值。

七、总结

通过本次课程设计,我们对不仅对电力电子这门课有了更多的了解,而且基

7

本锻炼我们使用电力电子器件和单片机的能力。学会了初步的电子仿真设计。锻炼了自己的思考能力和创新能力。自己对电路的设计和看课本上的电路感觉完全不同,在设计过程中要考虑很多的因素,比如器件的选择要考虑到参数,还要看软件中的元件库中有没有此元件,还要通过查资料了解元件的结构和原理。在仿真过程中会有一些错误,所以需要分步分析电路的错误,因此而学会了如何对电路进行分析测试的方法,并想办法加以改正。同时也一定程度上掌握了单片机方面的控制思想,对我们以后学习的过程中会有很大的帮助。

八、参考文献

[1] 李玉梅.基于MCS-51系列单片机原理的应用设计.国防工业出版社 [2] 谢自美.电子线路设计实验测试.武汉:华中科技大学出版社,2002. [3] 全国大学生电子设计大赛获奖作品选编.北京:北京理工大学出版社,2001.

[4] 第六届全国大学生电子设计竞赛获奖作品选编.北京:北京理工大学出版社,2003.

[5]张兴.电力电子技术. 北京:科学出版社,2010.

九、附录:

1:整体实物图

8

图13 熄灭状态实物图

图14 60%光强度状态的实物图 2:程序代码

#include #include #include #include \"Data_def.h\" #include \"Delay.h\" #include \"128.h\" #include \"ds1302.h\" #include \"DS18B20.h\"

bit ReadTimeFlag;//定义读时间标志 #define T1MS (65536-1000) //定时1ms sbit OUT1= P1^2;//第一路触发信号输出

sbit K1= P2^0;//8个触摸按键定义 为高电平是表示有键按下 sbit K2= P2^1; sbit K3= P2^2; sbit K4= P2^3; sbit K5= P2^4; sbit K6= P2^5; sbit K7= P2^6; sbit K8= P2^7;

9

sbit IRIN = P3^2; //红外接收器数据线

uint count1,count2;//两路延时计数器 uint num1,num2;//两路预置参考值 uchar IRCOM[7];//存放红外数据

uchar flag1;//两路选择标志 0时第一路 1时第二路 uchar i=0;

void exint_init()//外部中断初始化 {

//INT1由过零触发信号触发 IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿) EX0 = 1; //使能INT0中断 //INT0由遥控器触发 IT1 = 1; EX1 = 1; EA = 1; }

void timer_init()//定时器初始化 { AUXR &= 0x3f; //定时器0和定时器1为1T模式

TMOD = 0x00; //设置定时器为模式0(16位自动重装载) TL0 = T1MS; //初始化计时值 TH0 = T1MS>>8; TL1 = T1MS; //初始化计时值 TH1 = T1MS >> 8;

ET0 = 1; //使能定时器0中断 EA = 1; }

void data_init() { count1=0; OUT1=1; flag1=0; num1=7; }

void delay(void) //140us,为红外准备 { uchar i,j; i = 2;

10

j = 159; do { while (--j); } while (--i); }

void exint0() interrupt 0 //INT0中断入口,控制红外 {

unsigned char j,k,N=0; EX0 = 0; delay(); if (IRIN==1) { EX0 =1; return; }//确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 { delay(); } while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 { delay(); } for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (!IRIN) //等 IR 变为高电平 { delay(); }

while (IRIN) //计算IR高电平时长 { delay(); N++; if (N>=15) { EX0=1; return; } //0.14ms计数过长自动离开。

11

} //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) { IRCOM[j] = IRCOM[j] | 0x80; } //数据最高位补“1” N=0; }//end for k }//end for j

if (IRCOM[2]!=~IRCOM[3]) { EX0=1; return; }

IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位

IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位

if(IRCOM[6]==0&&IRCOM[5]==12) { num1=3; Display_str(2,4,\"100%亮度\"); }

if(IRCOM[6]==1&&IRCOM[5]==8) { num1=4; Display_str(2,4,\" 60%亮度\"); }

if(IRCOM[6]==5&&IRCOM[5]==14) { num1=6; Display_str(2,4,\" 30%亮度\"); }

if(IRCOM[6]==0&&IRCOM[5]==8) { num1=8; Display_str(2,4,\"熄灭状态\"); }

if(IRCOM[6]==1&&IRCOM[5]==12) { num1=3; Delay_ms(100);

12

while(num1<7) { num1++; Delay_ms(100); Display_str(2,4,\"逐渐变暗\"); } } if(IRCOM[6]==5&&IRCOM[5]==10) { num1=8;

Delay_ms(20); while(num1>3) { num1--; Delay_ms(20); Display_str(2,4,\"逐渐变亮\"); } } EX0 = 1; }

void exint1() interrupt 2 //INT1中断入口,输出触发信号 {

TR0 = 1; }

void timer0() interrupt 1 //定时器中断 { count1++; if(count1>=num1) { if(num1!=10) { count1=0; OUT1=0; Delay_ms(1); OUT1=1; } TR0 = 0; }

13

}

void keyprocess() { if(K8)//100%亮度 { num1=2; Display_str(2,4,\"100%亮度\"); } if(K2)//80%亮度 { num1=3; Display_str(2,4,\" 80%亮度\"); } if(K3)//60%亮度 { num1=5; Display_str(2,4,\" 60%亮度\"); }

if(K4)//20%亮度 { }

if(K5)//扫描 逐渐变暗 { num1=3; Delay_ms(2000); while(num1<8) { num1++; Delay_ms(2000); Display_str(2,4,\"逐渐变暗\"); }

num1=7;

Display_str(2,4,\" 20%亮度\");

14

}

if(K6)//扫描 逐渐变亮 { num1=8; Delay_ms(2000); while(num1>3) { num1--; Delay_ms(2000); Display_str(2,4,\"逐渐变亮\"); } }

if(K7)//20%亮度 { num1=8; Display_str(2,4,\"熄灭状态\"); } }

void Display() {

uint temp_data,TempDec; write_LCD_cmd(0x93); write_LCD_dat(temp_data/100+0x30); write_LCD_dat(temp_data%100/10+0x30); write_LCD_dat(temp_data%10+0x30); write_LCD_dat('.'); write_LCD_dat(TempDec/1000+0x30); write_LCD_dat(TempDec%1000/100+0x30); write_LCD_dat(TempDec%100/10+0x30); write_LCD_dat(TempDec%10+0x30); }

void main() {

LCD_init(); Ds1302_Init(); data_init(); exint_init();

15

timer_init(); Display_str(0,0,\"遥控调光控制系统\"); Display_str(1,0,\"室温:\"); Display_str(1,7,\"℃\"); Display_str(2,0,\"光照强度\"); Display_str(2,4,\" 10%亮度\"); Display_str(3,1,\"月\"); Display_str(3,3,\"日\"); while(1) { Display();

keyprocess();//触摸按键函数调用 ReadTimeFlag=1;//ds1302时间调用 if(ReadTimeFlag==1) {

ReadTimeFlag=0; Ds1302_Read_Time();

display1(time_buf1[4]); //时 display2(time_buf1[5]); //分 display3(time_buf1[6]); //秒 if((time_buf1[4]==8)&&(time_buf1[5]==24)&&(time_buf1[6]==00)) { num1=8; } display4(time_buf1[2]); //月 display5(time_buf1[3]); //日 } } }

16

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务