转速显示.docx
- 文档编号:5753803
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:8
- 大小:16.47KB
转速显示.docx
《转速显示.docx》由会员分享,可在线阅读,更多相关《转速显示.docx(8页珍藏版)》请在冰豆网上搜索。
转速显示
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
staticunsignedintcount;//计数
unsignedinthour,minute,second,count;
sbitRS=P2^3;//Pin4数据命令端
sbitRW=P2^2;//Pin5读写选择端
sbitE=P2^4;//Pin6使能端
#defineDataP0//数据端口
staticintstep_index;//步进索引数,值为0-7
bitk=0;//红外解码判断标志位,为0则为有效信号,为1则为无效
ucharn=0;//用来控制外部中断
staticbitturn;//步进电机转动方向
staticbitstop_flag;//步进电机停止标志
staticintspeedlevel;//步进电机转速参数,数值越大速度越慢,最小值为1,速度最快
staticintspcount;//步进电机转速参数计数
voiddelay(unsignedintendcount);//延时函数,延时为endcount*0.5毫秒
voidgorun();//步进电机控制步进函数
uchardatadate[4];//date数组为存放地址原码,反码,数据原码,反码
chardataTest1[]="";
#defineIR_REP3_2
voidDelayUs(unsignedcharus)//delayus
{
unsignedcharuscnt;
uscnt=us>>1;/*Crystalfrequencyin12MHz*/
while(--uscnt);
}
/******************************************************************/
voidDelayMs(unsignedcharms)//delayMs
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
voidWriteCommand(unsignedcharc)//写指令
{
DelayMs(5);//shortdelaybeforeoperation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
voidWriteData(unsignedcharc)
{
DelayMs(5);//shortdelaybeforeoperation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/***********单片机原创作品******************/
voidShowChar(unsignedcharpos,unsignedcharc)
{
unsignedcharp;
if(pos>=0x10)
p=pos+0xb0;//是第二行则命令代码高4位为0xc
else
p=pos+0x80;//是第二行则命令代码高4位为0x8
WriteCommand(p);//writecommand
WriteData(c);//writedata
}
/*************************************************************************/
voidShowString(unsignedcharline,char*ptr)
{
unsignedcharl,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
voidInitLcd()//初始化LCD
{
DelayMs(15);
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x06);//显示光标移动位置
WriteCommand(0x0c);//显示开及光标设置
WriteCommand(0x01);//显示清屏
}
/*--------------------------延时1ms程子程序-----------------------*/
delay1000()
{
uinti,j;
for(i=0;i<1;i++)
for(j=0;j<124;j++);
}
/*---------------------------延时882us子程序-----------------------*/
delay882()
{
uinti,j;
for(i=0;i<1;i++)
for(j=0;j<109;j++);
}
/*--------------------------延时2400ms程子程序-----------------------*/
delay2400()
{
uinti,j;
for(i=0;i<3;i++)
for(j=0;j<99;j++);
}
voidIR_decode()//破译
{
uchari,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1)//延时2.4ms后如果是高电平则是新码
{
delay2400();//延时4.8ms避开4.5ms的高电平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0);//等待地址码第1位高电平到来
delay882();//延时882ms判断此时引脚电平
///CY=IR_RE;
if(IR_RE==0)
{
date[i]>>=1;
date[i]=date[i]&0x7f;
}
elseif(IR_RE==1)
{
delay1000();
date[i]>>=1;
date[i]=date[i]|0x80;
}
}//1位数据接收结束
}//32位二进制码接收结束
}
if(date[2]==0x16)
TR0=0;
elseif(date[2]==0x14)
{TR0=1;
}
elseif(date[2]==0x10)
{if(speedlevel>1)
speedlevel--;
else
speedlevel=1;
}
elseif(date[2]==0x1A)
{if(speedlevel<5)
speedlevel++;
else
speedlevel=5;
}
elseif(date[2]==0x11)
turn=~turn;
}
voidint0()interrupt0using1
{
uinti;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1){k=~k;}//刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
}
if(k==0)
{
EX0=0;//检测到有效信号关中断,防止干扰
IR_decode();//如果接收到的是有效信号,则调用解码程序
//解码成功,调用显示程序,显示该键值
}
EX0=1;//开外部中断,允许新的遥控按键
}
voidmain(void)
{
InitLcd();
DelayMs(15);
sprintf(Test1,"STEPMOTORSPEED");//thefirstline
ShowString(0,Test1);
ShowChar(0x19,'r');
ShowChar(0x1a,'p');
ShowChar(0x1b,'m');
count=0;
step_index=0;
spcount=0;
stop_flag=0;
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
SP=0x60;
EA=1;//允许CPU中断
TMOD=0x11;//设定时器0和1为16位模式1
ET0=1;//定时器0中断允许
EX0=1;
TH0=0xFE;
TL0=0x0C;//设定时每隔0.5ms中断一次
TR0=1;//开始计数
turn=0;
speedlevel=1;
while
(1)
{
if(turn==0)
ShowChar(0x14,'+');
else
ShowChar(0x14,'-');
if(TR0==0)
{
ShowChar(0x15,'0');
ShowChar(0x16,'0');
ShowChar(0x17,'0');
ShowChar(0x18,'0');
}
else
{
if(speedlevel==1)
{
ShowChar(0x15,'3');
ShowChar(0x16,'0');
ShowChar(0x17,'0');
ShowChar(0x18,'0');
}
elseif(speedlevel==2)
{
ShowChar(0x15,'1');
ShowChar(0x16,'5');
ShowChar(0x17,'0');
ShowChar(0x18,'0');
}
elseif(speedlevel==3)
{
ShowChar(0x15,'1');
ShowChar(0x16,'0');
ShowChar(0x17,'0');
ShowChar(0x18,'0');
}
elseif(speedlevel==4)
{
ShowChar(0x15,'0');
ShowChar(0x16,'7');
ShowChar(0x17,'5');
ShowChar(0x18,'0');
}
elseif(speedlevel==5)
{
ShowChar(0x15,'0');
ShowChar(0x16,'6');
ShowChar(0x17,'0');
ShowChar(0x18,'0');
}
}
}
}
//定时器0中断处理
voidtimeint(void)interrupt1using0
{
TH0=0xFE;
TL0=0x0C;//设定时每隔0.5ms中断一次
count++;
spcount--;
if(spcount<=0)
{
spcount=speedlevel;
gorun();
}
}
voiddelay(unsignedintendcount)
{
count=0;
do{}while(count } voidgorun() { if(stop_flag==1) { P1_0=0; P1_1=0; P1_2=0; P1_3=0; return; } switch(step_index) { case0: //0 P1_0=1; P1_1=0; P1_2=0; P1_3=0; break; case1: //0、1 P1_0=1; P1_1=1; P1_2=0; P1_3=0; break; case2: //1 P1_0=0; P1_1=1; P1_2=0; P1_3=0; break; case3: //1、2 P1_0=0; P1_1=1; P1_2=1; P1_3=0; break; case4: //2 P1_0=0; P1_1=0; P1_2=1; P1_3=0; break; case5: //2、3 P1_0=0; P1_1=0; P1_2=1; P1_3=1; break; case6: //3 P1_0=0; P1_1=0; P1_2=0; P1_3=1; break; case7: //3、0 P1_0=1; P1_1=0; P1_2=0; P1_3=1; } if(turn==0) { step_index++; if(step_index>7) step_index=0; } else { step_index--; if(step_index<0) step_index=7; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 转速 显示