红外遥控步进电机(C语言版)

合集下载

步进电机控制设计(C程序设计语言)

步进电机控制设计(C程序设计语言)

接口课程设计任务书学生姓名专业班级指导老师工作单位计算机学院题目:步进电机控制设计(C程序设计语言)一、内容:在MIFID微机实验台上以双八拍的方式控制步进电机运行,用按钮控制启动和停止。

接口硬件电路图见说明书。

二、要求:1、控制步进电机运行的相序表存储在文件中。

2、按下SW1按钮,从文件中取出一个相序数据,从并行接口8255A的PA口输出,使步进电机运行。

相序数据在CRT上显示。

按下SW2按钮,步进电机运行停止。

3、SW1按钮的数字量由PC1输入,SW2按钮的数字量由PC0输入,4、设计程序运行时的界面友好。

三、进度安排:指导教师签名:年月日系主任(责任教师)签名:年月日一.设计目的和内容目的:通过步进电机控制实验,学习并行接口电路及其控制程序的设计原理与方法。

内容:在MIFID微机实验台上以双八拍的方式控制步进电机运行,用按钮控制启动和停止。

接口硬件电路图见说明书。

要求:1、控制步进电机运行的相序表存储在文件中。

2、按下SW1按钮,从文件中取出一个相序数据,从并行接口8255A的PA口输出,使步进电机运行。

相序数据在CRT上显示。

按下SW2按钮,步进电机运行停止。

3、SW1按钮的数字量由PC1输入,SW2按钮的数字量由PC0输入,4、设计程序运行时的界面友好。

二、实验预备知识可编程并行接口8255是一个具有两个8位(A端口和B端口)和两个4位(C端口)并行I/O端口的芯片。

在与外设进行数据传输时,把A、B、C3个端口分为两组。

A组由A端口和C端口的高4位组成。

B组由B端口和C端口的低4位组成。

为了满足多种数据传输的要求,可以通过对8255的编程用方式控制字设置3种工作方式来实现。

这3种工作方式为:方式0(基本I/O工作方式);方式1(选通I/O工作方式);方式2(双向传送方式)。

8255的控制字有工作方式控制字和C端口的位置位/复位控制字。

工作方式控制字是必须要预先设定的,C端口的位置位/复位控制字可视需要而定。

步进电机【C语言驱动程序】

步进电机【C语言驱动程序】

