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;

sbit  Speaker=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 : GATE  C/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黑下载附件…………

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值