这是我做的仿真,如有不足,还请大家指出。谢谢各位。文件中包含protues仿真、程序。
protues仿真图
单片机源程序如下:
- #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();
- }
- }
复制代码
所有资料51hei提供下载,用Proteus8.8才能打开:
智能窗帘设计.rar
(88 KB, 下载次数: 645)
|