① 如何使usb游戏手柄与单片机通信,当手柄上的某位按键按下后,单片机的某个发光二极管点亮
既然硬件都连接起了,接下来就给单片机编程啊,接收USB信号,然后做出相应的动作。
如果不知道手柄每个键的信号的话,可以做个测试程序,让单片机接收到信息后,通过RS232串口发送信息到电脑上,用串口助手工具来查看手柄的各个按键的编码啊。得到编码后,还不简单了吗?
若知道手柄的按键码的话,单片机就只需USB和手柄通信就成了,就不需要MAX232了。直接用FT232搭成USB接口和手柄通信就行了
② 51单片机c语言如何把浮点型转为字符串
使用stdio.h中的sprintf函数转化即可:
#include<stdio.h>
floata=1.234;
charstr[10];
sprintf(str,"%f",a);
③ 单片机的最小系统晶振电路的两个电阻作用,为什么
晶振电路需要2个10-30pF级别的电容作为起振用途,10-30pF具体的值根据不同的晶振频率不同的单片机而有所不同,作用都是使晶振起振,如果去掉这2个电容,晶振就不会起振,就没有频率输出,单片机就不会工作。这样说你懂了吗?
也有串并连电阻的案例,正常我们不需要那么做,官方的Deom里也是没有的,以下内容来自网络,讲解的很详细,你可以自习读读,以后对这部分电路会有更详细的认识。
一份电路在其输出端串接了一个22K的电阻,在其输出端和输入端之间接了一个10M的电阻,这是由于连接晶振的芯片端内部是一个线性运算放大器,将输入进行反向180度输出,晶振处的负载电容电阻组成的网络提供另外180度的相移,整个环路的相移360度,满足振荡的相位条件,同时还要求闭环增益大于等于1,晶体才正常工作。
晶振输入输出连接的电阻作用是产生负反馈,保证放大器工作在高增益的线性区,一般在M欧级,输出端的电阻与负载电容组成网络,提供180度相移,同时起到限流的作用,防止反向器输出对晶振过驱动,损坏晶振。
和晶振串联的电阻常用来预防晶振被过分驱动。晶振过分驱动的后果是将逐渐损耗减少晶振的接触电镀,这将引起频率的上升,并导致晶振的早期失效,又可以讲drive level调整用。用来调整drive level和发振余裕度。
Xin和Xout的内部一般是一个施密特反相器,反相器是不能驱动晶体震荡的.因此,在反相器的两端并联一个电阻,由电阻完成将输出的信号反向 180度反馈到输入端形成负反馈,构成负反馈放大电路.晶体并在电阻上,电阻与晶体的等效阻抗是并联关系,自己想一下是电阻大还是电阻小对晶体的阻抗影响小大?
电阻的作用是将电路内部的反向器加一个反馈回路,形成放大器,当晶体并在其中会使反馈回路的交流等效按照晶体频率谐振,由于晶体的Q值非常高,因此电阻在很大的范围变化都不会影响输出频率。过去,曾经试验此电路的稳定性时,试过从100K~20M都可以正常启振,但会影响脉宽比的。
晶体的Q值非常高, Q值是什么意思呢? 晶体的串联等效阻抗是 Ze = Re + jXe, Re<< |jXe|, 晶体一般等效于一个Q很高很高的电感,相当于电感的导线电阻很小很小。Q一般达到10^-4量级。
避免信号太强打坏晶体的。电阻一般比较大,一般是几百K。
串进去的电阻是用来限制振荡幅度的,并进去的两颗电容根据LZ的晶振为几十MHZ一般是在20~30P左右,主要用与微调频率和波形,并影响幅度,并进去的电阻就要看 IC spec了,有的是用来反馈的,有的是为过EMI的对策
可是转化为 并联等效阻抗后,Re越小,Rp就越大,这是有现成的公式的。晶体的等效Rp很大很大。外面并的电阻是并到这个Rp上的,于是,降低了Rp值 -----> 增大了Re -----> 降低了Q
精确的分析还可以知道,对频率也会有很小很小的影响。
总结并联电阻的四大作用:
1、配合IC内部电路组成负反馈、移相,使放大器工作在线性区;
2、限流防止谐振器被过驱;
3、并联降低谐振阻抗,使谐振器易启动;
4、电阻取值影响波形的脉宽。
有源晶振与无源晶振以及无源晶振起振电容的选择:
无源晶振(Crystal):内只有一片按一定轴向切割的石英晶体薄片,供接入运放(或微处理器的Xtal端)以形成振荡。(依靠配合其他IC内部振荡电路工作)
有源晶振(Oscillator):内带运放,工作在最佳状态,送入电源后,可直接输出一定频率的等副正弦波。(晶振+振动电路,封装在一起,加上电源,就有波形输出)
1.无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来 无源晶振需要用DSP片内的振荡器,在datasheet上有建议的连接方法。无源晶振没有电压的问题,信号电平是可变的,也就是说是根据起振电路来决定的,同样的晶振可以适用于多种电压,可用于多种不同时钟信号电压要求的DSP,而且价格通常也较低,因此对于一般的应用如果条件许可建议用晶体,这尤其适合于产品线丰富批量大的生产者。无源晶振相对于晶振而言其缺陷是信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置电路需要做相应的调整。使用时建议采用精度较高的石英晶体,尽可能不要采用精度低的陶瓷晶体。
2.有源晶振有4只引脚,是一个完整的振荡器,里面除了石英晶体外,还有晶体管和阻容元件 。有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,价格相对较高。对于时序要求敏感的应用,还是有源的晶振好,因为可以选用比较精密的晶振,甚至是高档的温度补偿晶振。有些DSP内部没有起振电路,只能使用有源的晶振,如TI的6000系列等。有源晶振相比于无源晶体通常体积较大,但现在许多有源晶振是表贴的,体积和晶体相当,有的甚至比许多晶体还要小。
在电子学上,通常将含有晶体管元件的电路称作“有源电路”(如有源音箱、有源滤波器等),而仅由阻容元件组成的电路称作“无源电路”。电脑中的晶体振荡器也分为无源晶振和有源晶振两种类型。无源晶振与有源晶振的英文名称不同,无源晶振为crystal(晶体),而有源晶振则叫做oscillator(振荡器)。无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来,所以“无源晶振”这个说法并不准确;有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。
有源晶振型号纵多,而且每一种型号的引脚定义都有所不同,接发也不同,下面我介绍一下有源晶振引脚识别,以方便大家
有个点标记的为1脚,按逆时针(管脚向下)分别为2、3、4。
有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。
有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。
有源晶振是右石英晶体组成的,石英晶片之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。
压电谐振状态的建立和维持都必须借助于振荡器电路才能实现。图3是一个串联型振荡器,晶体管T1和T2构成的两级放大器,石英晶体XT与电容C2构成LC电路。在这个电路中,石英晶体相当于一个电感,C2为可变电容器,调节其容量即可使电路进入谐振状态。该振荡器供电电压为5V,输出波形为方波。
有源晶振型号纵多,而且每一种型号的引脚定义都有所不同,接发也不同,下面我介绍一下有源晶振引脚识别,以方便大家
有个点标记的为1脚,按逆时针(管脚向下)分别为2、3、4。
有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。
有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。
有源晶振是右石英晶体组成的,石英晶片之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。
压电谐振状态的建立和维持都必须借助于振荡器电路才能实现。
石英晶体振荡器的频率稳定度可达10^-9/日,甚至10^-11。例如10MHz的振荡器,频率在一日之内的变化一般不大于0.1Hz。因此,完全可以将晶体振荡器视为恒定的基准频率源(石英表、电子表中都是利用石英晶体来做计时的基准频率)。从PC诞生至现在,主板上一直都使用一颗14.318MHz的石英晶体振荡器作为基准频率源。 主板上除了这颗14.318MHz的晶振,还能找到一颗频率为32.768MHz的晶振,它被用于实时时钟(RTC)电路中,显示精确的时间和日期
方形有源晶振引脚分布:
1、正方的,使用DIP-8封装,打点的是1脚。
1-NC; 4-GND; 5-Output; 8-VCC
2、长方的,使用DIP-14封装,打点的是1脚。
1-NC; 7-GND; 8-Output; 14-VCC
BTW:
1、电源有两种,一种是TTL,只能用5V,一种是HC的,可以3.3V/5V
2、边沿有一个是尖角,三个圆角,尖角的是一脚,和打点一致。
Vcc out
NC(点) GND
现在提供一些实际数据:
测试样品为TOYOCOM的711SC 1.000M的输出频率,1脚悬空,2脚接地,3脚输出,4叫接+5V;
1.4V就开始起振,峰值电压1.64V,但是工作频率会有一定的偏差;3V时峰值电压3.24V,工作频率1.000M,输出频率准确;5V时峰值电压为5.6V,工作频率1.000M,输出频率准确
关于晶振的匹配电容问题
晶振还是晶体?
晶振的话好像不用电容吧?
晶体的话0.1u和0.01u的电容有些大了,
一般应该100p到20p之间
nod
晶振的标称值在测试时有一个“负载电容”的条件,在工作时满足这个条件,振荡频率才与标称值一致。一般来讲,有低负载电容(串联谐振晶体)
高负载电容(并联谐振晶体)之分。在电路上的特征为:晶振串一只电容跨接在IC两只脚上的,则为串联谐振型;一只脚接IC,一只脚接地的,则为并联型。如确实没有原型号,需要代用的可采取串联谐振型电路上的电容再并一个电容,并联谐振电路上串一只电容的措施。例如:4.433MHz晶振,并一只3300PF电容或串一只70P的微调电容。另一种说法是“损耗值”与“激励电平”之说:
其实,上述原因都可以作为选择晶振的条件作为考虑。
常见的晶振大多是二只脚,3脚的晶振是一种集晶振和电容为一体的复合元件。由于在集成电路振荡端子外围电路中总是以一个晶振(或其它谐振元件)和两个电容组成回路,为便于简化电路及工艺,人们便研制生产了这种复合件。其3个引脚中,中间的1个脚通常是2 个电容连接一起的公共端,另外2个引脚即为晶振两端,也是两个电容各自与晶振连接的两端。由此可见,这种复合件可用一个同频率晶振和两个100~200pF的瓷片电容按常规连接后直接予以代换。
*********************************************************************************
怎样选择一款合适的晶体振荡器21ic.com
发信站: 瀚海星云 (2003年11月04日10:18:05 星期二), 站内信件
---- 本文介绍了一些足以表现出一个晶体振荡器性能高低的技术指标,了解这些指标的含义,将有助于通讯设计工程师顺利完成设计项目,同时也可以大大减少整机
---- 总频差:在规定的时间内,由于规定的工作和非工作参数全部组合而引起的晶体振荡器频率与给定标称频率的最大频差。
---- 说明:总频差包括频率温度稳定度、频率温度准确度、频率老化率、频率电源电压稳定度和频率负载稳定度共同造成的最大频差。一般只在对短期频率稳定度关心,而对其他频率稳定度指标不严格要求的场合采用。例如:精密制导雷达。
---- 频率温度稳定度:在标称电源和负载下,工作在规定温度范围内的不带隐含基准温度或带隐含基准温度的最大允许频偏。
---- fT=±(fmax-fmin)/(fmax+fmin)
---- fTref =±MAX[|(fmax-fref)/fref|,|(fmin-fref)/fref|] fT:频率温度稳定度(不带隐含基准温度)
---- fTref:频率温度稳定度(带隐含基准温度)
---- fmax :规定温度范围内测得的最高频率
---- fmin:规定温度范围内测得的最低频率
---- fref:规定基准温度测得的频率
---- 说明:采用fTref指标的晶体振荡器其生产难度要高于采用fT指标的晶体振荡器,故fTref指标的晶体振荡器售价较高。
---- 几种电子系统使用的晶体振荡器典型频率温度稳定度指标见下表:
---- 表中有一部分频率温度稳定度指标应是带隐含基准温度的频率温度稳定度指标,但没表示出来。 (1ppm=1×10-6;1ppb=1×10-9)。
---- 频率稳定预热时间:以晶体振荡器稳定输出频率为基准,从加电到输出频率小于规定频率允差所需要的时间。
---- 说明:在多数应用中,晶体振荡器是长期加电的,然而在某些应用中晶体振荡器需要频繁的开机和关机,这时频率稳定预热时间指标需要被考虑到(尤其是对于在苛刻环境中使用的军用通讯电台,当要求频率温度稳定度≤±0.3ppm(-45℃~85℃),采用OCXO作为本振,频率稳定预热时间将不少于5分钟,而采用DTCXO只需要十几秒钟)。
---- 频率老化率:在恒定的环境条件下测量振荡器频率时,振荡器频率和时间之间的关系。这种长期频率漂移是由晶体元件和振荡器电路元件的缓慢变化造成的,可用规定时限后的最大变化率(如±10ppb/天,加电72小时后),或规定的时限内最大的总频率变化(如:±1ppm/(第一年)和±5ppm/(十年))来表示。
---- 说明:TCXO的频率老化率为:±0.2ppm~±2ppm(第一年)和±1ppm~±5ppm(十年)(除特殊情况,TCXO很少采用每天频率老化率的指标,因为即使在实验室的条件下,温度变化引起的频率变化也将大大超过温度补偿晶体振荡器每天的频率老化,因此这个指标失去了实际的意义)。OCXO的频率老化率为:±0.5ppb~±10ppb/天(加电72小时后),±30ppb~±2ppm(第一年),±0.3ppm~±3ppm(十年)。
---- 频率压控范围:将频率控制电压从基准电压调到规定的终点电压,晶体振荡器频率的最小峰值改变量。
---- 说明:基准电压为+2.5V,规定终点电压为+0.5V和+4.5V,压控晶体振荡器在+0.5V频率控制电压时频率改变量为-110ppm,在+4.5V频率控制电压时频率改变量为+130ppm,则VCXO电压控制频率压控范围表示为:≥±100ppm(2.5V±2V)。
---- 压控频率响应范围:当调制频率变化时,峰值频偏与调制频率之间的关系。通常用规定的调制频率比规定的调制基准频率低若干dB表示。
---- 说明:VCXO频率压控范围频率响应为0~10kHz。
---- 频率压控线性:与理想(直线)函数相比的输出频率-输入控制电压传输特性的一种量度,它以百分数表示整个范围频偏的可容许非线性度。
---- 说明:典型的VCXO频率压控线性为:≤±10%,≤±20%。简单的VCXO频率压控线性计算方法为(当频率压控极性为正极性时):
---- 频率压控线性=±((fmax-fmin)/ f0)×100%
---- fmax:VCXO在最大压控电压时的输出频率
---- fmin:VCXO在最小压控电压时的输出频率
---- f0:压控中心电压频率
---- 单边带相位噪声£(f):偏离载波f处,一个相位调制边带的功率密度与载波功率之比。
*****************************************************************************************
请问单片机晶震旁的2个电容有什么要求吗?
这个是晶体的匹配电容,只有在外部所接电容为匹配电容的情况下,
振荡频率才能保证在标称频率附近的误差范围内。
最好按照所提供的数据来,如果没有,一般是30pF左右。太小了不容易
起振。
在某些情况下,也可以通过调整这两个电容的大小来微调振荡频率,当然
可调范围一般在10ppm量级。
④ 用单片机对步进电机进行控制
呵呵 兄弟可以参考某些部分 呵呵
自己做的课程设计 还没有做完 完了发给你参考参考
题 目:单片机控制步进电机系统
摘 要
很多工业控制设备对位移和角度的控制精度要求较高, 一般电机很难实现, 而步进电机可精确实现所设定的角度和转数。本设计主要是运用51 单片机控制六线4 相步进电机系统, 由单片机产生驱动脉冲信号, 控制步进电机以一定的转速向某一方向产生一定的转动角度。同时能够利用单片机实现电机的正、反转及速度控制,并能在数码管上显示出相应的速度。
本文中给出了该系统设计的硬件电路,软件设计,人机交互等。并对各个功能模块进行了详细的说明。主要内容包括以下几个方面:
单片机控制步进电机的一般原理。
电机驱动及控制的实现。
控制系统整体设计以及模块划分说明。
原理图。
代码。
关键词:单片机;步进电机;系统;驱动
Abstract
Many Instrial control equipment have a highly requirement in displacement and angle with control accuracy, the most motor can't carry out .but the step motor can carry out the displacement and angle that you enactmented in accuracy. This design mainly used SCM to control step motor system.The step motor is formed six lines and four phasic.Through SCM generate the drive pulse signal.Control stepper motor through a certain speed in a direction to get a certain degree of rotation angle.
At the same time, It can use SCM to realization of the motor is , reverse and speed control. and showed the speed in the digital tube.
In this paper, given the design of the system hardware circuit,software design, human-computer interaction and so on.and it given the details description of each functional mole.the main contents include the following:
(1) The general principles of signal_chip controlling step motor.
(2) The realization of motor driving and controlling
(3) Control system overall design and description mole division
(4) Schematic Diagram
(5) Code
Key Words:SCM; stepper motor; system; drive
目录
引言 4
1 单片机控制步进电机的一般原理 4
1.1 步进电机 4
1.1.1 步进电机介绍 4
1.1.2 步进电机分类 5
1.1.3 技术指标 5
1.1.4 步进电机工作原理 5
1.2 单片机 7
2 步进电机驱动实现 8
2.1简介 8
2.2驱动选择 8
3 系统硬件设计 9
3. 1 单片机控制电机 9
3.2 键盘 9
3.3 显示部分 10
程序流程图 11
总结 12
致 谢 13
参考文献 13
附录 13
C代码 13
引言
目前,在工业控制生产以及仪器上应用十分广泛。通常都要对一些机械部件平移和转动,对移动的位移和角度控制要求较高,一般的电机很难实现对位置和角度的精确控制,在一些智能化要求较高的场合,用模拟芯片控制器及信号发生器来控制有一定局限性。而用单片机控制步进电机可以改善性能,步进电机能实现精确的角度和转数,具有良好的步进特性,最适合数字控制。在工控设备中得到了广泛的应用。而单片机具有芯片体积小,兼容性强,低电压地,低功耗等特点,使单片机成为驱动步进电机的最佳空盒子单元。所以单片机控制步进电机系统控制精度高,运行稳定,得以广泛运用。
1 单片机控制步进电机的一般原理
1.1 步进电机
1.1.1 步进电机介绍
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机、交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。
1.1.2 步进电机分类
永磁式(PM)。一般为二相,转矩和体积都很小,步距角一般为7.5或15°
反应式(VR)。一般为三相,实现大转矩输出,步距角为1.5°。
混合式(HB)。兼具永磁式和反应式的优点,分二相和五相,二相步距角为1.8°五相步距角为0.72°。
1.1.3 技术指标
静态指标
相数
步距角
拍数
定位转矩
保持转矩
步进电机动态指标
步距角精度
失步
失调角
最大空载启动频率
最大空载运行频率
运行频距特性
电机共振点
1.1.4 步进电机工作原理
分析(步进电机展开图)
以反应式步进电机为例,其典型结构图如图1所示。这是一个四相步进电机,当相控制绕组接通脉冲电流时,在磁拉力作用下使相的定、转子对齐,相邻的B 相和D 相的定、转子小齿错开。若换成B 相通电,则磁拉力使B 相定、转子小齿对齐(转过) ,而与B 相相邻的C 相和A 相的定、转子小齿又错开,即步进电机转过一个步距角。若按A →B →C →D →A ⋯规律循环顺序通电,则步进电机按一定方向转动。若改变通电顺序为A →D →C →B →A ,则电机反向转动。这种控制方式称为四相单四拍。若按AB →BC →CD →DA →AB或A →AB →B →BC →C →CD →D →DA →A 顺序通电则称为四相双拍或四相单、双八拍。无论采用哪种控制方式,在一个通电循环内,步进电机的转角恒为一个齿距角。所以,可以通过改步进电机通电循环次序来改变转动方向,可以通过改变通电频率来改变其角频率。运用单片机的输出功能,通过编程实现输出四个信号分别给步进电机的四相A、B、C、D ,并通过输出时信号的循环次序,来设定步进电机的转动方向及输出信号的频率以便设定步进电机的转动频率。
图1 反应式步进电机结构图
实现原理
采用单片机产生A、B、C、D 的四相信号,当采用单片机进行控制时,需要在单片机和步进电机中间设隔离电路以使强弱电分离。由于步进电机的驱动电流相对较大,可增设放大电路来提供步进电机的工作电流。系统电路由五部分组成,即单片机、隔离、放大、电源及步进电机。
1.2 单片机
功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,
具有8K 在系统可编程Flash 存储器。使用Atmel 公
司高密度非易失性存储器技术制造,与工业80C51
产品指令和引脚完全兼容。片上Flash允许程序存储
器在系统可编程,亦适于常规编程器。在单芯片上,
拥有灵巧的8 位CPU 和在系统可编程Flash,使得
AT89S52为众多嵌入式控制应用系统提供高灵活、超
有效的解决方案。AT89S52具有以下标准功能:8k字
节Flash,256字节RAM,32 位I/O 口线,看门狗定时
器,2 个数据指针,三个16 位定时器/计数器,一个6
向量2级中断结构,全双工串行口,片内晶振及时钟电
路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持
2种软件可选择节电模式。空闲模式下,CPU停止工作,
允许RAM、定时器/计数器、串口、中断继续工作。掉
电保护方式下,RAM内容被保存,振荡器被冻结,单
片机一切工作停止,直到下一个中断或硬件复位为止。
2 步进电机驱动实现
2.1简介
步进电机在单单仅给予电压时,电机是不会动作的,必须由脉冲产生器提供位置(脉波数)、速度的脉冲信号指令,以及驱动器驱动电流流过电机内部线圈、依顺序切换激磁相序的方式才能够让电机运 转。所以欲使步进电机动作的必要系统组成有:
(1)脉冲产生器:给予角度(位置移动量)、动作速度及运转方向之脉冲信号的电机驱动指令。
(2)步进驱动器:依控制器所投入的脉冲信号指令,提供电流来驱动步进电机动作。
(3)步进电机:提供转矩动力输出来带动负载。所以步进电机系统构成简单,不需要速度感应器、位置传感器, 即能依照脉冲产生器所输入的脉冲来做到速度及位置的控制。
2.2驱动选择
步进电机可以选用专用的电机驱动模块,也可以自己构建驱动电路。一般有以下几种选择:
专用驱动模块,如L298,FT5754等,这类驱动接口简单,这类可以驱动步进电机,直流电机等。
达林顿驱动器ULN2803,这个芯片可以一次驱动八线步进电机。
自己构建,通过三极管,74als04,等系列元件构成。但这样系统可靠性会降低,会另外给系统带来误差。
3 系统硬件设计
1 单片机控制电机
如图3
说明:
这个部分为单片机控制步进电机部分,80s52单片机通过达林顿驱动器ULN2803来驱动步进电机,80s52的P1.0-P1.4发送控制信号给驱动器,然后驱动器的四根线把信号传递给电机,使电机实现正反转等。电机部分接12V直流电源。
3.2 键盘
如图4
说明:
本系统中采用了四个按键,分别与80s52的四个引脚相连,分别为LCDEN,RS,WR,RD;分别实现的功能是电机加速,减速,正反转。键盘一旦按下则表示向单片机发送了有效信号,单片机就相应的进行调节。对于键盘的键按下的时候分为几个步骤,当键盘按下的时候,接通电路,键盘扫描检测低电平,但检测到低电平之后不能够判断键是否被按下,因为抖动可能引起这个变化,所有大概延时5~10ms之后再进行检测。如果再次检测到低电平之后说明键被按下。这个过程就是所说的消除抖动。
3.3 显示部分
如图5
说明:
对于显示部分,因为这个系统只是显示转速,所以采用了LED共阳极数码管。
并且用了74HC573锁存器,74HC573锁存器输出电流大,接口电路简单。本系统采用了两个74HC573锁存器,分别为段选和位选。段选为数码管的显示数字,位选为选中相应的数码管。
程序流程图
总结
通过本次的课程论文,让我真实的感受到一个完整的系统设计过程。这次的的论文从开始的整体布局,排版,到内容中的系统设计直到最后完成。每个流程下来,都带给了我很多的新东西,特别在设计完系统之后做硬件部分中,先是用protel99se画图,好多图在库中找不到,找不到就自己画,然后封装,封装的时候还要用游标卡纸对买来的元件进行精确的测量,然后才能在封装的过程中保证精度。最后做完图之后还要布线,布线完成后再发到厂家去做。事实上这个过程我用买好的空板做的,因为元件不多。所以就买了相应的元件直接再PCB板上焊接好的。在焊接的过程中也会感受到很多东西,因为很多需要注意的。不过这个过程多多尝试就会有进步的。焊接完后就是代码调试阶段。最后就完成了这个小型系统的设计。
致 谢
在此,感谢我的老师以及周围的同学。本次的论文得益于同学们的帮助。最后还要感谢我的父母,是他们一直在背后支持着我。
谨以此文献给他们!
参考文献
[1] 张永枫,王静霞,杨宏利. 单片机应用实训教程. 西安电子科技大学出版社,2005.
[2] 郭天祥. 51单片机C语言教程. 电子工业出版社 2008
附录
C代码
单片机控制步进电机
实现功能:
定时器中断:定时时间设置为30秒,首先给的初值每次中断为5ms,经过20次中断为1秒,半分钟三十秒则要中断600次,所有到达六百次后就把计数n中的值读取到数码管中显示出来。
键盘检测:进行速度控制的时候按下相应的键则会对应的进行速度调节。
数码管显示:
驱动部分:
#include <reg52.h>
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit jia_key=P3^6;
sbit jian_key=P3^7;
sbit zf_key=P3^5;
sbit stop_key=P3^4;
bit flag=0;
uchar num1,n;
uchar num=0,show_num=2,maichong=4,table_begin=0;
uchar code table1[]={0x01,0x02,0x04,0x08,0x08,0x02,0x01};
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
// 延时部分
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=110;k>0;k--);
}
// 显示部分
void display()
{
la=0;
P0=table[show_num];
la=1;
la=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[0];
la=1;
la=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
// 键盘检测部分
void key()
{
if(jia_key==0)
{
delay(5);
if(jia_key==0)
{
num++;
if(num==4)
num=3;
while(jia_key==0)
}
}
if(jian_key==0)
{
delay(5);
if(jian_key==0)
{
if(num!=0)
num--;
else
num==0;
while(jian_key==0);
}
}
if(zf_key==0)
{
delay(5);
if(zf_key==0)
{
flag=~flag;
while(zf_key==0);
}
}
if(stop_key==0)
{
delay(4);
if(stop_key==0)
{
show_num=0;
maichong=0;
}
while(stop_key==0)
}
}
// 键盘检测结果
void dispose()
{
switch(num)
{
case 0:
maichong=5;
break;
case 1:
maichong=4;
break;
case 2:
maichong=3;
break;
case 3:
maichong=2;
break;
}
if(flag==0)
{
table_begin=0;
}
else
table_begin=4;
}
// 数码管驱动部分
void qudong()
{
uchar i,j;
for(j=0+table_begin;j<4+table_begin;j++)
{
P1=table[j];
for(i=0;i<maichong;i++)
{
dispaly();
}
}
}
// 主函数部分
void main()
{
while(1)
{ init();
key();
dispose();
qudong();
n++;
}
}
// 定时器中断初始化
void init()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; // 开总中断
ET0=1;// 开定时器0中断
TR0=1;// 启动定时器0
}
// 定时器中断调用
void T0_time() intterrupt 1 // T0中断
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==600)
{
show_num=n;
num1=0;
n=0;
}
}
⑤ rtc唤醒日期每天唤醒写什么
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。
可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。
唤醒定时器的时钟输入可以是: 2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。
当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 122 µs 和 32 s 之 间,且分辨率低至 61 µs。
· ck_spre(通常为 1 Hz 内部时钟)。
当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这 一较大的可编程时间范围分为两部分:
– WUCKSEL [2:1] = 10 时为 1s 到 18h
– WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 600 页的编程唤醒定时器),定时 器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当 计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。 之后必须用软件清零 WUTF 标志。
通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低功耗模式。
如果已通过 RTC_CR 寄存器的位 OSEL[1:0] 使能周期性唤醒标志,则该标志可连接到RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 输出极性。
系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。
二、配置周期唤醒
配置步骤如下:
1. 禁用周期唤醒功能,复位RTC_CR2中WUTE位;
2. 等待RTC_ISR1中WUTWF位置位,表示唤醒计数器可配置;
3. 配置唤醒时钟,设置RTC_CR1中WUCKSEL[2:0]位:
- 000: RTCCLK/16
- 001: RTCCLK/8
- 010: RTCCLK/4
- 011: RTCCLK/2
- 10x: ck_spre(1Hz,WUT计数范围:0x0000~0xFFFF)
- 11x: ck_spre(1Hz,WUT计数范围:0x10000~0x1FFFF)
4. 配置唤醒周期,装载寄存器RTC_WUTRH和RTC_WUTRL;
5. 使能周期唤醒功能,置位RTC_CR2中WUTE位。(该中断会使MCU退出低功耗状态,进入运行状态。)
RTCCLK,预分频2,4,8或16。如果RTCCLK为LSE,即32768Hz,则可配置唤醒周期为:(61us ~ 32s)
ck_spre, 1Hz时钟,则可配置唤醒周期为:(1s ~ 36h)
三、RTC时钟配置
1、时钟源选择:RTC时钟源可选HSE,LSE,HSI或LSI。
为确保RTC精确工作,要求系统时钟(SYSCLK)必须等于或大于4*RTCCLK值。如果系统时钟(SYSCLK)为LSE或LSI,则RTC时钟必须等于系统时钟(SYSCLK),并且禁用RTC同步机制(置位RTC_CR1寄存器RATIO位)。
2、配置RTC时钟源:配置RTC时钟源为LSE,1分频,即32768Hz。
3、配置ck_spre时钟; ck_spre时钟,默认1Hz时钟。
(1) 设置7位异步预分频,RTC_APREG:PREDIVA,默认127;
(2) 设置13(Medium)或15位同步预分频,RTC_SPRERx:PREDIV_S,默认255。
即:1Hz=32768/((127+1)*(255+1))
ck_spre时钟可用于日历和定时唤醒时钟。
代码参考
//参数time 秒
void APP_EnterLP(uint32_t time )
{
MX_GPIO_Init_stop();
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower(); //使能超低功耗
/* Enable Fast WakeUP */
HAL_PWREx_EnableFastWakeUp(); //使能快速唤醒
/* Disable Wakeup Counter */
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
/* Clear Wake Up Flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time * 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32.768k 2048Hz 488us-- 32秒
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814 时钟选择1Hz 65535/60/60 ~18 可得到的唤醒时间为 1s 到 18h 左右
printf("进入停止模式\r\n");
/* Select MSI as system clock source after Wake Up from Stop mode */
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);
MX_GPIO_Init();
HAL_Delay(5); //wangxl@20190814 稳定时钟 必免串口打印乱码
printf("wake up\r\n");
}
打开CSDN,阅读体验更佳
STM32---RTC实时时钟,随机数发生器和待机唤醒_码字但很菜的博客-CSDN博...
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue,uint32_t RTC_AlarmSubSecondMask) uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm); RTC周期唤醒相关函数 void RTC_WakeUpClockConfig(...
继续访问
STM32L051低功耗STOP模式下RTC唤醒_TonyIOT的博客_stm32l05...
很多MCU都有低功耗模式,以满足对功耗要求苛刻的应用场景。STM32系列MCU的低功耗模式根据其内核与类型的不同也各不相同,网上有很多文章介绍。本文总结下STM32L051的STOP模式,通过RTC唤醒。
继续访问
最新发布 GD32F4—RTC闹钟及自动唤醒中断配置详解
GD32F4RTC闹钟及自动唤醒中断配置
继续访问
【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下
本文章基于STM32F103RC; 在开启独立看门狗的状态下,进入停机模式,由RTC定时闹钟唤醒系统。 直接上代码: #include "main.h" static void RTC_NVIC_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
继续访问
stm32f103 RTC周期性待机唤醒(一)_luck_horse的博客
我的RTC初始化部分有个“保存在备份寄存器的RTC标志是否已经被配置过的判断”,如果已经配置过,则进入else部分,但是这个else部分没有“要使能电源时钟,使能备份时钟,取消后备区的写保护”这些配置语句,而待机唤醒后程序从主函数执行,会执行...
继续访问
...RTC实时时钟_基尔霍夫原来是码农的博客_stm32 rtc 时间
RTC简介 STM32F4的RTC,是一个独立的BCD 定时器/计数器。STM32F4的RTC 提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM A和ALARM B)中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模式...
继续访问
STM32L031低功耗深度睡眠RTC唤醒注意事项
1. 发现进入睡眠后,电流1.2uA,满足要求。结果唤醒后,第二次进入睡眠后,电流跳到了19uA,且一直保持下去。结果看了https://blog.csdn.net/zzw3255/article/details/54342878的介绍,把串口干掉了,电流下降到了2.6uA。2. 去掉了串口,第一次进入睡眠1.2uA,第二次进入睡眠2.6uA。有陷入了僵局,没开串口、没开GPIO,啥事都没干,怎么...
继续访问
STM32L053RTC——唤醒定时器定时唤醒睡眠
L053RTC——唤醒定时器定时唤醒睡眠
继续访问
CM3计算板RTC闹钟唤醒系统_jianwang16的博客_bios rtc...
rtcctlshowalarm1 /* rtcctl 启用闹钟1 */ rtcctlonalarm1 /* rtcctl 清除闹钟1 */ rtcctl clear alarm1 /* rtcctl 设置闹钟1时间 2019/06/01 15:30:00 闹钟产生中断*/ rtcctlset06/01/201915:30:00 ...
继续访问
RTC自动唤醒_Ftworld21的博客_rtc唤醒
RTC唤醒低功耗(standby)模式 这段时间在公司最一个低功耗的项目,采用的的STM32F103的最低功耗standby模式,进入最低功耗模式后,电流降到了3uA,和芯片手册上的大致相同。对进入低功耗模式,网上有很多程序,我在这里把我的粘贴上来,仅供参...
继续访问
热门推荐 STM32复习笔记(十二)RTC实时时钟(低功耗待机唤醒)
声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照正点原子的视频和文档的实际顺序梳理,转载请注明出处。 作者:sumjess 适用:这个视频我已经看过3遍了,总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做笔记。 目前内容:RTC实时时钟(低功耗待机唤醒) 一、RTC实时时钟特征与原理: ★ R...
继续访问
STM32----RTC实时时钟,随机数发生器和待机唤醒
RTC实时时钟 RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。 两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以 提供二进制的亚秒值。 系统可以自动将月份的天数补...
继续访问
hal 外部唤醒脚唤醒_【STM32】HAL库开发教程(六)—低功耗唤醒
前言不必害怕未知,无需恐惧犯错,做一个Creator!本文主要介绍STM32_HAL库开发中低功耗唤醒的使用。一、开发步骤1.STM32CubeMX配置在左侧引脚配置处勾选RTC进行配置在RTC模式处勾选“Wakeup”唤醒使能RTC唤醒模式在RTC参数配置处进行参数配置:RTC时钟、Wakeup唤醒时钟、Wakeup唤醒计数器以及勾选”NVIC Settings”使能外部中断 2.进低功耗程序编...
继续访问
STM32Cube STM32L053配置RTC WAKEUP中断唤醒
芯片手册中提到的从停止模式唤醒说明 芯片手册中提到的从待机模式唤醒说明 配置 LL_RTC_InitTypeDef RTC_InitStruct = {0}; LL_RCC_EnableRTC(); NVIC_SetPriority(RTC_IRQn,0); NVIC_EnableIRQ(RTC_IRQn); RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR; RTC_InitStruct.AsynchPrescaler = 12
继续访问
STM32L0系列单片机低功耗(STOP)使用+RTC唤醒+LPUART(DMA方式)唤醒+LPTIM唤醒
文章目录STM32L0低功耗应用1.睡眠模式2.低功耗运行模式3.低功耗睡眠模式4.带RTC的停止模式5.不带RTC的停止模式6.带RTC待机模式7.不带RTC待机模式留更设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 STM32L0低功耗应用 S...
继续访问
STM32 STOP模式开发问题集锦
STM32 STOP模式开发问题集锦 芯片:STM32L151RBT6 库:HAL库 ①晶振不起振问题 项目过程中,遇到了晶振不起振问题,看了很多帖子,还是不能确定到底是什么问题。我个人建议是使用有源晶振或者是内部晶振(自带晶振不会黑自己吧…) 由于内部低速晶振并非是32.768,所以对RTC要求高的,考虑有源的32.768K晶振,我在实验过程中换了一个无源的KDS(株式会社-大真空)目前也没有发现不起振的情况。高速晶振可以内部,也可以有源。 ②HAL库 中RTC唤醒STOP模式问题 和时间相关的唤醒,一种
继续访问
STM32L151C8T6笔记2:RTC唤醒的STOP模式
尝试在保留RAM数据的前提下进行低功耗定时运行,Stop模式带RTC成为唯一选择,上图来自《AN3193:STM32L1xx超低功耗功能概述》。 梳理工作逻辑: (1)需要进入低功耗之前,先配置RTC的Wakeup(也可以用闹钟Alarm,类似,不赘述): //to set wake up interval if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,( RTC_WKUP_INTVAL_IN_SECOND*1000000 /W...
继续访问
RTC定时开机闹钟
RTC是Real Time Clock的简称,它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是RTC仍然继续工作. HWCR (Hibernate Wakeup Control Register)是一个控制休眠唤醒的寄存器,如果我们要使用休眠状态下RTC唤醒的功能,我们需要打开它的第0位ELAM(RTC Alarm Wakeup enable),当ELAM置1...
继续访问
STM32F030使用RTC周期性唤醒STOP模式
首先,F030与F072的RTC唤醒功能是不一样的,在相关定义文件stm32f0xx_exti.h中有如下定义: #define EXTI_Line17 ((uint32_t)0x00020000) /*!< Internal interrupt line 17 Con...
继续访问
stm32f103 RTC周期性待机唤醒(一)
转载于http://blog.csdn.net/u011732167/article/details/50958520 今天终于发现问题出在哪里了,对待机唤醒的问题做一个总结(只针对我遇到的问题,其他部分网上都有,基于stm32f103) 1、解决我遇到的问题 我的RTC初始化部分有个“保存在备份寄存器的RTC标志是否已经被配置过的判断”,如果已经配置过,则
继续访问
hal库开启中断关中断_技术笔记STM32CubeL4 固件库V1.13.0版的RTC唤醒
因为STM32L4极其出色的低功耗性能,越来越多的用户在使用STM32L4系列开发产品。谈到低功耗,就少不了低功耗模式。进入低功耗模式,自然需要能够唤醒。很多用户在产品开发中会使用RTC把系统从低功耗模式定时唤醒。问题客户在产品的设计中,使用STM32L476RGT6。客户使用RTC的定时唤醒来将系统从STOP2模式中唤醒,但是发现无法唤醒。调研01了解问题客户参考\STM32Cube_...
继续访问
stm32中断源有哪些_STM32低功耗待机模式+RTC闹钟中断唤醒
很多单片机都有低功耗模式,STM32 也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的HCLK为CPU提供时钟,内核执行程序代码。当CPU不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。 单片机内部功率是各功能部分功率的总和,低功耗模式是通过关掉部分内部功能达到...
继续访问
STM32开发笔记30:STM32L0低功耗设计——STOP_RTC模式下的休眠时间
单片机型号:STM32L053R8T6 本文介绍STOP_RTC模式下,设置进入低功耗休眠时间的方法。 低功耗的休眠时间的设置首先需要确定RTC的基准时间,我们一般将其设置为1秒,这在《STM32L0低功耗设计4: RTC模块1秒时钟的产生方法》中已经介绍过,大家看一下就好。 接下来,就需要对HAL_RTCEx_SetWakeUpTimer_IT函数的第2个参数进行设...
继续访问
基于STM32通过RTC唤醒低功耗模式
RTC自动唤醒低功耗模式
⑥ 基于单片机的单按键实现电机正反转控制,如何实现最好有C语言程序代码,主要是Main函数 谢谢
/*基于双转镜片的步进电机控制的程序说明*/
/*FP20、FP21、FP22、FP23分别接步进电机的A、B、C、D四相*/
/*FP10、FP11、FP12分别接主机控制的ON/OFF(0/1)、方向(0正转/1反转)、循环变速(0有效)*/
/*变量定义*/
unsigned int motorenb=0;
unsigned int ccw=0;
unsigned int su_keyenb=0;
unsigned int su=2;
unsigned int su_cv=0;
unsigned int su_num=26;
unsigned int wfa=0;
/*变量定义结束*/
/*中断函数*/
__interrupt ints (void) //中断入口 ;1ms
{
unsigned int a,b,c,d;
FGIE=0;//关闭总中断
if(FTC0IRQ) //一次定时1mS
{
FTC0IEN=0;//禁止TC1中断
FTC0IRQ=0;//清中断请求标志位
FTC0IEN=1;//开TC1中断
if(motorenb==1)
{
su_cv++;
if(su_cv>=su_num)
{
su_cv=0;
if(ccw==1) //正转
{
a=wfa;
a++;
if(a>7) a=0;
wfa=a;
}
else if(ccw==0)//反转
{
a=wfa;
if(a==0) a=8;
a-=1;
wfa=a;
}
switch(a)
{
case 0: FP23=0;
FP22=0;
FP21=1;
FP20=1;
break;
case 1: FP23=0;
FP22=0;
FP21=1;
FP20=0;
break;
case 2: FP23=0;
FP22=1;
FP21=1;
FP20=0;
break;
case 3: FP23=0;
FP22=1;
FP21=0;
FP20=0;
break;
case 4: FP23=1;
FP22=1;
FP21=0;
FP20=0;
break;
case 5: FP23=1;
FP22=0;
FP21=0;
FP20=0;
break;
case 6: FP23=1;
FP22=0;
FP21=0;
FP20=1;
break;
case 7: FP23=0;
FP22=0;
FP21=0;
FP20=1;
break;
}
}
}
else P2=0X00;
}
}
/*主函数*/
void main(void)
{
FP20M=1;
FP21M=1;
FP22M=1;
FP23M=1;
FP10M=0;
FP12M=0;
P2UR=0XFF;
P1UR=0XFF;
/*TC0作为计时器*/
FTC0IEN=0;//禁止TC0中断
FTC0ENB=0;//禁止TC0
FPWM0OUT=0;//禁止PWM1
FTC0OUT=0;//禁止TC0输出
FALOAD0=1;//TC0自动重装
FTC0CKS=0;//选用内部时钟
FTC0RATE0=1;//设置TC0分频为Fcpu/32
FTC0RATE1=1;
FTC0RATE2=0;
TC0C=0xF3;//给TC0赋初值,TC0C=256-(1mS*16M/4/32)
TC0R=0xF3;//给TC0赋自动重装值
FTC0IRQ=0;//清TC0中断标志位
FTC0IEN=1;//使能TC0中断
FGIE=1;//开总中断
FTC0ENB=1;//开TC0
while(1)
{
WDTR=0x5A;
if(FP10==0) motorenb=1;
else motorenb=0;
if(FP12==0)ccw=1;
else ccw=0;
if(FP11==1) su_keyenb=1;
if(su_keyenb==1)
{
if(FP11==0)
{
su_keyenb=0;
su++;
if(su>2) su=0;
switch(su)
{
case 0 : su_num=26;
break;
case 1 : su_num=14;
break;
case 2 : su_num=6;
break;
}
}
}
}
}
给你做个参考,我自己用的,试过了,你把IO口改下,定时器也改成你的型号的