/*C语言代码:*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code CCW[4]={0xFC,0xF6,0xF3,0xF9}; //逆时钟旋转相序表 uchar code CW[4]={0xFC,0xF9,0xF3,0xF6}; //正时钟旋转相序表sbit K1=P1^5; //反转按键sbit K2=P1^6; //正转按键sbit K3=P1^7; //停止按键sbit FMQ=P1^4; // 蜂鸣器void delaynms(uint aa){uchar bb;while(aa--){for(bb=0;bb<110;bb++) //1ms基准延时程序{;}}}void delay500us(void){int j;for(j=0;j<57;j++){;}}void beep(void){uchar t;for(t=0;t<100;t++){delay500us();FMQ=!FMQ; //产生脉冲}FMQ=1; //关闭蜂鸣器}void motor_ccw(void){uchar i,j;for(j=0;j<4;j++) //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周{if(K3==0){break; //如果K3按下,退出此循环}for(i=0;i<8;i++) //旋转45度{P0=CCW[i];delaynms(10); //调节转速}}}void motor_cw(void){uchar i,j;for(j=0;j<4;j++){if(K3==0){break; //如果K3按下,退出此循环}for(i=0;i<8;i++) //旋转45度{P0=CW[i];delaynms(2); //调节转速}}}void main(void){uchar r;uchar N=64; //因为步进电机是减速步进电机,减速比的1/64 , //所以N=64时,步进电机主轴转一圈while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ccw(); //电机逆转if(K3==0){beep();break;}}}else if(K2==0){beep();for(r=0;r<N;r++){motor_cw(); //电机反转if(K3==0){beep();break;}}}elseP0=0x00; //电机停止}}。

步进电机实验C语言程序

步进电机实验C语言程序
步进电机实验c语言程序 #include #define uint unsigned int #define uchar unsigned char uchar fed[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //zheng uchar rvs[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //fan sbit key1=p0^0;启动sbit key2=p0^7;停止sbit key3=p0^2; sbitkey4=p0^3; sbitkey5=p0^4;升速sbit key6=p0^5; voiddelay100us(uint do{x=46; do{ }while(--x!=0); }while(--z!=0); voidmain() ucharqt=0,ss=0,js=0,bs=10; while(1) p1=0x00;if(key1==0) qt=1;//启动 qt=0;//停止 ss=1;//加速 js=0;//减速 p1=fed[i];delay100us(bs); if(ss==1) ss=0;bs=bs-3; p1=rvs[i];delay100us(bs); if(js==1) js=0;bs=bs+3; p1=0x00;if(key3==0) p1=fed[i];delay100us(10); p1=rvs[i];delay100us(10); chenxiao9996 分享于 2015-02-03 00:56:8.0 步进电机实验c语言程序 文档格式: .docx 文档页数: 3页 文档大小: 9.7k 文档热度: 文档分类: 中学教育 -- 高中教育 文档标签: 步进电机 sbit uchar 语言 实验 程序 步进电机实验c语言程序

步进电机控制(单片机C语言)

步进电机控制(单片机C语言)

步进电机控制(单⽚机C语⾔)模块⼆简单应⽤实例调试任务2 步进电机控制(H22)⼀、任务要求⽤单⽚机P1端⼝控制步进电机,编写程序输出脉冲序列到P1⼝,控制步进电机正转、反转,加速,减速。

⼆、任务⽬的1.了解步进电机控制的基本原理。

2.掌握控制步进电机转动的编程⽅法。

三、电路连线框图步进电机电流⼩于0.5A时可采⽤ULN2003A进⾏驱动(反相)四、原理控制说明步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。

切换是通过单⽚机输出脉冲信号来实现的。

所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转⽅向。

步进电机的转速应由慢到快逐步加速。

电机驱动⽅式可以采⽤双四拍(AB→BC→CD→DA→AB)⽅式,也可以采⽤单四拍(A→B→C→D→A)⽅式,或单、双⼋拍(A→AB→B→BC→C→CD→D→DA→A)⽅式。

控制时公共端是接在VCC上的,所以实际控制脉冲是低电平有效。

单⽚机的P1⼝输出的脉冲信号经(MC1413或ULN2003A)倒相驱动后,向步进电机输出脉冲信号序列。

五、程序框图# include#define Astep 0x01#define Bstep 0x02#define Cstep 0x04#define Dstep 0x08unsigned char dly_c;void delay(){unsigned char tt,cc;cc = dly_c; //外循环次数tt = 0x0; //内循环次数do{do {}while(--tt);}while(--cc);}void main(){dly_c = 0x10;// 双四拍⼯作⽅式while(1){P1= Astep+Bstep;delay();P1= Bstep+Cstep;delay();P1= Cstep+Dstep;delay();P1= Dstep+Astep;delay();if (dly_c>3) dly_c --; // 加速控制};。

自己写的51单片机的红外线遥控接收程序(C语言)

自己写的51单片机的红外线遥控接收程序(C语言)

//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。

红外遥控控制步进电机

红外遥控控制步进电机

唐山学院毕业设计设计题目:基于单片机的步进电机控制系统设计与实现系别:信息工程系班级:姓名:指导教师:2013年6月10 日基于单片机的步进电机控制系统设计与实现摘要步进电机是一种纯粹的数字控制电动机,是一种受电脉冲信号控制的无刷式直流电动机,是现代定位驱动装置的核心,广泛应用在机械、电力、纺织、电子、仪表、印刷以及航空航天、船舶、兵器等国防工业等领域。

基于单片机的步进电机控制系统具有稳定度高、成本低、控制方便、应用范围广等特点。

本系统是由STC89C52单片机核心处理模块,遥控器命令输入模块,ULN2003及28BYJ-48步进电机组成的电机模块,12864液晶输出模块共同组成的基于单片机的步进电机控制系统。

本设计以载波为38KHZ的红外遥控器作为用户的控制端,它的功能是把用户的命令转换为红外信号。

红外信号由TL1838接收,它可以将光信号转换为电信号,并将其发送给微控制器STC89C52。

STC89C52对电信号进行相应处理即可获得用户所发出的指令,并依此来控制28BYJ48型四相八拍电机并以12864液晶作为当前状态的显示器。

用户可以对步进电机进行加速、减速、正转、反转的控制。

本步进电机控制系统具有精度高、运行稳定、控制方便、维护简单、应用范围广等特点。

关键词:STC89C52 12864液晶步进电机红外遥控Design and Implementation of Stepper Motor Control System Based on MCUAbstractStepper motor is a kind of pure digital control motor and brushless dc motor controlled by electric pulse signal type. Stepper motor is the core of the modern orientation drive, widely used in machinery, electric power, textile, electronics, instruments, printing and aerospace, ships, weapons, and other areas of the defense industry, etc. The characteristics of the stepping motor control system based on single chip microcomputer include high stability, low cost, convenient control and wide application , etc.The stepper motor control system consists of core processor using the single chip processor, command input control module using IR remote control , display module using 12864 LCD and 28BYJ48 stepping motor module which using ULN2003 as driver.The infrared remote control with carrier for 38 KHZ is used as the control end of the user, which can convert the users’ commands into the infrared signal. The TL1838 can receive the infrared signal and convert it into electrical signal, which input to tSTC89C52.The MCU can obtain instructions of users by processing the incoming signal and control stepping motor of the 28BYJ48 type, the current status can be shown by 12864 LCD. Users could control acceleration, deceleration, forward, inversion for the stepping motor. The features of the control system of stepper motor includes high precision, stable running, convenient control and simple maintenance and wide application, etc.Key word:MCU; 12864 LCD; Stepper Motor; Infrared remote control目录1 引言 (1)2 总体设计方案 (2)2.1系统设计原理 (2)2.2总体设计框图 (2)3系统硬件模块的组成 (3)3.1单片机控制模块 (3)3.1.1 STC89C52主要结构 (3)3.1.2 STC89C52功能特性描述 (3)3.1.3 时钟电路 (6)3.1.4复位电路 (6)3.2步进电机模块 (7)3.2.1 步进电机简介 (7)3.2.2步进电机的结构 (8)3.2.3 28BYJ-48步进电机工作原理 (8)3.3ULN2003芯片概述与特点 (9)3.4红外线发射接收模块 (10)3.4.1 红外线遥控的介绍 (10)3.4.2红外通信基本原理 (10)3.4.3 红外遥控发射系统 (12)3.4.4 红外遥控接收系统 (12)3.4.5 TL1838与单片机的接口 (14)3.512864显示模块 (14)3.5.1 12864液晶的特点 (14)3.5.2 12864液晶的引脚说明 (15)3.5.3 12864液晶的读写操作 (17)3.5.4 12864液晶的控制指令 (17)3.5.5 12864液晶接口电路 (20)3.6蜂鸣器模块 (20)3.6.1 蜂鸣器介绍 (20)3.6.2 蜂鸣器的接口电路 (21)4 软件设计与调试 (22)4.1主程序流程图 (22)4.2程序设计思路 (23)4.2.1 遥控器的解码 (23)4.2.2 步进电机的控制 (23)4.2.3 显示屏的控制 (24)4.2.4 蜂鸣器的控制 (24)4.2.5 模块中的通信 (24)5 编程与下载软件 (25)5.1 Keil软件 (25)5.2STC-ISP下载软件 (26)6 硬件电路制作 (27)6.1原理图的绘制 (27)6.2电路实现的基本步骤 (27)7 结论 (30)谢辞 (31)参考文献 (32)附录 (33)1 引言步进电机是一种纯粹的数字控制电动机,又称为阶跃电机或脉冲电机[1]。

红外遥控器C语言参考例程

红外遥控器C语言参考例程
/* */
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
void delay(uchar x); //x*0.14MS
void delay1(int ms);
void beep();
sbit IRIN = P3^2; //红外接收器数据线
sbit BEEP = P1^5; //蜂鸣器驱动线
sbit RELAY= P1^4; //继电器驱动线
uchar IRCOM[7];
while (IRIN)
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/

步进电机控制程序(c语言51单片机)

步进电机控制程序(c语言51单片机)

// pri_dj = Pme );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one _round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
while ( key_puse & key_clear ); delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break; }
while( !key_puse ); delay(8ms);
while( !key_puse ); }
set_display_num(); for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0; P0 = P0 | LEDBuf[i] ; if(i==0) led_1000 = 0; //P0^4 if(i==1) led_100 = 0; //P0^5 if(i==2) led_10 = 0; //P0^6 if(i==3) led_1 = 0; //P0^7
delay ( 1ms ); tmp = (~(P2 | 0xF0)); P2 = 0x7F; // 0111 1111
delay ( 1ms ); tmp = (~(P2 | 0xF0)) * 10 + tmp; set_round_num = set_round_num + tmp * 100; set_round_num = set_round_num * Chilun_Num;

