me300实例-1602lcd显示步进电机键控正反转实验-c语言源代码
演示照片:
[演示程序(c51):]
/*****************************************************************/
/**
/*me300b单片机开发系统演示程序-1602lcd显示步进电机键控正反转实验*
#include//51芯片管脚定义头文件
#include//内部包含延时函数_nop_();
#defineucharunsignedchar
#defineuintunsignedint
#definedelaynop();{_nop_();_nop_();_nop_();_nop_();};
ucharcodeffw[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
ucharcoderev[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbitk1=p1^4;//运行与停止
sbitk2=p1^5;//设定圈数
sbitk3=p1^6;//方向转换
sbitk4=p1^7;//速率调整
sbitbeep=p3^7;//蜂鸣器
sbitlcd_rs=p2^0;
sbitlcd_rw=p2^1;
sbitlcd_en=p2^2;
biton_off=0;//运行与停止标志
bitdirection=1;//方向标志
bitrate_dr=1;//速率标志
bitsnum_dr=1;//圈数标志
ucharcodecdis1[]={steppingmotor};
ucharcodecdis2[]={controlprocess};
ucharcodecdis3[]={stop};
ucharcodecdis4[]={num:rate:};
ucharcodecdis5[]={running};
ucharm,v=0,q=0;
ucharnumber=0,number1=0;
ucharsnum=5,snum1=5;//预设定圈数
ucharrate=8;//预设定速率
uchardata_temp,data_temp1,data_temp2;
/********************************************************/
/*
/*延时t毫秒
/*11.0592mhz时钟,延时约1ms
/*
/********************************************************/
voiddelay(uintt)
{
uchark;
while(t--)
{
for(k=0;k<125;k++)
{}
}
}
/********************************************************/
voiddelayb(ucharx)//x*0.14ms
{
uchari;
while(x--)
{
for(i=0;i<13;i++)
{}
}
}
/********************************************************/
voidbeep()
{
ucharj;
for(j=0;j<100;j++)
{
delayb(4);
beep=!beep;//beep取反
}
beep=1;//关闭蜂鸣器
delay(170);
}
/********************************************************/
/*
/*检查lcd忙状态
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
/*
/********************************************************/
bitlcd_busy()
{
bitresult;
lcd_rs=0;
lcd_rw=1;
lcd_en=1;
delaynop();
result=(bit)(p0&0x80);
lcd_en=0;
return(result);
}
/********************************************************/
/*
/*写指令数据到lcd
/*rs=l,rw=l,e=高脉冲,d0-d7=指令码。
/*
/********************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
_nop_();
_nop_();
p0=cmd;
delaynop();
lcd_en=1;
delaynop();
lcd_en=0;
}
/********************************************************/
/*
/*写显示数据到lcd
/*rs=h,rw=l,e=高脉冲,d0-d7=数据。
/*
/********************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
p0=dat;
delaynop();
lcd_en=1;
delaynop();
lcd_en=0;
}
/********************************************************/
/*
/*lcd初始化设定
/*
/********************************************************/
voidlcd_init()
{
delay(30);
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);//显示开,关光标
delay(5);
lcd_wcmd(0x06);//移动光标
delay(5);
lcd_wcmd(0x01);//清除lcd的显示内容
delay(5);
}
/********************************************************/
/*
/*设定显示位置
/*
/********************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/********************************************************/
/*
/*lcd1602初始显示子程序
/*
/********************************************************/
voidlcd_init_dis()
{
delay(10);//延时
lcd_init();//初始化lcd
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis1[m]!='\0')
{//显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40);//设置显示位置为第二行第1个字符
m=0;
while(cdis2[m]!='\0')
{
lcd_wdat(cdis2[m]);//显示字符
m++;
}
delay(3000);//延时
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis3[m]!='\0')
{//显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40);//设置显示位置为第二行第1个字符
m=0;
while(cdis4[m]!='\0')
{
lcd_wdat(cdis4[m]);//显示字符
m++;
}
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);//显示方向符号
lcd_wdat(0x3e);
}
}
/********************************************************/
/*
/*数据转换子程序
/*
/********************************************************/
voiddata_conv()
{
data_temp1=data_temp/10;//高位
if(data_temp1==0)
{data_temp1=0x20;}//高位为0不显示
else
{data_temp1=data_temp1+0x30;}
data_temp2=data_temp%10;//低位
data_temp2=data_temp2+0x30;
}
/********************************************************/
/*
/*数据显示子程序
/*
/********************************************************/
voiddata_dis()
{
data_temp=snum;//显示圈数
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temp1);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp=rate;//显示速率
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temp1);
lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
/********************************************************
/*
/*显示运行方向符号
/*
/********************************************************/
voidmotor_dr()
{
if(direction==1)//正转方向标志
{for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);//显示方向符号
lcd_wdat(0x3e);
}
}
else
{for(m=0;m<2;m++)//反转方向标志
{
lcd_pos(0x0c+m);//显示方向符号
lcd_wdat(0x3c);
}
}
}
/********************************************************
/*
/*显示运行状态
/*
/********************************************************/
voidmotor_run()
{
if(on_off==1)
{tr0=1;
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis5[m]!='\0')
{lcd_wdat(cdis5[m]);//running
m++;}
motor_dr();//
}
else
{tr0=0;p1=0xf0;
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis3[m]!='\0')
{lcd_wdat(cdis3[m]);//stop
m++;}
motor_dr();//
snum=snum1;//
number1=0;//清圈数计数器
}
}
/********************************************************
*
*主程序
*
*********************************************************/
main()
{
lcd_init_dis();
tmod=0x01;//t0定时方式1
tl0=0x33;
th0=0xf5;
ea=1;
et0=1;
p1=0xf0;
while(1)
{
if(k1==0)
{
beep();
while(k1==0);//等待键释放
on_off=~on_off;
motor_run();
}//k1end
/********************************************************/
if(k2==0)
{
beep();
if(snum_dr==1)
{snum++;
snum1=snum;
if(snum==0x14)
{snum_dr=~snum_dr;}
}
else
{snum--;
snum1=snum;
if(snum==0x01)
{snum_dr=~snum_dr;}
}
}//k2end
/********************************************************/
if(k3==0)
{
beep();
direction=~direction;
motor_dr();
}//k3end
/********************************************************/
if(k4==0)
{
beep();
if(rate_dr==1)
{rate++;
if(rate==0x10)
{rate_dr=~rate_dr;}
}
else
{
rate--;
if(rate==0x01)
{rate_dr=~rate_dr;}
}
}//k4end
/********************************************************/
if(number1==snum1)//与设定圈数是否相等
{number1=0;
on_off=0;
tr0=0;
snum=snum1;
p1=0xf0;
motor_run();
}
data_dis();
}//while(1)end
}//mainend
/********************************************************/
/*
/*定时器0中断
/*
/********************************************************/
voidmotor_onoff()interrupt1
{
tl0=0x33;
th0=0xf5;
q++;
if(q
{return;}
else
{q=0;
number++;//脉冲计数
if(number==96)//96个脉冲电机转一圈
{snum--;
number=0;
number1++;}//电机转动圈数
if(direction==1)//方向标志
{if(v<8)
{p1=ffw[v];v++;}//取数据,正转
if(v==8)
{v=0;}
}
else
{if(v<8)
{p1=rev[v];v++;}//取数据,反转
if(v==8)
{v=0;}
}
}
}
/********************************************************/
云上办公兴起,华为云桌面Workspace更靠谱
传祺汽车实现点对点自动驾驶,车内可打麻将?
并行I/O口扩展的2种方式实例介绍
四种单片机按键软硬件设计方案介绍
NAS网络存储器的网站浏览器支持
ME300实例-1602LCD显示步进电机键控正反转实验-C
荣耀YOYO音箱拆解:4600分AI智商如何炼成?
博世计划裁员约1200人,自动驾驶发展不及预期为主要原因
南昌将造铁路电气化牵引变压器
CES 2016,LG展示强大的OLED和LCD实力
图解数字孪生应用白皮书(2020版)
Allegro的新传感器系列——A33110和A33115
赛目科技副总经理杨强将出席2023北京智源大会并发表主题演讲
高压功率器件的开关技术 功率器件的硬开关和软开关
如何选对LED锡膏?
关于EV12AD500A数模转换器E2V品牌的特征介绍
中兴通讯在OFC期间展示了在光通信领域领先的综合实力
IoT市场整体疲弱,哪些细分市场会有新机遇?
将2D/3D图表和图形添加到WindowsForms应用程序中
三星电子:营业利润连续第六季度下滑,芯片价格改善但需求仍低迷