基于单片机的电机测速及显示专业课程设计.doc
《基于单片机的电机测速及显示专业课程设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的电机测速及显示专业课程设计.doc(50页珍藏版)》请在咨信网上搜索。
单片机创新设计报告 设计题目: 基于单片机电机测速及显示 学 院: 机电工程学院 专 业: 测控技术与仪器 班级学号: 071 姓 名: 董新彬 同组人员: 李爽、朱浩波 指引教师: 王军 冯梅林 设计时间: 、10、10--、10、30 单片机简介 2 1.1单片机历史 2 1.2 AT89C51重要特性 3 1.3管脚阐明 4 1.4振荡器特性 7 1.5芯片擦除 7 二、硬件电路设计 8 2.1 AT89C51下载器某些 8 2.2电机驱动某些 11 三、程序设计 16 3.1 下载器程序 16 3.2电机测速程序 24 四、总结 37 五、参照文献 38 单片机简介 单片机又称单片微控制器,它不是完毕某一种逻辑功能芯片,而是把一种计算机系统集成到一种芯片上。概括讲:一块芯片就成了一台计算机。它体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同步,学习使用单片机理解计算机原理与构造最佳选取。 1.1单片机历史 1)第一阶段(1976-1978):单片机控索阶段。以Intel公司MCS – 48为代表。MCS – 48推出是在工控领域控索,参加这一控索公司尚有Motorola 、Zilog等,都获得了满意效果。这就是SCM诞生年代,“单机片”一词即由此而来。 2)第二阶段(1978-1982)单片机完善阶段。Intel公司在MCS – 48 基本上推出了完善、典型单片机系列MCS –51。它在如下几种方面奠定了典型通用总线型单片机体系构造。 ①完善外部总线。MCS-51设立了典型8位单片机总线构造,涉及8位数据总线、16位地址总线、控制总线及具备诸多机通信功能串行通信接口。 ②CPU外围功能单元集中管理模式。 ③体现工控特性位地址空间及位操作方式。 ④指令系统趋于丰富和完善,并且增长了许多突出控制功能指令。 3)第三阶段(1982-1990):8位单片机巩固发展及16位单片机推出阶段,也是单片机向微控制器发展阶段。Intel公司推出MCS – 96系列单片机,将某些用于测控系统模数转换器、程序运营监视器、脉宽调制器等纳入片中,体现了单片机微控制器特性。随着MCS – 51系列广应用,许多电气厂商竞相使用80C51为内核,将许多测控系统中使用电路技术、接口技术、多通道A/D转换部件、可靠性技术等应用到单片机中,增强了外围电路路功能,强化了智能控制特性。 4)第四阶段(1990—):微控制器全面发展阶段。随着单片机在各个领域全面进一步地发展和应用,浮现了高速、大寻址范畴、强运算能力8位/16位/32位通用型单片机,以及小型便宜专用型单片机 1.2 AT89C51重要特性 ·与MCS-51 兼容 ·4K字节可编程闪烁存储器 ·寿命:1000写/擦循环 ·数据保存时间: ·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位定期器/计数器 ·5个中断源 ·可编程串行通道 ·低功耗闲置和掉电模式 ·片内振荡器和时钟电路 1.3管脚阐明 VCC:供电电压。 GND:接地。 P0口:P0口为一种8位漏级开路双向I/O口,每脚可吸取8TTL门电流。当P1口管脚第一次写1时,被定义为高阻输入。P0可以用于外部程序数据存储器,它可以被定义为数据/地址第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必要被拉高。 P1口:P1口是一种内部提供上拉电阻8位双向I/O口,P1口缓冲器能接受输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉缘故。在FLASH编程和校验时,P1口作为第八位地址接受。 P2口:P2口为一种内部上拉电阻8位双向I/O口,P2口缓冲器可接受,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因而作为输入时,P2口管脚被外部拉低,将输出电流。这是由于内部上拉缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址高八位。在给出地址“1”时,它运用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器内容。P2口在FLASH编程和校验时接受高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻双向I/O口,可接受输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉缘故。 P3口也可作为AT89C51某些特殊功能口,如下表所示: P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同步为闪烁编程和编程校验接受某些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存容许输出电平用于锁存地址地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变频率周期输出正脉冲信号,此频率为振荡器频率1/6。因而它可用作对外部输出脉冲或用于定期目。然而要注意是:每当用作外部数据存储器时,将跳过一种ALE脉冲。如想禁止ALE输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。此外,该引脚被略微拉高。如果微解决器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效/PSEN信号将不浮现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不论与否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器输入及内部时钟工作电路输入。 XTAL2:来自反向振荡器输出。 1.4振荡器特性 XTAL1和XTAL2分别为反向放大器输入和输出。该反向放大器可以配备为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一种二分频触发器,因而对外部时钟信号脉宽无任何规定,但必要保证脉冲高低电平规定宽度。 1.5芯片擦除 整个PEROM阵列和三个锁定位电擦除可通过对的控制信号组合,并保持ALE管脚处在低电平10ms 来完毕。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程此前,该操作必要被执行。 此外,AT89C51设有稳态逻辑,可以在低到零频率条件下静态逻辑,支持两种软件可选掉电模式。在闲置模式下,CPU停止工作。但RAM,定期器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM内容并且冻结振荡器,禁止所用其她芯片功能,直到下一种硬件复位为止。 二、硬件电路设计 2.1 AT89C51下载器某些 SP-51Pro(即Easy51pro)编程器可以烧录Atmel公司系列单片机芯片,具备性能稳定,烧录速度快,性价比高等长处。产品性能简介如下: ⑴支持芯片 支持当前最为典型和市场占有量最大ATMEL公司生产AT89C51、C52、C55和最新S51、S52;AT89C1051、2051、4051等芯片。 ⑵产品特点 1.使用串口通讯,芯片自动鉴别,编程过程中擦除、烧写、校验各种操作完全由编程器上监控芯片89C51控制,不受PC配备及其主频影响,因而烧写成功率高可以达到100%,烧写速度不久并且烧写速度和微机档次无关。 2.采用57600高速波特率进行数据传送,编程速度可以和普通并行编程器相媲美,经测试,烧写一片4K ROMAT89C51仅需要9.5S,而读取和校验仅需要3.5S。 3.体积小巧,省去笨重外接电源适配器,直接使用USB端口5V电源,携带以便,非常初学者学习51单片机规定。 4.软件界面和谐,菜单、工具栏、快捷键齐全,全中文操作,提供加密功能,可以保护您创作产权。可以说是麻雀虽小,五脏俱全! 5.功能完善,具备编程、读取、校验、空检查、擦除、加密等系列功能; 6.40pin和20pin锁紧插座,所有器件所有以第一脚对齐,无附加跳线,对于DIP封装芯片无需任何适配器; 7.采用优质万用锁紧插座,和接触不良等问题彻底说再会,可烧写40脚单片机芯片和20脚单片机芯片 8.改进烧写深度保证每一片C51系列芯片重复烧写次数都能达到1000以上!内部数据至少保存。 9.由于采用了9针传口通讯,这样一来就不会再和打印机抢一种打印口,随时随处想烧就烧,让芯片编程成为一种高兴! (3)硬件连接 1.通讯电缆与编程器连接好, 2.将串口插头插入电脑串口, 3.USB插头插入电脑任一种USB口,此时编程器上LED点亮,表白电源接通。 4.接着安装软件,本软件支持Win9x/me//NT,原则Window操作界面。本软件属于绿色软件,不需要安装,直接把有关软件拷贝到硬盘中,运营其中Easy 51Pro 2_0程序即可。 ⑷ 软件使用 程序启动后,会自动检测硬件及连接,状态框中显示“就绪”字样,表达编程器连接和设立均正常。否则请检查硬件连接和端口设立。 把单片机芯片对的地放到编程器相应插座上,注意,芯片缺口要朝向插座把手方向。 芯片放好后,就可以对芯片进行读写操作了,读写操作按下面环节进行: 1、程序运营,请先选取器件(点下选框) 2、用“打开文献”选取打开要编写.HEX 和 .BIN 文献 3、用“保存文献”可以保存读出来文献 4、用“擦除器件”擦除芯片 5、用“写器件”编程 6、用“读器件”读取芯片中程序,加密读不出来 7、用“校验数据”检查编程对的与否 8、用“自动完毕”自动执行以上各环节 9、用“加密”选取加密级数2.12电机驱动某些 2.2电机驱动某些 图4-3中所示为一种典型直流电机控制电路。电路得名于“H桥驱动电路”是由于它形状酷似字母H。4个三极管构成H4条垂直腿,而电机就是H中横杠(注意:图4.12及随后两个图都只是示意图,而不是完整电路图,其中三极管驱动电路没有画出来)。 如图所示,H桥式电机驱动电路涉及4个三极管和一种电机。要使电机运转,必要导通对角线上一对三极管。依照不同三极管对导通状况,电流也许会从左至右或从右至左流过电机,从而控制电机转向。 图4-3 H桥简易驱动电路 要使电机运转,必要使对角线上一对三极管导通。例如,如图4-4所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。按图中电流箭头所示,该流向电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周边箭头批示为顺时针方向)。 图4-4 H桥电路驱动电机顺时针转动 图4-5所示为另一对三极管Q2和Q3导通状况,电流将从右至左流过电机。当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周边箭头表达为逆时针方向)。 图4-5 H桥驱动电机逆时针转动 驱动电机时,保证H桥上两个同侧三极管不会同步导通非常重要。如果三极管Q1和Q2同步导通,那么电流就会从正极穿过两个三极管直接回到负极。此时,电路中除了三极管外没有其她任何负载,因而电路上电流就也许达到最大值(该电流仅受电源性能限制),甚至烧坏三极管。基于上述因素,在实际驱动电路中普通要用硬件电路以便地控制三极管开关。 图4-6 所示就是基于这种考虑改进电路,它在基本H桥电路基本上增长了4个与门和2个非门。4个与门同一种“使能”导通信号相接,这样,用这一种信号就能控制整个电路开关。而2个非门通过提供一种方向输人,可以保证任何时候在H桥同侧腿上都只有一种三极管能导通。(与本节前面示意图同样,图4.15所示也不是一种完整电路图,特别是图中与门和三极管直接连接是不能正常工作。) 图4-6 具备使能控制和方向逻辑H桥电路 采用以上办法,电机运转就只需要用三个信号控制:两个方向信号和一种使能信号。如果DIR-L信号为0,DIR-R信号为1,并且使能信号是1,那么三极管Q1和Q4导通,电流从左至右流经电机(如图4.-7所示);如果DIR-L信号变为1,而DIR-R信号变为0,那么Q2和Q3将导通,电流则反向流过电机。 图4-7 使能信号与方向信号使用 实际使用时候,用分立元件制作H桥是很麻烦,好在当前市面上有诸多封装好H桥集成电路,接上电源、电机和控制信号就可以使用了,在额定电压和电流内使用非常以便可靠。例如惯用L293D、L298N、TA7257P、SN754410等。 三、程序设计 3.1 下载器程序 #include <E51Pro.h> BYTE ComBuf[18];//串口通讯数据缓存,发送和接受都使用 UINT nAddress;//ROM中地址计数 UINT nTimeOut;//超时计数 ProWork pw;//编程器普通操作 void Delay_us(BYTE nUs)//微秒级延时<255us { TH0=0; TL0=0; TR0=1; while(TL0<nUs)//运用T0做定期计数器,循环采样,直到达到定期值 { } TR0=0; }void Delay_ms(UINT nMs)//豪秒级延时<65535ms { UINT n=0; TR0=1; while(n<nMs)////运用T0做定期计数器,循环采样,直到达到定期值 { TH0=0; TL0=20; while(TH0<4) { } n++; } TR0=0; } BOOL WaitComm()//等待上位机命令,18字节 { BYTE n=0; RI=0; while(!RI){}//等待第一种字节 ComBuf[n]=SBUF; RI=0; n++; for(n;n<=17;n++) { nTimeOut=0; while(!RI) { nTimeOut++; if(nTimeOut>10000)//后17个字节均有超时限制 return 0; } ComBuf[n]=SBUF; RI=0; } return 1; } BOOL WaitResp()//等待上位机回应,1字节,有超时限制 { nTimeOut=0; RI=0; while(!RI) { nTimeOut++; if(nTimeOut>50000) { return 0; } } RI=0; ComBuf[0]=SBUF; return 1; } BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制 { BYTE n; RI=0; for(n=0;n<=17;n++) { nTimeOut=0; while(!RI) { nTimeOut++; if(nTimeOut>10000) { return 0; } } RI=0; ComBuf[n]=SBUF; } return 1; } void SendData()//发送数据或回应操作完毕,18字节 { BYTE n=0; for(n;n<=17;n++) { TI=0; SBUF=ComBuf[n]; while(!TI){} TI=0; } } void SendResp()//回应上位机1个字节,在写器件函数中使用 { TI=0; SBUF=ComBuf[0]; while(!TI){} TI=0; } void SetVpp5V()//设立Vpp为5v { P3_4=0; P3_3=0; } void SetVpp0V()//设立Vpp为0v { P3_3=0; P3_4=1; } void SetVpp12V()//设立Vpp为12v { P3_4=0; P3_3=1; } void RstPro()//编程器复位 { pw.fpProOver();//直接编程结束 SendData();//告知上位机,表达编程器就绪,可以直接用此函数由于合同号(ComBuf[0])还没被修改,下同 } void ReadSign()//读特性字 { pw.fpReadSign(); SendData();//告知上位机,送出读出器件特性字 } void Erase()//擦除器件 { pw.fpErase(); SendData();//告知上位机,擦除了器件 } void Write()//写器件 { BYTE n; pw.fpInitPro();//编程前准备工作 SendData();//回应上位机表达进入写器件状态,可以发来数据 while(1) { if(WaitData())//如果等待数据成功 { if(ComBuf[0]==0x07)//判断与否继续写 { for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块 { if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一种单元函数 { pw.fpProOver();//出错了就结束编程 ComBuf[0]=0xff; SendResp();//回应上位机一种字节,表达写数据出错了 WaitData();//等待上位机回应后就结束 return; } nAddress++;//下一种单元 } ComBuf[0]=1;//回应上位机一种字节,表达数据块顺利完毕,祈求继续 SendResp(); } else if(ComBuf[0]==0x00)//写器件结束 break; else//也许是通讯出错了 { pw.fpProOver(); return; } } else//等待数据失败 { pw.fpProOver(); return; } } pw.fpProOver();//编程结束后工作 Delay_ms(50);//延时等待上位机写线程结束 ComBuf[0]=0;//告知上位机编程器进入就绪状态 SendData(); } void Read()//读器件 { BYTE n; pw.fpInitPro();//先设立成编程状态 SendData();//回应上位机表达进入读状态 while(1) { if(WaitResp())//等待上位机回应1个字节 { if(ComBuf[0]==0)//ComBuf[0]==0表达读结束 { break; } else if(ComBuf[0]==0xff)//0xff表达重发 { nAddress=nAddress-0x0010; } for(n=2;n<=17;n++)//ComBuf[2~17]保存读出数据块 { ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一种单元函数 nAddress++;//下一种单元 } ComBuf[0]=6;//向上位机发送读出数据块 SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设立为运营状态 ComBuf[0]=0;//告知上位机编程器进入就绪状态 SendData(); } void Lock()//写锁定位 { pw.fpLock(); SendData(); } 所支持FID,请在这里继续添加 extern void PreparePro00();//FID=00:AT89C51编程器 extern void PreparePro01();//FID=01:AT89C2051编程器 extern void PreparePro02();//FID=02:AT89S51编程器 void main() { SP=0x60; SetVpp5V();//先初始化Vpp为5v SCON=0x00; TCON=0x00; //PCON=0x00;//波特率*2 IE=0x00; //TMOD:GATE|C/!T|M1|M0|GATE|C/!T|M1|M0 // 0 0 1 0 0 0 0 1 TMOD=0x21;//T0用于延时程序 TH1=0xff; TL1=0xff;//波特率28800*2,注意PCON //SCON:SM0|SM1|SM2|REN|TB8|RB8|TI|RI // 0 1 0 1 0 0 0 0 SCON=0x50; TR1=1; Delay_ms(1000);//延时1秒后编程器自举 ComBuf[0]=0; SendData(); while(1)//串口通讯采用查询方式 { if(!WaitComm())//如果超时,通讯出错 { Delay_ms(500); ComBuf[0]=0;//让编程器复位,使编程器就绪 } switch(ComBuf[1])//依照FID设立(ProWork)pw中函数指针 { case 0://at89c51编程器 PreparePro00(); break; case 1://at89c2051编程器 PreparePro01(); break; case 2://at89s51编程器 PreparePro02(); break; //case 3:支持新器件时,请继续向下添加 // break; //case 4: // break; default: ComBuf[0]=0xff; ComBuf[1]=0xff;//表达无效操作 break; } switch(ComBuf[0])//依照操作ID跳到不同操作函数 { case 0x00: RstPro();//编程器复位 break; case 0x01: ReadSign();//读特性字 break; case 0x02: Erase();//擦除器件 break; case 0x03: Write();//写器件 break; case 0x04: Read();//读器件 break; case 0x05: Lock();//写锁定位 break; default: SendData(); break; } } } 3.2电机测速程序 /* LED.C 128×64 LED驱动程序头文献 */ #ifndef LED_H_ #define LED_H_ #include<REG51.H> //定义背光控制信号 sbit LED_BL=P1^4; //点亮背光灯 void LEDLightOn(); //熄灭背光灯 void LEDLightOff(); //清屏 void LEDClear(); //初始化 void LEDInit(); //显示ASCⅡ码 void LEDPutChar(unsigned char c); //显示字符串 void LEDPuts(unsigned char*s); #endif //LED_H_ /* LED.C 128×64 LED驱动程序 */ #include <INTRINS.H> #include <ABSACC.H> //#include "LED.H" //定义屏幕光标(取值0~63,光标自身不可见) unsigned char LEDCursor; int i,j; /* 函数:LEDLightOn() 功能:点亮背光灯 */ void LEDLightOn() { LED_BL = 1; } /* 函数:LEDLightOff() 功能:熄灭背光灯 */ void LEDLightOff() { LED_BL = 0; } /* 函数:LEDGetBF() 功能:读出状态位BF 返回: BF=1,表达忙,不可进行任何操作 BF=0,表达不忙,可以进行正常操作 */ bit LEDGetBF() { unsigned char dat; dat = XBYTE[0xD002]; //XBYTE定义见<ABSACC.H> return (bit)(dat & 0x80); } /* 函数:LEDWriteCmd() 功能:向LED发送命令 参数: cmd:命令字,详见器件数据手册 */ void LEDWriteCmd(unsigned char cmd) { while ( LEDGetBF() ); XBYTE[0xD000] = cmd; } /* 函数:LEDWriteDat() 功能:向LED写入数据 参数:dat,要写入数据 阐明:目的地址由地址计数器AC隐含指定,写完后AC自动加1 */ void LEDWriteDat(unsigned char dat) { while ( LEDGetBF() ); XBYTE[0xD001] = dat; } /* 函数:LEDReadDat() 功能:从LED读出数据 返回:读出数据 */ /* unsigned char LEDReadDat() { volatile unsigned char dat; while ( LEDGetBF() ); dat = XBYTE[0xD003]; dat = XBYTE[0xD003]; //需要持续执行两次才可以读出真正数据 return dat; } */ /* 函数:LEDSetAC() 功能:设立DDRAM(显示数据RAM)AC(地址计数器)值 参数: ac:地址计数器值,范畴0~63 */ void LEDSetAC(unsigned char ac) { ac &= 0x3F; ac |= 0x80; LEDWriteCmd(ac); } /* 函数:LEDClear() 功能:LED清屏,并使光标回到0 */ void LEDClear() { LEDWriteCmd(0x01); //清屏命令 LEDCursor = 0; } /* 函数:LEDDelay() 功能:延时(t*100)个机器周期 */ void LEDDelay(unsigned char t) { unsigned char n; do { n = 49; while ( --n != 0 ); } while ( --t != 0 ); } /* 函数:LEDInit() 功能:LED初始化 */ void LEDInit() { LEDWriteCmd(0x30); //设立基本指令集 LEDDelay(3); LEDWriteCmd(0x30); //设立基本指令集(需要再执行一次) LEDDelay(1); LEDWriteCmd(0x0C); //启动显示 LEDDelay(3); LEDClear(); //清屏 LEDDelay(250); LEDWriteCmd(0x06); //设立进入点 LEDDelay(10); } /* 函数:LEDCheckAC() 功能:依照光标位置调节AC */ void LEDCheckAC() { switch ( LEDCursor ) { case 16: LEDSetAC(16); break; case 32: LEDSetAC(8); break; case 48: LEDSetAC(24); break; case 64: LEDCursor = 0; LEDSetAC(0); break; default: break; } } /* 函数:LEDPutChar() 功能:显示ASCII码 参数: c为可显示ASCII码(0x20~0x7F) */ void LEDPutChar(unsigned char c) { LEDWriteDat(c); LEDCursor++; LEDCheckAC(); } /* 函数:LEDPutHZ() 功能:显示中文 参数: ch,cl:中文编码 */ void LEDPutHZ(unsigned char ch,unsigned char cl) { if ( LEDCursor & 0x01 ) {//显示中文时,必要偶地址对准,即光标位置不能是奇数 LEDPutChar(' '); //额外输出一种空格 } LEDWriteDat(ch); LEDWriteDat(cl); LEDCursor += 2; LEDCheckAC(); } /* 函数:LEDPuts() 功能:显示字符串 参数: *s:要显示字符串(可同步包括ASCII码和中文) */ void LEDPuts(unsigned char *s) { unsigned char ch,cl; for (;;) { ch = *s++; if ( ch == '\0' ) break; if ( ch < 0x80 ) { LEDPutChar(ch); } else { cl = *s++; LEDPutHZ(ch,cl); } } } /* 显示主程序 */ //#include"LED.H" #include<REG51.H> //#include "DELAY.H" /* 包括延时函数头部文献delay_us();delay_ms(); */ /* 函数:Delay() 延时1ms 65.53s t>0时,延时(t*0.001)s t=0时。延时65.53s */ /********************************************************/ unsigned char SD[4]={'1','2','3','4'};//速度设定 unsigned char FK[4]={'2','2','3','4'};//速度反馈 int D=0;//方向控制中间变量 unsigned int Pwm=0;//速度产生中间变量 unsigned int p=0; unsigned int Value=0; unsigned int Pwm_Value=0; unsigned int m; //unsigned int a,b,c,d; sbit KEY1=P2^0; sbit KEY2=P2^1; sbit KEY3=P2^2; sbit MotorA=P1^6; sbit MotorB=P1^7; bit SWTR; bit SWTF; unsigned int SWTV; #define Pwm_MAX 255 void Delay(unsigned int T) { SWTV=T; SWTR=1; while(!SWTF); SWTR=0; SWTF=0; } void KEY() { if(KEY1==0) { Value=Value+1; } if(KEY2==0) { Value=Value-1; } if(Value>255) Value=255; if(Value<0) Value=0; if(KEY3==0) { if(D==0) { D=1; } else { D=0; } } } void PWM_Init() { static unsigned char t=0; t++; if(t>Pwm_MAX)t=0; if(t<=Pwm_Value) { Pwm=1; } else { Pwm=0; } if(D==0) { MotorA=0; MotorB=Pwm;- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电机 测速 显示 专业课程 设计
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文