步进电机c程序课程设计

步进电机c程序课程设计

步进电机c程序课程设计一、教学目标本课程的目标是使学生掌握步进电机的基础知识,能够使用C程序控制步进电机的运动。

具体目标如下:1.了解步进电机的工作原理和特点。

2.掌握C程序的基本语法和编程技巧。

3.理解步进电机控制的基本方法和算法。

4.能够使用C程序编写简单的步进电机控制代码。

5.能够对步进电机进行基本的故障排除和维护。

情感态度价值观目标:1.培养学生的创新意识和实践能力。

2.培养学生的团队合作精神和沟通能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.步进电机的基础知识:介绍步进电机的工作原理、结构和特点。

2.C程序编程基础:讲解C程序的基本语法、数据类型、控制结构和函数。

3.步进电机控制方法:介绍步进电机的控制方法、算法和编程技巧。

4.步进电机控制实例:分析实际应用中的步进电机控制案例,让学生进行实际操作。

三、教学方法本课程采用多种教学方法相结合的方式,以激发学生的学习兴趣和主动性:1.讲授法:讲解步进电机的基础知识和C程序编程基础。

2.讨论法:学生进行小组讨论,分享学习心得和控制方法。

3.案例分析法:分析实际应用中的步进电机控制案例,让学生进行思考和解决问题。

4.实验法:安排实验室实践环节,让学生亲自动手操作步进电机,进行控制编程和调试。

四、教学资源本课程的教学资源包括以下几个方面:1.教材:选用合适的教材,提供全面、系统的步进电机和C程序知识。

2.参考书:提供相关的参考书籍,供学生进一步深入学习和参考。

3.多媒体资料:制作课件、视频等多媒体资料,直观地展示步进电机的工作原理和控制方法。

4.实验设备:准备步进电机、控制器等实验设备,让学生进行实际操作和编程实践。

五、教学评估为了全面、客观、公正地评估学生的学习成果,本课程将采用以下评估方式:1.平时表现:通过课堂参与、提问、回答问题等方式评估学生的课堂表现,鼓励学生积极参与课堂讨论和实践活动。

2.作业:布置适量的作业,包括编程练习和控制方案设计等,以巩固学生的知识和技能。

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。

就算是一坨屎,也有遇见屎壳郎的那天。

所以你大可不必为今天的自己有太多担忧。

红外线遥控解码接收程序-C语言#include <regx51.h>#define uchar unsigned char#define uint unsigned int#define IR_RE P3_2bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码/*--------------------------延时1ms程子程序-----------------------*/delay1000(){uchar i,j;i=5;do{j=95;do{j--;}while(j);i--;}while(i);}/*---------------------------延时882us子程序-----------------------*/delay882(){uchar i,j;i=6;do{j=71;do{j--;}while(j);i--;}while(i);}/*--------------------------延时2400us程子程序-----------------------*/delay2400(){uchar i,j;i=5;do{j=237;do{j--;}while(j);i--;}while(i);}//**************************************************************//**************************************************************/*----------------------------------------------------------*//*-----------------------红外解码程序(核心)-----------------*//*----------------------------------------------------------*/void IR_decode(){uchar i,j;while(IR_RE==0);delay2400();if(IR_RE==1) //延时2.4ms后如果是高电平则是新码{delay1000();delay1000();for(i=0;i<4;i++){for(j=0;j<8;j++){while(IR_RE==0); //等待地址码第1位高电平到来delay882(); //延时882us判断此时引脚电平///CY=IR_RE;if(IR_RE==0){date[i]>>=1;date[i]=date[i]|0x00;}else if(IR_RE==1){delay1000();date[i]>>=1;date[i]=date[i]|0x80;}} //1位数据接收结束} //32位二进制码接收结束}}//*****************************************************************//********************************************************************/*------------------------外部中断0程序-------------------------*//*------------------主要用于处理红外遥控键值--------------------*/void int0() interrupt 0{uchar i;k=0;EX0=0; //检测到有效信号关中断,防止干扰for(i=0;i<4;i++){delay1000();if(IR_RE==1){k=1;} //刚开始为9ms的引导码. }if(k==0){// EX0=0; //检测到有效信号关中断,防止干扰IR_decode(); //如果接收到的是有效信号,则调用解码程序P0=date[1];delay2400();delay2400();delay2400();}EX0=1; //开外部中断,允许新的遥控按键}//*********************************************************************//********************************void main(){SP=0x60; //堆栈指针EX0=1; //允许外部中断0,用于检测红外遥控器按键EA=1; //总中断开while(1);}总结:关于本段程序的精确延时在<<C51中精确的延时与计算的实现>>里的评论有很好的诠释.以上程序段可以应用在51/52单片机里.下面的程序可以应用在STC12C5410/STC12C2052型号的单片机里面.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。

红外线发射与接收C51用C语言解决方案

红外线发射与接收C51用C语言解决方案

//红外线延时函数,延时 0.56 毫秒
//红外线延时函数,延时 0.5 毫秒
delay_ms(9); rfot=1; delay_ms(4); delay_50(); } void a_key() { uint i; bit_boot(); for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_56(); } for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_112(); } rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; //A 键编码
现在大家已经知道了每个键的编码,在写程序之前,先要说一下有关红外线发射的知识,我 想大家对这些知识应该是很了解的了,在这里补充说一下是为了在下一步写程序是大家能明白我 的思路是对还是错? 再不考虑发射芯片的型号,就用大家常用的编码方式: 首先先来说说引导区,如下图:
图 二 每个按键在被按下之后首先会有像上图所的信号发出,称为引导区,实际生活中,用遥控器 发出的信号与上面的信号是相反的,经过红外线接收头解码以后就和上图一样了,值得大家注意 的是发射模块的芯片不同,引导区的时间和数据都有所不同,但解决的方法都是一样的。 在写程序是就按照上面的图来写: P1^6=0; Delay(); //延时 9mS P1^6=1; Delay(); //延时 4.5mS

单片机红外遥控+步进电机+1602液晶显示c语言源程序

单片机红外遥控+步进电机+1602液晶显示c语言源程序

