lcd1602显示,正转翻转停止显示高度;这个是花了100元买的.
基于51单片机做的国旗自动升降系统的proteus仿真原理图:
如果没有装KEIL软件
找到 .c .h结尾的文件即为程序。打开方式选择记事本打开
或者到开发资料里安装KEIL软件
单片机源程序如下:
#include #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include unsigned char code zheng[4]={0xfe,0xfd,0xfb,0xf7};//正转表格 unsigned char code fan[4]={0xf7,0xfb,0xfd,0xfe};//反转表格 uchar flag_start ; //启动标志位 1为起动步进电机 否则关闭电机 uchar flag_z_f; //正反标志位 0为顺时钟 1为逆时史上转 uchar flag_shudu = 1; //4种速度 0,1,2,3, bit flag_1s; uint flag_value; uchar time; uchar gaodu; sbit red = P3^2; //升期 指示灯 sbit green = P3^3; //旗停下指示灯 sbit yellow = P3^4; //降旗 指示灯 sbit rs=P1^4; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit rw=P1^5; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit e =P1^6; //片选信号 下降沿触发 sbit wx0 = P2^5; sbit wx1 = P2^6; sbit wx2 = P2^7; uchar key_can_wx; /***********************语音模块控制IO口的定义************************/ sbit VRST = P2^4; sbit VBUSY= P2^0; sbit VSDA = P2^1; sbit VCS = P2^2; sbit VSCL = P2^3; /******************1ms 延时函数*******************/ void delay_1ms(uint q) { uint i,j; for(i=0;i } void delay_us (unsigned int us) { while(us--) { _nop_(); } } /***********************三线发码子程序************************/ void Send_threelines(unsigned char addr) { unsigned char i; if(VBUSY == 1) { VRST=0; delay_1ms(5); VRST=1; delay_1ms(20); /* 复位拉高20ms*/ VCS=0; delay_1ms(5); /* 片选拉低5ms */ for(i=0;i<8;i++) { VSCL=0; if(addr&0x01) { VSDA=1; } else VSDA=0; addr>>=1; delay_us(150); /* 150us */ VSCL=1; delay_us(150); /* 150us */ } VCS=1; delay_1ms(200); } } /******************************************************************** * 名称 : delay_uint() * 功能 : 小延时。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_uint(uint q) { while(q--); } /******************************************************************** * 名称 : write_com(uchar com) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(3); e=1; delay_uint(25); e=0; } /******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write_data(uchar dat) { e=0; rs=1; rw=0; P0=dat; delay_uint(3); e=1; delay_uint(25); e=0; } /******************************************************************** * 名称 : write_string(uchar hang,uchar add,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 write_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void write_string(uchar hang,uchar add,uchar *p) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == ' for(j=0;j<120;j++);