手机靓号网站建设,线上线下相结合的营销模式,网络文化经营许可证流程,软件企业官网/******************************************************************************** 实验名 : 红外控制步进电机1602显示值实验* 使用的IO : 电机用P2口* 实验效果 : LCD1602显示出读取到的红外线的值#xff0c;步进电机作出…/******************************************************************************** 实验名 : 红外控制步进电机1602显示值实验* 使用的IO : 电机用P2口* 实验效果 : LCD1602显示出读取到的红外线的值步进电机作出相应的动作启动、停止、正转反转等* 注意 *******************************************************************************/#include#includelcd.hsbit ENP2^2;sbit DIRP2^1;sbit CLKP2^0;sbit SpeakerP1^5;sbit IRINP3^2;typedef unsigned char u8;typedef unsigned int u16;u16 z0,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(h5;h0;h--)for(i4;i0;i--)for(j116;j0;j--)for(k214;k0;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;//计算初值 1ms1000us的初值 2的16次方(65535)-10001 64536 FC18H (工具)TH0(65536-50)/256;TL0(65536-50)%256;//定时器0使能ET01;//打开总中断EA1;//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使能ET11;//打开总中断EA1;//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);EN0;DIR0;T0_init();T1_init();for(i0;i13;i){LcdWriteData(CDIS1[i]);}LcdWriteCom(0x800x40);for(i0;i13;i){LcdWriteData(CDIS2[i]);}while(1){IrValue[4]IrValue[2]4; //高位IrValue[5]IrValue[2]0x0f; //低位if(IrValue[4]9){LcdWriteCom(0xc00x09); //设置显示位置LcdWriteData(0x37IrValue[4]); //将数值转换为该显示的ASCII码}else{LcdWriteCom(0xc00x09);LcdWriteData(IrValue[4]0x30); //将数值转换为该显示的ASCII码}if(IrValue[5]9){LcdWriteCom(0xc00x0a);LcdWriteData(IrValue[5]0x37); //将数值转换为该显示的ASCII码}else{LcdWriteCom(0xc00x0a);LcdWriteData(IrValue[5]0x30); //将数值转换为该显示的ASCII码}keyscan();}}void keyscan(){if( IrValue[4]4 IrValue[5]5) //步进启动{TR01;EN1;}else if( IrValue[4]4 IrValue[5]4) //停止{TR00;EN0;}else if( IrValue[4]0 IrValue[5]9) //正{DIR1;}else if( IrValue[4]1 IrValue[5]5) //反{DIR0;}}/******************************************************************************** 函数名 : DelayMs()* 函数功能 : 延时* 输入 : x* 输出 : 无*******************************************************************************/void DelayMs(unsigned int x) //0.14ms误差 0us{unsigned char i;while(x--){for (i 0; i13; i){}}}/******************************************************************************** 函数名 : IrInit()* 函数功能 : 初始化红外线接收* 输入 : 无* 输出 : 无*******************************************************************************/void IrInit(){IT01;//下降沿触发EX01;//打开中断0允许EA1; //打开总中断IRIN1;//初始化端口}/******************************************************************************** 函数名 : ReadIr()* 函数功能 : 读取红外数值的中断函数* 输入 : 无* 输出 : 无*******************************************************************************/void ReadIr() interrupt 0{unsigned char j,k;unsigned int err;Time0;DelayMs(70);if(IRIN0) //确认是否真的接收到正确的信号{err1000; //1000*10us10ms,超过说明接收到错误的信号/*当两个条件都为真是循环如果有一个条件为假的时候跳出循环免得程序出错的时侯程序死在这里*/while((IRIN0)(err0)) //等待前面9ms的低电平过去{DelayMs(1);err--;}if(IRIN1) //如果正确等到9ms低电平{err500;while((IRIN1)(err0)) //等待4.5ms的起始高电平过去{DelayMs(1);err--;}for(k0;k4;k) //共有4组数据{for(j0;j8;j) //接收一组数据{err60;………………………………限于本文篇幅 余下代码请从51黑下载附件…………