∙单片机红外遥控+步进电机+1602液晶显示c语言源程序∙发布时间:2009-7-25 阅读次数:426 字体大小: 【小】【中】【大】#include#include#include#define uchar unsigned char#define uint unsigned intstatic unsigned int count; //计数unsigned int hour,minute,second,count;sbit RS = P2^3;//Pin4sbit RW = P2^2; //Pin5sbit E = P2^4;//Pin6#define Data P0 //数据端口static int step_index; //步进索引数,值为0-7bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效uchar n=0; //用来控制外部中断static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; //步进电机转速参数计数void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒void gorun(); //步进电机控制步进函数uchar data date[4]; //date数组为存放地址原码,反码,数据原码,反码char data Test1[]=" ";#define IR_RE P3_2void DelayUs(unsigned char us)//delay us{unsigned char uscnt;uscnt=us>>1;/* Crystal frequency in 12MHz*/while(--uscnt);}/******************************************************************/void DelayMs(unsigned char ms)//delay Ms{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);}}void WriteCommand(unsigned char c){DelayMs(5);//short delay before operationE=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/****************************************************************/void WriteData(unsigned char c){DelayMs(5); //short delay before operationE=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/***********单片机原创作品******************/void ShowChar(unsigned char pos,unsigned char c){unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xcelsep=pos+0x80; //是第二行则命令代码高4位为0x8WriteCommand (p);//write commandWriteData (c); //write data}/*************************************************************************/ void ShowString (unsigned char line,char *ptr){unsigned char l,i;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/*********************************************************************/ void InitLcd(){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}/*--------------------------延时1ms程子程序-----------------------*/ delay1000(){uint i,j;for(i=0;i<1;i++)for(j=0;j<124;j++);}/*---------------------------延时882us子程序-----------------------*/delay882(){uint i,j;for(i=0;i<1;i++)for(j=0;j<109;j++);}/*--------------------------延时2400ms程子程序-----------------------*/delay2400(){uint i,j;for(i=0;i<3;i++)for(j=0;j<99;j++);}void IR_decode(){uchar i,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;}else if(IR_RE==1){delay1000();date[i]>>=1;date[i]=date[i]|0x80;}} //1位数据接收结束} //32位二进制码接收结束}if (date[2]==0x16)TR0 = 0;else if(date[2]==0x14){TR0 = 1;}else if(date[2]==0x10){if (speedlevel>1)speedlevel--;elsespeedlevel=1;}else if(date[2]==0x1A){if(speedlevel<5)speedlevel++;elsespeedlevel=5;}else if(date[2]==0x11)turn=~turn;}void int0() interrupt 0 using 1{uint i;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; //开外部中断,允许新的遥控按键}void main(void){InitLcd();//DelayMs(15);sprintf(Test1,"STEP MOTOR SPEED");//the first lineShowString(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,+);elseShowChar(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);}else if(speedlevel==2){ShowChar(0x15,1);ShowChar(0x16,5);ShowChar(0x17,0);ShowChar(0x18,0);}else if(speedlevel==3){ShowChar(0x15,1);ShowChar(0x16,0);ShowChar(0x17,0);ShowChar(0x18,0);}else if(speedlevel==4){ShowChar(0x15,0);ShowChar(0x16,7);ShowChar(0x17,5);ShowChar(0x18,0);}else if(speedlevel==5){ShowChar(0x15,0);ShowChar(0x16,6);ShowChar(0x17,0);ShowChar(0x18,0);}}}}//定时器0中断处理void timeint(void) interrupt 1 using 0 {TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;spcount--;if(spcount<=0){spcount = speedlevel;gorun();}}void delay(unsigned int endcount){count=0;do{}while(count<ENDCOUNT);}void gorun(){if (stop_flag==1){P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;return;}switch(step_index) {case 0: //0P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 0;break;case 1: //0、1P1_0 = 1;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 2: //1P1_0 = 0;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 3: //1、2P1_0 = 0;P1_1 = 1;P1_2 = 1;P1_3 = 0;break;case 4: //2P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 0;break;case 5: //2、3P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 1;break;case 6: //3P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 1;break;case 7: //3、0P1_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;}}。

步进电机驱动程序C语言

步进电机驱动程序C语言

/*************************************************************************************** ;步进电机驱动程序;步进电机型号:70BC340-D ,步距角1.5/3***************************************************************************************** ****/#include <A T892051.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit dj_a = P1^0;sbit dj_b = P1^1;sbit dj_c = P1^2;sbit gd_s = P3^3;sbit key_s = P3^4;sbit key_j = P3^5;sbit dog = P3^0;uchar bdata flg;sbit s_bit = flg^0;sbit j_bit = flg^1;uchar data bzjs=0; //计时单元uchar data dqdjbz=0; //当前电机步骤uchar data djzt=0; //电机状态01==升10==降00==保uchar data dqdjabc=0x06;uchar data key=0x30; //键值//定时单元uchar data sh=0;uchar data sl=0;//脉冲宽度uchar code s_sj=5; // 升时每拍时间为5毫秒uchar code j_sj=7; // 降时每拍时间为7毫秒//电机步骤代码uchar code dj[6]={0x06,0x04,0x05,0x01,0x03,0x02};//===================================================void delay10ms(void){uchar i,j;for(i=0;i<12;i++){for(j=0;j<200;j++){dog = ~dog;}}}void timer0() interrupt 1 {TH0=sh; //TL0=sl;if(s_bit){bzjs++;if(bzjs>(s_sj-1)){bzjs = 0;dqdjbz++;if(dqdjbz>5){dqdjbz = 0;}djzt = 0x01;dqdjabc = dj[dqdjbz];}}if(j_bit){bzjs++;if(bzjs>(j_sj-1)){bzjs = 0;if(dqdjbz>0){dqdjbz--;}else{dqdjbz = 5;}djzt = 0x10;dqdjabc = dj[dqdjbz];}}if((s_bit==0)&&(j_bit==0)){bzjs = 0;if(djzt==0x01){switch(dqdjbz){case 1:dqdjbz = 2;break;case 3:dqdjbz = 4;break;case 5:dqdjbz = 0;break;}}if(djzt==0x10){switch(dqdjbz){case 1:dqdjbz = 0;break;case 3:dqdjbz = 2;break;case 5:dqdjbz = 4;break;}}djzt = 0;dqdjabc = dj[dqdjbz];djzt = 0x00;}P1 = dqdjabc;}void main(void){P1 = 0xff;P3 = 0xff;TMOD = 0x11;TH0 = 0xfc;TL0 = 0x73;TR0 = 1;ET0 = 1;dqdjbz = 0x00;P1 = 0x06;dqdjabc = 0x06;flg = 0;EA = 1;while(1){key = P3 & 0x30;if(key != 0){delay10ms();key = P3 & 0x30;//key = 0x20;}switch(key){case 0x20:s_bit = 1;j_bit = 0;break;case 0x10:j_bit = 1;s_bit = 0;break;case 0x30:s_bit = 0;j_bit = 0;break;}if(gd_s){sh = 0xfc; //1毫秒sl = 0x7b;}else{sh = 0xf8; //2毫秒sl = 0xe0;}}}。

