這是我做的仿真,如有不足,還請大家指出。謝謝各位。文件中包含protues仿真、程序。
51hei.png (37.43 KB, 下載次數: 63)
下載附件
2021-4-10 02:54 上傳
a.png (68.96 KB, 下載次數: 100)
下載附件
protues仿真圖
2019-6-26 12:56 上傳
單片機源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define yi 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
- #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)
- uchar display_digit[]={0,0,0};
- uchar yuzhi[]={0,0,0};
- uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正轉 電機導通相序 D-C-B-A
- uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反轉 電機導通相序 A-B-C-D
- sbit R_D=P2^0;
- sbit W_R=P2^1;
- sbit C_S=P2^2;
- sbit Up=P2^3;
- sbit Down=P2^4;
- sbit rw=P2^5; //液晶讀寫端
- sbit rs=P2^6; //液晶指令/數據輸入控制
- sbit en=P2^7; //液晶使能端
- sbit AD_data=P1;
- sbit bianji=P3^4;
- sbit jia=P3^7;
- sbit jian=P3^6;
- uint adval;
- uint fazhi=180;
- uchar state=1;//1為窗簾打開,0為窗簾關閉
- uchar zhuangtai=1;//1為窗簾打開,0為窗簾關閉
- void Time_init()
- {
- EA=1;
- TMOD=0x11;
- TH0=0xf8;
- TL0=0xcc;
- ET0=1;
- TR0=0;
- }
- void delay(uint time)
- {
- uint x,y;
- for(x=time;x>0;x--)
- for(y=110;y>0;y--);
- }
- void qiangdushuzhi()
- {
- C_S=0;
- W_R=0; //啟動AD轉換
- delay(1);
- W_R=1;
- C_S=1;
- delay(10);
- P1=0xff; //讀取AD轉換值前,先把P1口置1
- C_S=0;
- R_D=0; //AD讀使能
- delay(1);
- adval=P1; //把AD轉換好的值,賦給 adval
- R_D=1;
- C_S=1; //置1后,為下次AD轉換做準備
- delay(1);
-
- display_digit[0]=adval/100;
- display_digit[1]=adval%100/10; //取得十位數字
- display_digit[2]=adval%10; //取得個位數字
- }
- void write_1602com(uchar com)
- {
- rs=0; //數據/指令選擇置為指令
- rw=0; //讀寫選擇置為寫
- P0=com; //送入數據
- delay(1);
- en=1; //拉高使能端,為制造有效的下降沿做準備
- delay(1);
- en=0; //en由高變低,產生下降沿,液晶執行命令
- }
- void write_1602dat(uchar dat)
- {
- rs=1; //數據/指令選擇置為數據
- rw=0; //讀寫選擇置為寫
- P0=dat; //送入數據
- delay(1);
- en=1; //en置高電平,為制造下降沿做準備
- delay(1);
- en=0; //en由高變低,產生下降沿,液晶執行命令
- }
- void write_1602str(uchar *s) //寫字符串
- {
- while(*s)
- {
- write_1602dat(*s++);
- }
- }
- void lcd_init()
- {
- write_1602com(0x38); //設置液晶工作模式,
- write_1602com(0x0c); //開顯示不顯示光標
- write_1602com(0x06); //整屏不移動,光標自動右移
- write_1602com(0x01); //清顯示
- delay(5);
- write_1602com(yi+5); //固定符號從第一行第1個位置之后開始顯示
- write_1602str("WELCOME");
- delay(1000);
- write_1602com(0x01);
- }
- void display( )
- {
- yuzhi[0]=fazhi/100;
- yuzhi[1]=fazhi%100/10;
- yuzhi[2]=fazhi%10;
- write_1602com(yi+0);
- write_1602str(" TARGET:");
- if(yuzhi[0]==0)
- {
- write_1602dat(0x30+yuzhi[1]);
- delay(5);
- write_1602dat(0x30+yuzhi[2]);
- delay(5);
- }
- if(yuzhi[0]!=0)
- {
- write_1602dat(0x30+yuzhi[0]);
- delay(5);
- write_1602dat(0x30+yuzhi[1]);
- delay(5);
- write_1602dat(0x30+yuzhi[2]);
- delay(5);
- }
- write_1602com(er+0); //er是頭文件寫的值0x80+0x40
- delay(5);
- write_1602str("CURRENT:");
- delay(5);
- if(display_digit[0]==0)
- {
- write_1602dat(0x30+display_digit[1]); //數字+30得到該數字的LCD1602顯示碼
- delay(5);
- write_1602dat(0x30+display_digit[2]); //數字+30得到該數字的LCD1602顯示碼
- delay(5);
- write_1602str(" "); //數字+30得到該數字的LCD1602顯示碼
- delay(5);
- }
- if(display_digit[0]!=0)
- {
- write_1602dat(0x30+display_digit[0]);
- delay(5);
- write_1602dat(0x30+display_digit[1]); //數字+30得到該數字的LCD1602顯示碼
- delay(5);
- write_1602dat(0x30+display_digit[2]); //數字+30得到該數字的LCD1602顯示碼
- delay(5);
- }
- if(zhuangtai==1)
- {
- write_1602com(yi+12);
- write_1602str("OPEN");
- }
- if(zhuangtai==0)
- {
- write_1602com(er+11);
- write_1602str("CLOSE");
- }
- }
- void zhengzhuan(uchar step) //上升
- {
- uchar i,j,k;
- if(zhuangtai==0)
- {
- write_1602com(0x01);
- write_1602com(yi+6);
- write_1602str("UP");
- k=20*step;
- for(j=0;j<k;j++)
- {
- for(i=0;i<4;i++)
- {
- P3=phasecw[i];
- delay(10);//轉速調節
- }
- }
- P3=0xf1;
- zhuangtai=1;
- }
- }
-
- void fanzhuan(uchar step) //下降
- {
- uchar i,j,k;
- if(zhuangtai==1)
- {
- write_1602com(0x01);
- write_1602com(yi+6);
- write_1602str("DOWN");
- k=20*step;
- for(j=0;j<k;j++)
- {
- for(i=0;i<4;i++)
- {
- P3=phaseccw[i];
- delay(10);//轉速調節
- }
- }
- P3=0xf8;
- zhuangtai=0;
- }
- }
- void move(uchar level)
- {
- switch(level)
- {
- case 0:switch(state)
- {
- case 0:break;
- case 1:fanzhuan(10);break;
- }
- state=0;break;
- case 1:switch(state)
- {
- case 0:zhengzhuan(10);break;
- case 1:break;
- }
- state=1;break;
- }
- }
- void bijiao()
- {
- if(adval>=0&&adval<fazhi)
- move(0);
- if(adval>=fazhi&&adval<500)
- move(1);
- }
- void yunxing()
- {
- if(Down==1)
- {
- if(Up==1)
- {
- bijiao();
- }
- else if(Up==0)
- {
- zhengzhuan(10);
- }
- }
- else if(Down==0)
- {
- fanzhuan(10);
- }
- }
- void key()
- {
- if(bianji==0)
- {
- write_1602com(yi+0);
- write_1602str("ORIGINAL:");
- if(yuzhi[0]==0)
- {
- write_1602dat(0x30+yuzhi[1]);
- delay(5);
- write_1602dat(0x30+yuzhi[2]);
- delay(5);
- }
- if(yuzhi[0]!=0)
- {
- write_1602dat(0x30+yuzhi[0]);
- delay(5);
- write_1602dat(0x30+yuzhi[1]);
- delay(5);
- write_1602dat(0x30+yuzhi[2]);
- delay(5);
- }
- write_1602str(" ");
- delay(5);
- while(1)
- {
- yuzhi[0]=fazhi/100;
- yuzhi[1]=fazhi%100/10;
- yuzhi[2]=fazhi%10;
- write_1602com(er+0);
- write_1602str("SETTING:");
- if(yuzhi[0]==0)
- {
- write_1602dat(0x30+yuzhi[1]);
- delay(5);
- write_1602dat(0x30+yuzhi[2]);
- delay(5);
- }
- if(yuzhi[0]!=0)
- {
- write_1602dat(0x30+yuzhi[0]);
- delay(5);
- write_1602dat(0x30+yuzhi[1]);
- delay(5);
- write_1602dat(0x30+yuzhi[2]);
- delay(5);
- }
- if(jia==0)
- {
- delay(400);
- fazhi=fazhi+5;
- }
- if(jian==0)
- {
- delay(400);
- fazhi=fazhi-5;
- }
- if(bianji==1)
- {
- write_1602com(0x01);
- break;
- }
- }
- }
- }
- void main()
- {
- Time_init();
- delay(50);
- lcd_init(); //調用液晶屏初始化子函數
- while(1)
- {
- key();
- qiangdushuzhi();
- display();
- yunxing();
- }
- }
復制代碼
d.png (7.46 KB, 下載次數: 75)
下載附件
2019-6-26 13:01 上傳
c.png (9.45 KB, 下載次數: 71)
下載附件
2019-6-26 13:01 上傳
所有資料51hei提供下載,用Proteus8.8才能打開:
智能窗簾設計.rar
(88 KB, 下載次數: 645)
2019-6-26 13:03 上傳
點擊文件名下載附件
包含仿真圖和程序 下載積分: 黑幣 -5
|