文章目录
- 功能演示:
- 前置要求:
- 主要功能:
- 主要模块:
- 主函数代码:
具体的仿真程序和代码程序已经免费放置在资源中,如有需要,可以下载进行操作。
功能演示:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="fQrJmn2B-1717310992221" src="https://live.csdn.net/v/embed/395273"></iframe>前置要求:
编译软件:Keil C51 uvision5.27
仿真软件:Proteus 8.13
主要器件:
- 数码管:1个
- 光敏电阻:1个
- TLC2543ADC芯片:1个
- 步进电机(六线四相):1个
- LED灯:1个
- 按钮:3个
- 开关:2个
主要功能:
实现智能百叶窗的控制,具体功能:数码管显示测量结果光强,设置三个按键:手动/自动切换、手动正转和手动反转,用一个发光二极管显示手动/自动状态,自动状态时设置一个发光二极管点亮。创新:设置两个极限位置保护行程开关,用于保护百叶窗叶片。当压下正转行程开关时,电机停止正转,但还可以反转;当反转到极限位置压下行程开关时,电机停止反转,但还可以正转。
主要模块:
-
模数转换模块:
光敏电阻传感器可以用于测量光强,然后使用TLC2543 ADC将获取的光强模拟量转换为数字量,便于之后操作。
-
按键扫描模块
三个按键用于手动/自动切换、手动正转和手动反转,使用户可以手动控制百叶窗。
使用LED来显示手动/自动状态,灯灭为手动状态,灯亮为自动状态。
按下正转行程开关时,无法正转,但反转可以进行;
按下反转行程开关时,无法反转,但正转可以进行。
-
电机驱动模块
自动状态时,通过光强大小自动控制电机转向。
光强越大,电机正转以完成遮阳效果。正转时,百叶窗会一直下放,直到完全遮住。
光强越小,电机反转以完成照光效果。反转时,百叶窗会一直上升,直到完全展开。
手动状态时,则通过正反转按键实现控制电机转向。
-
光强显示模块
将转换后的数字量显示在四位数码管上,这样可以实时监测周围光照情况。
主函数代码:
#include "reg51.h"
#include "Delay.h"
#include "Motor.h"
#include "SegShow.h"
#include "TLC2543ADC.h"
#include "KeyScan.h"
void Init(void);
// 最终光强数据
unsigned int value = 0;
// 记录百叶窗的位置,初始时完全折叠
unsigned int book = 0;
// 用于标志 手动/自动状态
unsigned int flag = 1;
void main(void)
{
Init();
while (1)
{
KeyScan();
}
}
void Int1() interrupt 2
{
flag = ~flag;
}
// 定时器0中断服务程序
void Timer0_ISR() interrupt 1 {
// 每次定时器中断发生时,延时计数器递减
TH0 = (65536 - 50000) / 256; // 设置定时器0初值
TL0 = (65536 - 50000) % 256; // 设置定时器0初值
value = TLC2543_Getdata(0x10);
SEG_SHOW(value);
}
void Init(void)
{
/* 初始化中断 */
EA = 1;
EX1 = 1;
IT1 = 1;
/* 初始化为手动模式(灯灭)*/
led = 0;
/* 初始化定时器0 */
TMOD = 0x01; // 设置定时器0为模式1
TH0 = (65536 - 50000) / 256; // 设置定时器0初值
TL0 = (65536 - 50000) % 256; // 设置定时器0初值
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
}
标签:定时器,正转,反转,void,手动,51,百叶窗,单片机,光强
From: https://blog.csdn.net/hdz_wiz_csdn/article/details/139378791