步进电机C语言代码

步进电机C语言代码

#include <AT89X51.h>static unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; //步进电机转速参数计数void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒void gorun(); //步进电机控制步进函数void main(void){count = 0;step_index = 0;spcount = 0;stop_flag = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数turn = 0;speedlevel = 2;delay(10000);speedlevel = 1;do{speedlevel = 2;delay(10000);speedlevel = 1;delay(10000);stop_flag=1;delay(10000);stop_flag=0;}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;spcount--;if(spcount<=0){spcount = speedlevel;gorun();}}void delay(unsigned int endcount){count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;return;}switch(step_index) {case 0: //0P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 0;break;case 1: //0、1P1_0 = 1;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 2: //1P1_0 = 0;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 3: //1、2P1_0 = 0;P1_1 = 1;P1_2 = 1;P1_3 = 0;break; case 4: //2P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 0;break; case 5: //2、3P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 1;break; case 6: //3P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 1;break; case 7: //3、0P1_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; }}。

红外遥控的C程序

红外遥控的C程序

红外遥控的C程序红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为EF10也是互为反码.关于SC6122的资料在我们的网页资料下载上有.SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,低电平在4000-5000之间都看作是正常范围.引导码后的32位编码(16位系统码和16位键码)不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高电平持续时间是2250微秒,所以低电平除去载波时间大约是560微秒,高电平除去载波时间大约是1680微秒.低电平也有一个波动范围,在400-700之间都看作是正常的,具体多少可以通过示波器测量出来.高电平也有一个波动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线的范围也越宽,越精确.在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.下面有两个经过实践能在实验板上显示键码的程序,一个是汇编写的,一个是用C写的,与大家一起探讨遥控器.以下程序能在LCD上显示系统码和键码,按不同的按键,系统码不变,变的是键码.有不懂的地方可以在留言本上留言.RS EQU P2.5 ;这几个是LCD引脚.RW EQU P2.6E EQU P2.7IRR EQU P3.3 ;红外接收的输出接P3.3.BUF EQU 30H ;30H-33H保存解码结果;=============================================ORG 0000HAJMP MAIN;=============================================ORG 0030HMAIN:MOV SP,#70H ;堆栈指针设到70H的地方ACALL INIT_LCD ;初始化LCDMOV R7,#10ACALL DELAY_MSMOV DPTR,#MSG1CALL DISPLAY_LINE1 ;在第一行显示Test8: IR ReaderMOV DPTR,#MSG2CALL DISPLAY_LINE2 ;在第二行显示MAIN_LOOP:JB IRR,$ ;等待接收头信号为低ACALL GET_LOW ;测量引导脉冲低电平CLR CMOV A,R7SUBB A,#(8000/50) ;SC6122的引导脉冲低电平为9000US,我们只要测到低电平的值在8000-10000US范围内就认为合格的.JC MAIN_LOOP ;如果小于8000US,不对,重新等待接收CLR CMOV A,R7SUBB A,#(10000/50)JNC MAIN_LOOPACALL GET_HIGH ;测量引导脉冲高电平CLR CMOV A,R7SUBB A,#(4000/50)JC MAIN_LOOP ;如果小于4000US,不对,重新等待接收CLR CMOV A,R7SUBB A,#(5000/50)JNC MAIN_LOOP ;如果大于5000US,不对,重新等待接收MOV R0,#BUF ;MOV R5,#8 ;SC6122发的码有32位,我们用4个字节来存放,每个字节有8位IR_NEXT:CALL GET_LOWCLR CMOV A,R7SUBB A,#(300/50) ;300USJC MAIN_LOOP ;低电平小于300微秒认为不对,重新接收CLR CMOV A,R7SUBB A,#(800/50) ;800USJNC MAIN_LOOP ;低电平大于800微秒认为不对,重新接收ACALL GET_HIGHCLR CMOV A,R7SUBB A,#(300/50) ;300USJC MAIN_LOOP ;高电平小于300微秒认为不对,重新接收CLR CMOV A,R7SUBB A,#(2000/50) ;2000USJNC MAIN_LOOP ;高电平大于2000微秒认为不对,重新接收CLR CMOV A,R7SUBB A,#(1120/50) ; ;跟中间值1120进行比较RRC AMOV @R0,A ;通过CY移到间接地址R0中去DJNZ R5,IR_NEXT ;8位移完了吗MOV R5,#8INC R0MOV A,R0XRL A,#(BUF+4)JNZ IR_NEXT ;如果不到4个字节,接收下一个MOV DPTR,#MSG_6122ACALL DISPLAY_LINE1 ;显示格式名称ACALL DISPLAY_IR_CODE ;显示码AJMP MAIN_LOOP;============================================ MSG1: DB " Test8: IR Reader "MSG2: DB " "MSG_6122: DB " Format: SC6122 ";============================================ ;转为ASCII码在LCD在显示TO_ASCII:CJNE A,#0AH,TO_ASCII_1TO_ASCII_1:JC TO_ASCII_2 ;小于10ADD A,#('A'-10)RETTO_ASCII_2:ADD A,#'0'RET;============================================DISPLAY_IR_CODE:MOV A,#0C0H ;显示在第二行ACALL SEND_COMMAND_BYTE ;设置DDRAM地址MOV R0,#BUFDISPLAY_IR_CODE_NEXT:MOV A,@R0SWAP AANL A,#0FH ;分离出高字节ACALL TO_ASCII ;转为ASCII码ACALL SEND_DATA_BYTE ;显示MOV A,@R0ANL A,#0FH ;分离出低字节ACALL TO_ASCII ;转为ASCII码ACALL SEND_DATA_BYTE ;显示MOV A,#' 'ACALL SEND_DATA_BYTE ;显示空格INC R0MOV A,R0XRL A,#(BUF+4)JNZ DISPLAY_IR_CODE_NEXTMOV R0,#8 ;第2行共有20个字符,前面显示用了12个,再用8个空格填满DISPLAY_IR_CODE_B:MOV A,#' 'ACALL SEND_DATA_BYTEDJNZ R0,DISPLAY_IR_CODE_BRET;============================================;测量低电平时间,50US采样一次,R7加1一次,比如低电平时间为9000US,测得R7的结果为180(0B4H) ;OUTPUT: R7GET_LOW:MOV R7,#00HGET_LOW_NEXT:MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,DJNZ R6,$ ;这条指令执行需要2个机器周期JB IRR,GET_LOW_RTN ;接收头为高电平,结束测量INC R7MOV A,R7JNZ GET_LOW_NEXT ;看R7是否有溢出GET_LOW_RTN:RET;============================================;测量高电平时间,50US采样一次,R7加1一次,比如高电平时间为4500US,测得R7的结果为90;OUTPUT: R7GET_HIGH:MOV R7,#00HGET_HIGH_NEXT:MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,DJNZ R6,$ ;这条指令执行需要2个机器周期JNB IRR,GET_HIGH_RTN ;接收头为低电平,结束测量INC R7MOV A,R7JNZ GET_HIGH_NEXT ;看R7是否有溢出GET_HIGH_RTN:RET;============================================ ;============================================DELAY_MS:MOV R6,#250DELAY_MS_NEXT:NOPNOPDJNZ R6,DELAY_MS_NEXTDJNZ R7,DELAY_MSRET;============================================ ;INPUT: R7DELAY:DJNZ R7,$RET;============================================ ;向LCD写一个命令字节;INPUT: ACCSEND_COMMAND_BYTE:CLR RSCLR RWMOV P0,ASETB ENOPNOPNOPNOPNOPNOPCLR EMOV R7,#100ACALL DELAYRET;=============================================== ;向LCD写一个数据字节;INPUT: ACCSEND_DATA_BYTE:SETB RSCLR RWMOV P0,ASETB ENOPNOPNOPNOPNOPNOPCLR EMOV R7,#100ACALL DELAYRET;====================================================== ;初始化LCDINIT_LCD:MOV A,#30HACALL SEND_COMMAND_BYTEACALL SEND_COMMAND_BYTEACALL SEND_COMMAND_BYTEMOV A,#38H ;设置工作方式ACALL SEND_COMMAND_BYTEMOV A,#0CH ;显示状态设置ACALL SEND_COMMAND_BYTEMOV A,#01H ;清屏ACALL SEND_COMMAND_BYTEMOV A,#06H ;输入方式设置ACALL SEND_COMMAND_BYTERET;======================================================= ;在第一行显示;INPUT: DPTR指向要显示的内容DISPLAY_LINE1:MOV A,#080HDISPLAY_LINE1_A:ACALL SEND_COMMAND_BYTE ;设置DDRAM地址MOV R6,#20DISPLAY_LINE1_NEXT:CLR AMOVC A,@A+DPTRACALL SEND_DATA_BYTEINC DPTRDJNZ R6,DISPLAY_LINE1_NEXTMOV R7,#100ACALL DELAYRET;=======================================================;在第二行显示;INPUT: DPTR指向要显示的内容DISPLAY_LINE2:MOV A,#0C0HAJMP DISPLAY_LINE1_A;=======================================================END下面是一个用C写的遥控器程序.能在数码管上显示键码.#include <reg52.h>#define c(x) (x*110592/120000)sbit Ir_Pin=P3^3;unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F. unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};unsigned char Led_Buf[4]; //显示缓冲区char Led_Index; //位选unsigned char Ir_Buf[4]; //用于保存解码结果//==============================================================//数码管扫描timer0() interrupt 1 using 1{TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描P0=0xff;P2=Led_Sel[Led_Index]; //位选P0=Led_Tab[Led_Buf[Led_Index]]; //段选if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管}//============================================================== unsigned int Ir_Get_Low(){TL1=0;TH1=0;TR1=1;while(!Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================= unsigned int Ir_Get_High(){TL1=0;TH1=0;TR1=1;while(Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================== main(){unsigned int temp;char i,j;Led_Index=1;TMOD=0x11;TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描EA=1;ET0=1;TR0=1;Led_Buf[0]=0;Led_Buf[1]=0;Led_Buf[2]=0;Led_Buf[3]=0; //显示区设成0do{restart:while(Ir_Pin);temp=Ir_Get_Low();if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000temp=Ir_Get_High();if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500for(i=0;i<4;i++) //4个字节for(j=0;j<8;j++) //每个字节8位{temp=Ir_Get_Low();if(temp<c(200) || temp>c(800)) goto restart; temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart; Ir_Buf[i]>>=1;if(temp>c(1120)) Ir_Buf[i]|=0x80;}Led_Buf[0]=Ir_Buf[2]&0xf;Led_Buf[1]=(Ir_Buf[2]/16)&0xf;Led_Buf[2]=Ir_Buf[3]&0xf;Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果}while(1);}。

