硬件设计
上一篇咱们讲了基于数码管显示的智能窗帘,本篇讲一下基于LCD1602显示,MCU同样采用的是51单片机。具体设计如下。
仿真图1:
A. 由LCD1602作为显示器,6个按键控制手动自动模式以及启停等设置;
B. ADC0832作为ADC,ULN2803作为驱动IC,LED指示此时的模式;
仿真图2:
A. 由LCD1602作为显示器,按键控制设置,具有时间显示,温度显示以及模拟烟雾;
B. ADC0832作为ADC,ULN2003作为驱动IC,LED指示此时的模式,烟雾按下触发蜂鸣器报警;
仿真图3:
A. 由LCD1602作为显示,具有DS1302时间显示,6个按键设置相关参数,电位器模拟光强,两个电机模拟窗帘,具有手动和自动两种模式;
仿真图1程序设计
#include<reg51.h>
#include"delay.h"
#include"lcd602.h"
#include"adc0832.h"
/*****************************数组定义*******************************/
uchar code tab1[]={"Now_G: "}; //
uchar code tab5[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xff7,0xf6}; //1-2励磁顺序表 //半步
/************************端口定义**************************/
sbit k1 = P2^0; // 手-正
sbit k2 = P2^1; // 手-反
sbit k3 = P2^2; // 手-停
sbit k4 = P2^3; // 自-上
sbit k5 = P2^4; // 自-下
sbit led = P3^3; // 自-手-lED
sbit k6 = P3^4; // 自-手
/************************变量定义*****************************/
uint sec,min,h; //BCD码格式
int second,minute,hour; //十进制
double youliang = 0;
uchar i = 0;
bit flag = 0; //暂停开始标志
bit flag1 = 0; //正反转标志
bit flag2 = 0;
bit flag3 = 0;
bit mode = 1;
/*************************按键*******************************/
void key()
{
if(k1==0)
{
delayxms(5);
while(k1==0);
flag1 = 0; flag = 1;
write_zifu(1,15,'Z');
}
if(k2==0)
{
delayxms(5);
while(k2==0);
flag1 = 1; flag = 1;
write_zifu(1,15,'F');
}
if(k3==0)
{
delayxms(5);
while(k3==0);
flag = 0;
}
}
void key1()
{
if(k4==0)
{
delayxms(5);
while(k4==0);
flag = 0;
write_zifu(1,15,'T');
flag2 = 1; flag3 = 0;
}
if(k5==0)
{
delayxms(5);
while(k5==0);
flag = 0;
write_zifu(1,15,'T');
flag2 = 0; flag3 = 1;
}
}
/*******************定时器T0初始化********************/
void T0_init()
{
TMOD=TMOD | 0x01; //设T0为方式1
TH0=(65535-50000)/256; //计数50000个
TL0=(65535-50000)%256;
EA=1; //开启总中断
ET0=1; //允许T0中断
//TR0=1; //启动
}
/**************************************************************
主程序
**************************************************************/
void main()
{
chushihua(); //LCD1602初始化
write_string(1,0,tab1);
T0_init();
while(1)
{
/*自动和手动判断*/
if(k6==0)
{
delayxms(5);
while(k6==0);
mode = ~mode;
}
/*重力计算 0-100*/
youliang = adc0832()/2.55;
write_num3(1,7,youliang); //重力显示
/*手动模式*/
if(mode == 1)
{
flag2 = 0; flag3 = 0;
led = 1; //LED关
key(); //按键检测
if(flag == 0)
{TR0 = 0; write_zifu(1,15,'T');}
else
{TR0 = 1;}
}
/*自动模式*/
if(mode == 0)
{
led = 0; //LED开
key1(); //按键检测
if(flag == 0)
{TR0 = 0;}
else
{TR0 = 1;}
/*根据重力判断正反转*/
if(youliang > 50 && flag2 == 0) //正转
{
flag = 1; flag1 = 0;
write_zifu(1,15,'Z');
}
if(youliang <= 50 && flag3 == 0) //反转
{
flag = 1; flag1 = 1;
write_zifu(1,15,'F');
}
if(flag == 0)
{TR0 = 0;}
else
{TR0 = 1;}
}
}
}
/**************************定时器T0中断服务函数************************************/
void T0_time() interrupt 1
{
TR0 = 0;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
if(i > 7)
{i = 0;}
if(flag1 == 0)
{P1 = tab5[i];} //正转
else
{P1 = tab5[7-i];} //反转
i += 1;
TR0 = 1;
}
附:http://www.jh-tec.cn/archives/7121