Altium Designer畫的單片機智能窗簾原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機源程序如下:
- #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 上傳
點擊文件名下載附件
|