单片机源程序如下:
#include #define uchar unsigned char /*********************************************************************************/ sbit IR=P3^2; //红外接口标志 uchar i; unsigned char irtime; //红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33]; /*********************************************************************************/ sbit A1=P1^0; //定义步进电机连接端口 P1^0-P1^3 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电 unsigned int o; unsigned char Speed; /*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } /*********************************************************************************/ void Ir_work(void); void Ircordpro(void); void tim0_isr (void) interrupt 1 using 1 { irtime++; //用于计数2个下降沿之间的时间 } void EX0_ISR (void) interrupt 0 //外部中断0服务函数 { static unsigned char i; //接收红外信号处理 static bit startflag; //是否开始处理标志位 if(startflag) { if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms i=0; irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } } void delay(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } void TIM0init(void)//定时器0初始化 { TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1; } void EX0init(void) { IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 } void Ir_work(void)//红外键值散转程序 { switch(IRcord[2])//判断第三个数码值 { case 0x44: Speed=2; //数字越小,转速越大,力矩越小 o=256;//旋转一周时间为512,这里改成红外按住才转动,所以是100 Coil_OFF //步进电机参数 while(o--) //正向 { Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替 DelayMs(Speed); //改变这个参数可以调整电机转速 , Coil_BC1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_DA1 DelayMs(Speed); } break;//电源 显示相应的按键值 case 0x40: Speed=2; //数字越小,转速越大,力矩越小 o=256;//旋转一周时间为512,这里改成红外按住才转动,所以是100 Coil_OFF //步进电机参数 while(o--)//反向 { Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替 DelayMs(Speed); //改变这个参数可以调整电机转速 , Coil_CD1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_AB1 DelayMs(Speed); } break;//电源 显示相应的按键值 case 0x07: Speed=2; //数字越小,转速越大,力矩越小 o=20;//旋转一周时间为512,这里改成红外按住才转动,所以是100 Coil_OFF //步进电机参数 while(o--) //正向 { Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
上一篇:STC15F2K60S2单片机8x8x8光立方
下一篇:单片机修改底层函数putchar()实现printf()在LCD上输出
推荐阅读最新更新时间:2024-11-11 11:29
设计资源 培训 开发板 精华推荐
- 使用 ROHM Semiconductor 的 BD4725 的参考设计
- 使用 Analog Devices 的 LTM4636-1EY 的参考设计
- EyeCloudAI CDK:与 OpenVINO 兼容并基于 Intel Myriad X 的开放式边缘 AI 相机套件
- 扩展板1
- BH1730_JX(环境光传感器)
- 5v稳压拓展
- LT3663IMS8E-3.3、1.2V 降压转换器的典型应用
- L7808C 稳压器用于光控制器的典型应用 (Vo(min) = Vxx + VBE)
- LTC3870EUF-1 高效率、425kHz、4 相 1V 降压转换器的典型应用电路
- LTM8049IY并联输出增加-5V输出电流SEPIC或反相转换器的典型应用电路