红外遥控器C语言参考例程

红外遥控器C语言参考例程

红外遥控器C语言参考例程红外遥控器C语言参考例程#include#include#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};void delay(uchar x); //x*0.14MSvoid delay1(int ms);void beep();sbit IRIN = P3^2; //红外接收器数据线sbit BEEP = P1^5; //蜂鸣器驱动线sbit RELAY= P1^4; //继电器驱动线uchar IRCOM[7];sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EN = P2^7;uchar code cdis1[ ] = {" Red Control "};uchar code cdis2[ ] = {" IR-CODE: --H "};/************************************************************** *****/ /* */ /*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

*/ /* */ /****************************************************************** */bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);}/************************************************************** *****//* *//*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

红外遥控步进电机(C语言版)

红外遥控步进电机(C语言版)

课程设计任务书学生姓名:专业班级:电信0806指导教师:工作单位:信息工程学院题目: 单片机原理与应用课程设计——设计并实现红外遥控步进电机初始条件:(1)Proteus仿真软件或XL1000综合仿真试验仪一台;(2)先修课程:微机原理与接口技术、单片机原理。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)利用红外遥控器控制步进电机的动作,动作要有正、反方向转动;单步;连续;快慢等动作。

具体完成以下任务:1. 完成系统的方案设计,给出系统框图。

2. 完成系统的硬件设计,给出硬件电路图和系统资源分配表。

3. 完成系统的软件设计,给出程序流程图和程序清单。

4. 运用Proteus仿真软件对所设计的系统进行调试和仿真,直到预定的功能全部仿真通过,给出仿真结果;如果条件允许,将程序下载到XL1000综合仿真试验仪,验证系统功能。

5. 对所设计的系统进行性能分析(精度、实用性、成本等)。

完成课程设计报告。

时间安排:总体设计和硬件设计二天软件设计一天调试一天写报告,答辩一天参考书目:[1] 李群芳、张士军,单片微型计算机与接口技术, 电子工业出版社,2008[2] 张毅刚、彭喜元、董继成,单片机原理及应用,高等教育出版社,2004[3] 赵晓安,MCS-51单片机原理及应用,天津大学出版社,2001指导教师签名:年月日系主任(或责任教师)签名:年月日目录1系统设计原理 (1)1.1总体方案设计 (1)2主要模块设计 (2)2.1红外遥控及LED模块 (2)2.2 步进脉冲产生模块 (6)3系统硬件线路设计 (10)4系统软件设计 (11)5系统分配表 (13)6源程序 (14)7仿真分析 (15)8性能分析 (16)9心得及体会 (17)10参考文献 (18)附录一(红外控制程序) (19)1.系统设计原理:利用红外遥控器控制步进电机其实和用键盘控制步进电机原理类似,只不过按键是用导线传递键是否按下的信号,而红外则是利用LED发射红外线传递按键信息。

红外遥控控制步进电机程式(可用于军舰设计)

红外遥控控制步进电机程式(可用于军舰设计)

红外遥控控制步进电机程式(可⽤于军舰设计)Ps:本程序是军舰前端控制炮台部分,后端雷达扫描程序可以给我私信索取#include#define uint unsigned int#define uchar unsigned charsbit BEEP = P2^7; //蜂鸣器控制端⼝P36sbit moto0_bit=P2^6;sbit moto1_bit=P2^5;sbit led=P2^3;/**********采⽤四相⼋拍时序**********/uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//电机正转时序uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//电机反转时序uchar tmp;uchar irtime;uchar startflag;uchar irdata[33];uchar bitnum;uchar irreceok;uchar ircode[4];uchar irprosok;uchar disp[8];uchar moto0_zzflag;uchar moto0_fzflag;uchar moto1_zzflag;uchar moto1_fzflag;uchar ser_flag;uchar re[5];uint sp_dis;uint sz_dis;uint re_int[4];uint moto0_count;uint moto1_count;/*****************************************************函数功能:延时1ms***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若⼲毫秒⼊⼝参数:n***************************************************/void delay(uint n){uint i;for(i=0;idelay1ms();}/*********************************************************/ void beep() //蜂鸣器响⼀声函数{uchar i;for (i=0;i<100;i++){delay1ms();BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器delay(250); //延时}/**********步进电机0正转函数**********/ void moto0_zz(){uchar i;for(i=0;i<8;i++){P0=zz[i];delay(1);}}/**********步进电机0反转函数**********/ void moto0_fz() {uchar i;for(i=0;i<8;i++){P0=fz[i];delay(1);}}/**********步进电机1正转函数**********/ void moto1_zz() {uchar i;for(i=0;i<8;i++){P1=zz[i];delay(1);}}/**********步进电机1反转函数**********/ void moto1_fz() {uchar i;for(i=0;i<8;i++){P1=fz[i];delay(1);}}void timer0init(void){TMOD|=0x02;TH0=0x00;TL0=0x00;ET0=1;EA=1;TR0=1;}void serinit(){TMOD|=0x20;TH1=0xf3;TL1=0xf3;TR1=1;SM0=0;SM1=1;PCON=0x80;REN=1;EA=1;ES=1;}void send(uchar dat) { SBUF = dat;while(!TI);TI = 0;}void int0init(void){IT0=1;EX0=1;EA=1;}void irpros(void){uchar k,i,j;uchar value;k=1;for(j=0;j<4;j++){for(i=0;i<8;i++){value>>=1;if(irdata[k]>6){value=value | 0x80; }k++;}ircode[j]=value;}irprosok=1;}void main(){uint t;timer0init();int0init();serinit();for(t=0;t<512;t++) {if(moto0_bit==0) break;moto0_zz();}for(t=0;t<512;t++) {if(moto1_bit==0) break;moto1_fz();}while(1){。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计任务书学生姓名:专业班级:电信0806指导教师:工作单位:信息工程学院题目: 单片机原理与应用课程设计——设计并实现红外遥控步进电机初始条件:(1)Proteus仿真软件或XL1000综合仿真试验仪一台;(2)先修课程:微机原理与接口技术、单片机原理。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)利用红外遥控器控制步进电机的动作,动作要有正、反方向转动;单步;连续;快慢等动作。

