标题:
51单片机智能窗帘设计 有程序和硬件电路图PCB
[打印本页]
作者:
qq250076737
时间:
2020-4-7 12:17
标题:
51单片机智能窗帘设计 有程序和硬件电路图PCB
Altium Designer画的单片机智能窗帘原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png
(27.79 KB, 下载次数: 45)
下载附件
2020-4-7 15:28 上传
51hei.png
(55.58 KB, 下载次数: 46)
下载附件
2020-4-7 15:28 上传
单片机源程序如下:
#include <reg51.h>//51头文件
#include<INTRINS.h>
#define uchar unsigned char
#define uint unsigned int //变量宏定义
#define ulong unsigned long //变量宏定义
uchar count,s1num,shi2=0,fen2=0,shi3=10,fen3=10;//全局变量
uchar miao,fen,shi;//时间变量
uchar c,v,l,i;
ulong AD_ad1,AD_ad2;
float JiZhun_AD=2.5;
float AD_Data=0.0;
ulong AD_ad=0;
uchar dianji;
sbit rs = P0^5;//数据,命令选择端(H/L)
sbit rw = P0^6;//读,写选择端(H/L)
sbit e = P0^7;//使能信号
sbit CLOCK = P1^1; //lcd
sbit D_IN = P1^2; //lcd
sbit D_OUT = P1^3; //lcd
sbit _CS = P1^4; //lcd
sbit menu = P1^0; //按键//P1^3
sbit add = P1^7; //按键//P1^4
sbit cut = P1^5; //按键
sbit yes = P1^6; //按键
sbit ma = P3^0; //步进电机
sbit mb = P3^1; //步进电机
sbit mc = P3^2; //步进电机
sbit md = P3^3; //步进电机
sbit led1 = P3^4; //LED1
sbit led2 = P3^5; //LED2
sbit spek = P3^6; //SPEK
uchar code table[]="shut-00:00|ray:0";
uchar code table1[]="open-00:00|00:00";//数据字符表
uchar data display[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//显示单元后台数据,1分2时现在时间,5分6时关闭时间,3分4时打开时间,7亮度级数 //
//****************延时*****************
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ;
}
//****************写液晶指令*****************
void write_com(uchar com)
{
rs=0;
e=0;
P2=com;
delay(5);
e=1;
delay(5);
e=0;
}
//****************液晶数据*****************
void write_date(uchar date)
{
rs=1;
e=0;
P2=date;
delay(5);
e=1;
delay(5);
e=0;
}
//****************初始化液晶定时器************
void init() //
{
uchar num;
rs=0;
rw=0;
e=0;//锁存关闭
write_com(0x38);
delay(5);
write_com(0x0c);//
delay(5);
write_com(0x06);
delay(5);
write_com(0x01);
write_com(0x80);//第一行开始写
for(num=0;num<16;num++)
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40);//第二行前一部分,也就是时间开始写
for(num=0;num<16;num++)
{
write_date(table1[num]);
delay(20);
}
TMOD=0x01;//定时器0的方式1
TH0=(65536-50000)/256;//求模
TL0=(65536-50000)%256;//取余
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//启动定时器
}
//****************地址数据变量**************
void write_sfm(uchar add, uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_sfn(uchar add, uchar date)
{
uchar si,g;
si=date/10;
g=date%10;
write_com(0x80+add);
write_date(0x30+si);
write_date(0x30+g);
}
//****************按键函数*****************
void key()
{
if(c==8)c=0;
if(menu==0)
{
delay(50);
if(menu==0)
{
c++;spek=0;delay(50);
while(menu==0);spek=1;
}
}
if(add==0)
{
spek=0;delay(50);
while(add==0);
spek=1;
display[c]++;
write_sfm(14,display[1]);//分针位置
write_sfm(11,display[2]);//时针位置
}
if(cut==0)
{
spek=0;delay(50);
while(cut==0);
spek=1;
display[c]--;
}
if(yes==0)
{
spek=0;delay(50);
while(yes==0);
spek=1;
c=0;
}
write_sfm(14,display[1]);//现在分针位置
write_sfm(11,display[2]);//现在时针位置
write_sfm(8,display[3]);//打开分针位置
write_sfm(5,display[4]);//打开分针位置
write_sfn(8,display[5]);//关闭分针位置
write_sfn(5,display[6]);//关闭分针位置
write_com(0x80+15); //亮度级数
write_date(0x30+display[7]);//亮度级数位置
}
//****************步进电机函数*****************
void motorzen()
{
while(v)
{
led1=0;
ma=1,mb=0;mc=0;md=0;delay(3);
ma=0,mb=1;mc=0;md=0;delay(3);
ma=0,mb=0;mc=1;md=0;delay(3);
ma=0,mb=0;mc=0;md=1;delay(3);
}
led1=1;
}
void motorfan()
{
while(v&l)
{
led2=0;
ma=0,mb=0;mc=0;md=1;delay(3);
ma=0,mb=0;mc=1;md=0;delay(3);
ma=0,mb=1;mc=0;md=0;delay(3);
ma=1,mb=0;mc=0;md=0;delay(3);
}
led2=1;
}
//****************A/D*****************
uint read1543(uchar port)
{
uint ad;
uint i;
uchar al=0,ah=0;
CLOCK=0;
_CS=0;
port<<=4;
for (i=0;i<4;i++) //将四位通道地址送1543
{
D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;
port<<=1;
}
for (i=0;i<6;i++) //填6个CLOCK信号
{
CLOCK=1;CLOCK=0;
}
_CS=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
_CS=0; //等待AD转换结束
_nop_();_nop_();_nop_();
for (i=0;i<2;i++) //D9,D8
{
D_OUT=1;CLOCK=1;ah<<=1;
if (D_OUT) ah +=0x01;
CLOCK=0;
}
for (i=0;i<8;i++) //取出D7--D0
{
D_OUT=1;CLOCK=1;al <<= 1;
if (D_OUT)
al +=0x01;
CLOCK=0;
}
_CS=1;
ad = (uint)ah;
ad <<= 8;
ad +=(uint)al; //
return(ad);
}
//****************亮度测试*****************
void liangdu()
{
i++;
if(i==30)
{
i=0;
AD_ad1 = read1543(0); // (通道0电压正端)
AD_Data = ((float)AD_ad1)*JiZhun_AD*2/1024+0.005;//0.15经过实测需要加0.15减少误差
AD_ad =(AD_Data*100);
if(display[7]>AD_ad%100/10)
{
if(dianji==0)
{
spek=0;delay(50);spek=1;
motorzen();
dianji=1;
}
}
else
{
if(dianji==1)
{
spek=0;delay(50);spek=1;
motorfan();
dianji=0;
}
}
}
}
//****************主函数*****************
void main()
{
spek=0;delay(50);spek=1;
display[4]=8;
display[6]=20;
display[7]=50;
spek=1;
init();
while(1)
{
key();liangdu();
if(display[2]==display[4])//时间判断关闭窗帘
{
if(display[1]==display[3])//与打开时间一致动作
{
if(miao<5)
{
v=10;
spek=0;delay(50);spek=1;
motorzen();
}
}
}
if(display[2]==display[6])//时间判断关闭窗帘
{
if(display[1]==display[5])//与打开时间一致动作
{
if(miao<5)
{
v=10;
spek=0;delay(50);spek=1;
motorfan();
}
}
}
}
}
void timer0() interrupt 1 //定时器0中断服程序
{
TH0=(65536-50000)/256;//求模
TL0=(65536-50000)%256;//求佘
count++;//变量
if(count==20)//此处为时间基准调节,20为走一秒
{
count=0;
miao++;
if(v>0)
v--;
if(miao==60)
{
miao=0;
display[1]++;
if(display[1]==60)
{
display[1]=0;//display[0]现在时间分的存放点
display[2]++;
if(display[2]==24)//display[1]现在时间时的存放点
{
display[1]=0;
}
write_sfm(11,display[2]);//时针位置
}
write_sfm(14,display[0]);//分针位置
}
}
}
复制代码
所有资料51hei提供下载:
窗帘控制(陈 玲).rar
(1.23 MB, 下载次数: 53)
2020-4-7 12:16 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1