实验三 简易航标灯设计实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【1. 实验目的和要求】
(1)掌握定时器/计数器原理及其应用;
(2)了解航标灯控制要求;
【2. 实验工具与软件】
计算机、Keil uVision4集成开发环境、Proteus 8 Professional仿真软件
【3.主要原理和方法步骤】
(1)任务说明
➢2位拨码开关:灯质设定(频率与占空比)
拨码状态1 状态2 状态3
亮暗亮暗亮暗
0 全亮
1 0.5S 1.5S 0 0 0 0
2 0.5S 0.5S 0.5S 3.5S 0 0
3 0.5S 1S 0.5S 1S 0.5S 2.5S
➢灯驱动:发光二极管采用12V供电,要实验单片机驱动电路设计,三极管驱动。
➢要求:通过光敏电阻采集光照度,白天灯熄灭,黑夜灯按照上表闪烁。
(2)仿真电路原理图
(3)程序流程图
(4)实例代码及注释分析
#include "reg51.h"
#define COUNT_50MS 500 //focs=12MHz T=1us 50ms gcd:50ms的倍数
#define D_OPEN 1 //开灯
#define D_CLOSE !D_OPEN //关灯
sbit D = P0 ^ 0; //灯输出控制,高电平有效
sbit OPCON = P1 ^ 2; //光照检测,低电平有效(晚上)
sbit Key0 = P1 ^ 0;
sbit Key1 = P1 ^ 1;
unsigned int State[6];
struct IALA //结构体类型声明1
{ unsigned char gcd; //各时间间隔最大公约数
unsigned char state[6]; //无符号字符型时间常数
};
struct IALA code IALA4[4] = { //结构体全局变量定义,code:常数
{ 0, 0, 0, 0, 0, 0, 0},
{10, 1, 3, 0, 0, 0, 0},
{10, 1, 1, 1, 7, 0, 0},
{10, 1, 2, 1, 2, 1, 5}};
void T0_Init(void) //T0_初始化函数
{
TMOD = (TMOD & 0xf0) | 0x01;
TH0 = (65536 - COUNT_50MS) / 256;
TL0 = (65536 - COUNT_50MS) % 256;
ET0 = 1; //中断使能
EA = 1;
TR0 = 1; //T0启动
}
//T0_ISR程序
unsigned int it = 0;
void T0_ISR(void) interrupt 1
{
unsigned char j;
TH0 = (65536 - COUNT_50MS) / 256;
TL0 = (65536 - COUNT_50MS) % 256;
if(OPCON==0) //黑夜、暗照度
{
it++;
for(j = 0; j < 6; j++)
{ if(it == State[j])
D = (j % 2) ? D_OPEN : D_CLOSE; //判断是开灯还是关灯状态
}
if(it >= State[5])
{
it = 0;
}
}
else
D = 0;
}
unsigned char GetKey()//按键判断
{
unsigned char key;
if(Key1 == 0 && Key0 == 0)
key = 0;
else if(Key1 == 0 && Key0 == 1)
key = 1;
else if(Key1 == 1 && Key0 == 0)
key = 2;
else if(Key1 == 1 && Key0 == 1)
key = 3;
return(key);
}
void main(void)
{
unsigned char key, pre_key = 0, i;
unsigned int sum;
T0_Init();
D = 1;
while(1)
{
key = GetKey(); //获取key1、Key0特征码
if(key != pre_key) //若有新的按键,载入控灯时间
{
sum = 0;
for(i = 0; i < 6; i++)
{
sum = sum + IALA4[key].gcd * IALA4[key].state[i];
State[i] = sum;
}
}
pre_key = key;
}
}
【4. 数据记录】
(1)点击运行开始仿真按键时,若将灯泡点亮模拟白天的情况,则无论将拨码开关调到什么状态,发光二极管均处于熄灭状态,如下图所示:
(2)将灯泡熄灭模拟夜晚的情况,并将拨码开关调到拨码0,发光二极管将处于全亮状态,如下图所示:
(3)将灯泡熄灭模拟夜晚的情况,并将拨码开关调到拨码1,发光二极管以亮0.5S、灭1.5S闪烁显示,如下图所示:
(4)将灯泡熄灭模拟夜晚的情况,并将拨码开关调到拨码2,发光二极管以亮0.5S、灭0.5S、亮0.5S、灭3.5S闪烁显示,如下图所示:
(5)将灯泡熄灭模拟夜晚的情况,并将拨码开关调到拨码3,发光二极管以亮0.5S、灭1S、亮0.5S、灭1S、亮0.5S、灭2.5S闪烁显示,如下图所示:
【5. 实验思考与小结】
通过本次实验,我了解了定时器的各种工作方式和定时器/计数器的使用和编程方法,为进一步学习打下基础。
还了解了怎么去控制航标灯,通过寻找时间周期的公倍数,将发光二极管根据不同的亮灭时间要求进行闪烁,通过示波器可以让我们很清楚的看出实验效果,同时也可以利用示波器为我们找出实验中的错误;以及怎么去设计电路,通过光敏电阻来模拟白天和夜晚,本次实验让大开眼界,收获颇多,希望在以后的实验中能有更多的收获!
评语:
教师:
日期:。