硬件电路的设计
(末尾附文件)
系统的功能分析及体系结构设计
3.1.1系统功能分析
本设计由STC89C52单片机电路+光照检测电路(光敏电阻)+AD0832转换电路+4位高亮LED灯电路+按键电路+电源电路组成。
1、系统具有自动模式和手动模式,按模式键可以进行切换。手动模式下按加、减键可以手动调节台灯的亮度。
2、自动模式下通过光敏电阻采集外界光线的强弱,自动控制台灯的亮度,光线越强台灯越暗,光线越弱台灯越亮。
3、高亮LED灯,亮暗程度分为5档。
3.1.2系统总体结构
本系统具体框图如下图所示:
原理图:
ADC0832A/D转换电路设计
ADC0832是美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D 转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,
其目前已经有很高的普及率。学习并使用 ADC0832 可是使我们了解 A/D 转换器的原理,有助于我们单片机技术水平的提高。
一、ADC0832 具有以下特点:
(1)8 位分辨率;
(2)双通道 A/D 转换;
(3)输入输出电平与 TTL/CMOS 相兼容;
(4)5V 电源供电时输入电压在 0~5V 之间;
(5)工作频率为 250KHZ,转换时间为 32μS;
(6)一般功耗仅为 15mW;
(7)8P、14P—DIP(双列直插)、PICC 多种封装;
(8)商用级芯片温宽为0°C to +70°C,工业级芯片温宽为−40°C to +85°C;
光照检测电路设计
光敏电阻(photoresistor or light-dependent resistor,后者缩写为ldr)或光导管(photoconductor),常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。
本系统选择光敏电阻作为检测光照的器件,光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低,亮电阻值可小至1KΩ以下。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ。光敏电阻的特殊性能,随着科技的发展将得到极其广泛应用。在本设计中,通过串联一个电阻实现光敏电阻的分压,电阻为分压电阻,同时也保护光敏电阻。
其原理图如下图所示。
按键电路设计
轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。在本系统中,按键作为系统的输入,起到了人机交互的枢纽作用。按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。其电路原理图如下图所示。
高亮LED灯照明电路(低电平有效)设计
超高亮LED是比一般LED发光二极管的亮度高近百倍的新型LED,其外壳是无色透明树脂封装,其发光体本身就能发出某一波长的光,从而呈现出某一种颜色。在本设计中,选择白色高亮LED灯作为照明灯使用。
一、白色高亮LED灯的优点。
(1)寿命长,可靠耐用,维护费用极为低廉,可连续使用105h,比普通白炽灯泡长100倍;
(2)高效率,其发光效率可达80%~90%,LED比节能灯还要节能1/4;
(3)点亮速度快。
在本设计中, LED灯均为高亮LED灯,通过三极管驱动LED灯的亮灭,电阻为限流电阻,保护三极管。当单片机的控制引脚为低电平时,三极管导通,此时,高亮LED灯亮。否则,高亮LED灯不亮。 高亮LED灯照明电路原理图如下图所示。
系统软件设计
#include <reg52.h> //调用单片机头文件
#include "delay.h"
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#define ADW00 0x00
#define ADW01 0x01
#define ADW02 0x02
#define ADW03 0x03
#define ADW04 0x04
#define ADW05 0x05
#define INIT 0xff
sbit SCL=P2^2; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P2^3; //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P2^0; //CS定义为P1口的第4位脚,连接ADC0832CS脚
sbit red = P1^4; //红色指示灯
sbit td_led = P3^5; //台
uchar f_pwm_l ; //越小越亮
bit flag_moshi;
uchar dangwei=0; //档位
uchar guangxian; //光线的显示变量
uchar ADangWei=INIT;
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********读数模转换数据********************************************************/
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
// 1 1 0 通道
// 1 1 1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //开始
SCL=1; //第一个上升沿
SCL=0;
DO=SGL;
SCL=1; //第二个上升沿
SCL=0;
DO=ODD;
SCL=1; //第三个上升沿
SCL=0; //第三个下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //开始从第四个下降沿接收数据
value=value<<1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校验数据
value1>>=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
SCL=1;
DO=1;
CS=1;
if(value==value1) //与校验数据比较,正确就返回数据,否则返回0
return value;
return 0;
}
uchar key_can;
/********************独立按键程序*****************/
void key()
{
static uchar key_new;
key_can = 20;
if((P2 & 0xf0) != 0xf0) //按键按下
{
DelayMs(5);
if(((P2 & 0xf0) != 0xf0) && (key_new == 1)) //按键检测防止重复
{
key_new = 0;
switch(P2 & 0xf0)
{
case 0xb0: key_can = 1; break; //左边第1个
case 0xd0: key_can = 2; break; //左边第2个
case 0xe0: key_can = 3; break; //左边第3个
}
}
}
else
key_new = 1;
}
链接:https://pan.baidu.com/s/1c4OZHerU5TYpH3TkYAXhOw
提取码:i3s1