600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 51单片机 驱动步进电机 C语言 lcd 51单片机红外遥控控制步进电机的LCD显示源程序...

51单片机 驱动步进电机 C语言 lcd 51单片机红外遥控控制步进电机的LCD显示源程序...

时间:2019-10-24 12:25:54

相关推荐

51单片机 驱动步进电机 C语言 lcd 51单片机红外遥控控制步进电机的LCD显示源程序...

/*******************************************************************************

* 实验名 : 红外控制步进电机1602显示值实验

* 使用的IO: 电机用P2口

* 实验效果 : LCD1602显示出读取到的红外线的值,步进电机作出相应的动作,启动、停止、正转反转等

* 注意 :

*******************************************************************************/

#include

#include"lcd.h"

sbit EN=P2^2;

sbit DIR=P2^1;

sbit CLK=P2^0;

sbitSpeaker=P1^5;

sbit IRIN=P3^2;

typedef unsigned char u8;

typedef unsigned int u16;

u16 z=0,cyl;

unsigned char code CDIS1[13]={" Red Control "};

unsigned char code CDIS2[13]={" IR-CODE:--H "};

unsigned char IrValue[6];

unsigned char Time;

void IrInit();

void DelayMs(unsigned int );

void T0_init();

void T1_init();

void keyscan();

/*void delay1s(void);

void delay1s(void)

{

unsigned char h,i,j,k;

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

}*/

void T0_init()

{

//对TMOD进行赋值,选择T0/T1

//TMOD 8位 低4位用于T0,高4位用于T1 : GATEC/T(C计数器高位有效,T定时器低位有效)M1M2(工作方式 : 00 01 10 11)

//或运算|防止其他位被影响

TMOD|=0x11;

//计算初值1ms=1000us的初值 :2的16次方(65535)-1000+1 = 64536 = FC18H(工具)

TH0=(65536-50)/256;

TL0=(65536-50)%256;

//定时器0使能

ET0=1;

//打开总中断

EA=1;

//TR0/TR1是T0/T1的运行控制位 TR0置1,T0开始工作,置1则停止工作

}

//中断函数

void Timer0() interrupt 1

{

TH0=(65536-50)/256;

TL0=(65536-50)%256;

CLK=~CLK ;

}

void T1_init()

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

//定时器0使能

ET1=1;

//打开总中断

EA=1;

//TR0/TR1是T0/T1的运行控制位 TR0置1,T0开始工作,置1则停止工作

}

//中断函数

void Timer1() interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

z++;

}

/*******************************************************************************

* 函数名 : main

* 函数功能 : 主函数

* 输入 : 无

* 输出: 无

*******************************************************************************/

void main()

{

unsigned char i;

IrInit();

LcdInit();

LcdWriteCom(0x80);

EN=0;

DIR=0;

T0_init();

T1_init();

for(i=0;i<13;i++)

{

LcdWriteData(CDIS1[i]);

}

LcdWriteCom(0x80+0x40);

for(i=0;i<13;i++)

{

LcdWriteData(CDIS2[i]);

}

while(1)

{

IrValue[4]=IrValue[2]>>4; //高位

IrValue[5]=IrValue[2]&0x0f;//低位

if(IrValue[4]>9)

{

LcdWriteCom(0xc0+0x09); //设置显示位置

LcdWriteData(0x37+IrValue[4]); //将数值转换为该显示的ASCII码

}

else

{

LcdWriteCom(0xc0+0x09);

LcdWriteData(IrValue[4]+0x30); //将数值转换为该显示的ASCII码

}

if(IrValue[5]>9)

{

LcdWriteCom(0xc0+0x0a);

LcdWriteData(IrValue[5]+0x37);//将数值转换为该显示的ASCII码

}

else

{

LcdWriteCom(0xc0+0x0a);

LcdWriteData(IrValue[5]+0x30);//将数值转换为该显示的ASCII码

}

keyscan();

}

}

void keyscan()

{

if( IrValue[4]==4&& IrValue[5]==5) //步进启动

{

TR0=1;

EN=1;

}

else if( IrValue[4]==4&& IrValue[5]==4) //停止

{

TR0=0;

EN=0;

}

else if( IrValue[4]==0&& IrValue[5]==9) //正

{

DIR=1;

}

else if( IrValue[4]==1&& IrValue[5]==5) //反

{

DIR=0;

}

}

/*******************************************************************************

* 函数名 : DelayMs()

* 函数功能 : 延时

* 输入 : x

* 输出: 无

*******************************************************************************/

void DelayMs(unsigned int x) //0.14ms误差 0us

{

unsigned char i;

while(x--)

{

for (i = 0; i<13; i++)

{}

}

}

/*******************************************************************************

* 函数名 : IrInit()

* 函数功能 : 初始化红外线接收

* 输入 : 无

* 输出: 无

*******************************************************************************/

void IrInit()

{

IT0=1;//下降沿触发

EX0=1;//打开中断0允许

EA=1; //打开总中断

IRIN=1;//初始化端口

}

/*******************************************************************************

* 函数名 : ReadIr()

* 函数功能 : 读取红外数值的中断函数

* 输入 : 无

* 输出: 无

*******************************************************************************/

void ReadIr() interrupt 0

{

unsigned char j,k;

unsigned int err;

Time=0;

DelayMs(70);

if(IRIN==0)//确认是否真的接收到正确的信号

{

err=1000;//1000*10us=10ms,超过说明接收到错误的信号

/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时

侯,程序死在这里*/

while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去

{

DelayMs(1);

err--;

}

if(IRIN==1) //如果正确等到9ms低电平

{

err=500;

while((IRIN==1)&&(err>0))//等待4.5ms的起始高电平过去

{

DelayMs(1);

err--;

}

for(k=0;k<4;k++)//共有4组数据

{

for(j=0;j<8;j++) //接收一组数据

{

err=60;

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。