|
這是我做的仿真,如有不足,還請(qǐng)大家指出。謝謝各位。文件中包含protues仿真、程序。
protues仿真圖
單片機(jī)源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define yi 0x80 //LCD第一行的初始位置,因?yàn)長(zhǎng)CD1602字符地址首位D7恒定為1(100000000=80)
- #define er 0x80+0x40 //LCD第二行初始位置(因?yàn)榈诙械谝粋(gè)字符位置地址是0x40)
- uchar display_digit[]={0,0,0};
- uchar yuzhi[]={0,0,0};
- uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正轉(zhuǎn) 電機(jī)導(dǎo)通相序 D-C-B-A
- uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反轉(zhuǎn) 電機(jī)導(dǎo)通相序 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; //液晶指令/數(shù)據(jù)輸入控制
- 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為窗簾關(guān)閉
- uchar zhuangtai=1;//1為窗簾打開,0為窗簾關(guān)閉
- 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; //啟動(dòng)AD轉(zhuǎn)換
- delay(1);
- W_R=1;
- C_S=1;
- delay(10);
- P1=0xff; //讀取AD轉(zhuǎn)換值前,先把P1口置1
- C_S=0;
- R_D=0; //AD讀使能
- delay(1);
- adval=P1; //把AD轉(zhuǎn)換好的值,賦給 adval
- R_D=1;
- C_S=1; //置1后,為下次AD轉(zhuǎn)換做準(zhǔn)備
- delay(1);
-
- display_digit[0]=adval/100;
- display_digit[1]=adval%100/10; //取得十位數(shù)字
- display_digit[2]=adval%10; //取得個(gè)位數(shù)字
- }
- void write_1602com(uchar com)
- {
- rs=0; //數(shù)據(jù)/指令選擇置為指令
- rw=0; //讀寫選擇置為寫
- P0=com; //送入數(shù)據(jù)
- delay(1);
- en=1; //拉高使能端,為制造有效的下降沿做準(zhǔn)備
- delay(1);
- en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
- }
- void write_1602dat(uchar dat)
- {
- rs=1; //數(shù)據(jù)/指令選擇置為數(shù)據(jù)
- rw=0; //讀寫選擇置為寫
- P0=dat; //送入數(shù)據(jù)
- delay(1);
- en=1; //en置高電平,為制造下降沿做準(zhǔn)備
- delay(1);
- en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
- }
- void write_1602str(uchar *s) //寫字符串
- {
- while(*s)
- {
- write_1602dat(*s++);
- }
- }
- void lcd_init()
- {
- write_1602com(0x38); //設(shè)置液晶工作模式,
- write_1602com(0x0c); //開顯示不顯示光標(biāo)
- write_1602com(0x06); //整屏不移動(dòng),光標(biāo)自動(dòng)右移
- write_1602com(0x01); //清顯示
- delay(5);
- write_1602com(yi+5); //固定符號(hào)從第一行第1個(gè)位置之后開始顯示
- 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]); //數(shù)字+30得到該數(shù)字的LCD1602顯示碼
- delay(5);
- write_1602dat(0x30+display_digit[2]); //數(shù)字+30得到該數(shù)字的LCD1602顯示碼
- delay(5);
- write_1602str(" "); //數(shù)字+30得到該數(shù)字的LCD1602顯示碼
- delay(5);
- }
- if(display_digit[0]!=0)
- {
- write_1602dat(0x30+display_digit[0]);
- delay(5);
- write_1602dat(0x30+display_digit[1]); //數(shù)字+30得到該數(shù)字的LCD1602顯示碼
- delay(5);
- write_1602dat(0x30+display_digit[2]); //數(shù)字+30得到該數(shù)字的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);//轉(zhuǎn)速調(diào)節(jié)
- }
- }
- 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);//轉(zhuǎn)速調(diào)節(jié)
- }
- }
- 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(); //調(diào)用液晶屏初始化子函數(shù)
- while(1)
- {
- key();
- qiangdushuzhi();
- display();
- yunxing();
- }
- }
復(fù)制代碼
所有資料51hei提供下載,用Proteus8.8才能打開:
智能窗簾設(shè)計(jì).rar
(88 KB, 下載次數(shù): 645)
2019-6-26 13:03 上傳
點(diǎn)擊文件名下載附件
包含仿真圖和程序
|
評(píng)分
-
查看全部評(píng)分
|