转速显示.docx

上传人:b****5 文档编号:5753803 上传时间:2022-12-31 格式:DOCX 页数:8 大小:16.47KB
下载 相关 举报
转速显示.docx_第1页
第1页 / 共8页
转速显示.docx_第2页
第2页 / 共8页
转速显示.docx_第3页
第3页 / 共8页
转速显示.docx_第4页
第4页 / 共8页
转速显示.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

转速显示.docx

《转速显示.docx》由会员分享,可在线阅读,更多相关《转速显示.docx(8页珍藏版)》请在冰豆网上搜索。

转速显示.docx

转速显示

#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;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1