具体完成以下任务:1. 完成系统的方案设计,给出系统框图。

2. 完成系统的硬件设计,给出硬件电路图和系统资源分配表。

3. 完成系统的软件设计,给出程序流程图和程序清单。

4. 运用Proteus仿真软件对所设计的系统进行调试和仿真,直到预定的功能全部仿真通过,给出仿真结果;如果条件允许,将程序下载到XL1000综合仿真试验仪,验证系统功能。

5. 对所设计的系统进行性能分析(精度、实用性、成本等)。

完成课程设计报告。

时间安排:总体设计和硬件设计二天软件设计一天调试一天写报告,答辩一天参考书目:[1] 李群芳、张士军,单片微型计算机与接口技术, 电子工业出版社,2008[2] 张毅刚、彭喜元、董继成,单片机原理及应用,高等教育出版社,2004[3] 赵晓安,MCS-51单片机原理及应用,天津大学出版社,2001指导教师签名:年月日系主任(或责任教师)签名:年月日目录1系统设计原理 (1)1.1总体方案设计 (1)2主要模块设计 (2)2.1红外遥控及LED模块 (2)2.2 步进脉冲产生模块 (6)3系统硬件线路设计 (10)4系统软件设计 (11)5系统分配表 (13)6源程序 (14)7仿真分析 (15)8性能分析 (16)9心得及体会 (17)10参考文献 (18)附录一(红外控制程序) (19)1.系统设计原理:利用红外遥控器控制步进电机其实和用键盘控制步进电机原理类似,只不过按键是用导线传递键是否按下的信号,而红外则是利用LED发射红外线传递按键信息。

由于红外采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”,在解码时通过判断高低电平持续时间的长短来识别发送的键值。

控制步进电机正、反方向转动、单步、连续、快慢等动作,原理其实并不困难。

步进电机将电脉冲信号转换成角位移,即给一个脉冲,步进电机就转动一个角度,转动的角度大小与施加的脉冲数成正比,因此,单步和连续的动作区别只是单片机给步进电机脉冲个数不同而已。

每按一次单步键就是给电机一个脉冲,而连续则是不断的给电机脉冲,达到连续运转的目的。

单片机的晶振为12MHz,单周期指令执行时间为1MHz,由于机械动作需要一定时间来完成,如果以这么快的速度来给脉冲,电机是不会转动的,因此,在两个脉冲之间必须要有一定时间差,电机才有时间来执行动作。

电机转动的速度与脉冲频率成正比,控制脉冲间隔时间就相当于控制了步进电机的转动角频率即快慢。

步进电机的转动需要向电机以一定的顺序分配驱动脉冲。

如四相单四拍,其脉冲分配的方式和顺序为A-B-C-D-A,如此周而复始,即可转动。

转动方向与脉冲顺序有关,如果给相反脉冲,那么电机就会反转。

1.1总体方案设计:根据该系统设计要求,需要通过红外遥控器按下按键和显示器来改变步进电机的运动状态以及显示,只需要红外遥控器中6个按键就可满足需求,外加8位LED数码显示管即可。

由于实验箱上只有8个连体数码管,因此需要动态扫描。

通过从键盘上输入正、反转命令,按键数值显示在数码管上,CPU再读取正、反转命令,加减速后执行。

经键盘可完成启动、停止、正转、反转、速度设置控制功能。

按下红外遥控器上的相关按钮电机执行相关动作,同时数码管上显示按键的数值,系统大部分都是软件实现的,整个设计框图如下:2主要模块设计:2.1红外遥控及LED模块:本模块应完成对红外遥控器有无键按下进行确认,当有键按下时,确定按键值,并根据所得键值进行处理(包括所按键是不是停止键还是执行键。

如是停止键,不断扫描键盘程序,等待执行键按下;如是执行键就启动产生步进电机控制信号程序)。

显示模块主要是完成在进行键盘按下时,显示输入的数据值(转矩数、转动方向、转动速率及运行方式)。

2.1.1红外遥控编解码原理:红外遥控系统由发射和接收两大部份组成,应用编/解码专用集成电路芯片来进行控制操作,如图1 所示。

发射部份包括键盘矩阵、编码调制、LED红外发送器;接收部份包括光、电转换放大器、解调、解码电路。

由于采用不同芯片其发送和接受的过程是不一样的,我们用的实验箱采用的是HT6221红外编码芯片,因此以HT6221为例来说明红外遥控器编码和解码原理。

1 HT6221 键码的形成当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。

这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。

当一个键按下超过36ms 振荡器使芯片激活如果这个键按下且延迟大约108ms,这108ms 发射代码由一个起始码9ms ,一个结果码4.5ms ,低 8 位地址码9ms~18ms ,高 8 位地址码9ms~18ms ,8 位数据码9ms~18ms 和这 8 位数据的反码9ms~18ms 组成如果键按下超过108ms 仍未松开接下来发射的代码连发代码将仅由起始码9ms 和结束码2.5ms 组成。

1.12ms为0,2.24ms 为1,如下图:每发送一个码,HT6221 会先送出一个9ms 的头码和4.5ms 的间隙,然后依次送出16 位的地址码(18ms~36ms)、8 位数据码(9ms~18ms)和8 位数据反码,如下图:注:代码宽度算法:16 位地址码的最短宽度:1.12 *16=18ms16 位地址码的最长宽度2.24ms *16=36ms易知 8 位数据代码及其8 位反代码的宽度和不变:(1.12ms+2.24ms)* 8=27ms32 位代码的宽度为18ms+27ms ~(36ms+27ms)2 代码格式(以接收代码为准,接收代码与发射代码反向)位定义单发代码格式3解码方法1.解码的关键是如何识别0 和 1 从位的定义我们可以发现0 1 均以 0.56ms的低电平开始不同的是高电平的宽度不同0 为 0.56ms, 1 为 1.68ms,所以必须根据高电平的宽度区别0 和 1 如果从 0.56ms 低电平过后开始延时0.56ms 以后若读到的电平为低说明该位为0 反之则为1 为了可靠起见延时必须比0.56ms 长些但又不能超过1.12ms,否则如果该位为0 读到的已是下一位的高电平因此取1.12ms+0.56ms /2=0.84ms 最为可靠一般取0.84ms2.根据码的格式应该等待9ms 的起始码和4.5ms 的结果码完成后才能读码左右均可这样接收到的仅仅是普通的代码要得到标准的键值还必须进行代码识别和代码转换2.1.2 LED部分:共阳接法:低电平亮,高电平灭数码管部分 JP5(控制数码管的8段)JP8(输入高电平选中相应的数码管)数码管实际上是由7个发光管组成的8字形构成的,加上小数点就是8个。

分别把它命名为ABCDEFGH,由于接法是共阳接法,所以低电平是亮,高电平是灭。

例如,要显示一个数字2则是C、F、H(小数点)不亮,P0.0-P0.7控制数码管的8段,0为亮,1为灭,从高往低排列,P0.0-P0.7写成二进制为10100010,把它转化为十六进制数为A2H,当然在此之前,还必须指定哪一个数码管亮。

原理图中把所有数码管的a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受IO线控制。

CPU向字段输出口送出字形码,所有显示器接收到相同的字形码,由8个PNP的三极管,来控制这8位哪位工作如果要选中第一位,只需将该位清零即可。

所有数码管的8个笔划段a-h同名端连在一起,在这种接法中同一瞬间所有的数码管显示都是相同的,不能显示不同的数字。

在单片机里,首先显示一个数,然后关掉,然后显示第二个数,又关掉,那么将看到连续的数字显示,轮流点亮扫描过程中,每个显示器的点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余晖效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会由闪烁感。

特别说明:实验箱采用的数码管较为特殊,和一般的共阴、共阳数码管都不一样,在Proteus中共阳数码管给高电平才表示选中,而实验箱采用低电平选中,各字段表也不一样。

如一般共阳给"C0H"表示"0",但实验箱需要给"28H",为了仿真的需要,后面的程序均采用的是一般共阳数码管写法,在实验箱上调试程序时进行了变更!2.2步进脉冲产生模块:步进电机原理说明2.2.1基本原理通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。

该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。

当定子的矢量磁场旋转一个角度。

转子也随着该磁场转一个角度。

每输入一个电脉冲,电动机转动一个角度前进一步。

它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。

改变绕组通电的顺序,电机就会反转。

所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。

这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。

使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。

它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

目前,生产步进电机的厂家的确不少,但具有专业技术人员,能够自行开发,研制的厂家却非常少,大部分的厂家只一、二十人,连最基本的设备都没有。

仅仅处于一种盲目的仿制阶段。

这就给户在产品选型、使用中造成许多麻烦。

签于上述情况,我们决定以广泛的感应子式步进电机为例。

叙述其基本工作原理。

望能对广大用户在选型、使用、及整机改进时有所帮助。

相关文档
最新文档