完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
之前做的一次实验,51单片机定时器外部中断实验。虽说是个外部终端实验,但相对实验3而言,实验4像是它的简化版,不过多了不仅电机的控制。如有问题欢迎指正。
实验目的: 掌握外部中断的打开方式;掌握步进电机的基本控制。 实验目标: 设定外部信号发生器每2s钟,产生一个下降沿,作为外部中断源,中断处理完成led灯的闪烁一次,以及控制步进电机旋转一圈。 实验环境: MDK-ARM V5.21a、Proteus 8.6 实现效果: Proteus原理图 选择元器件: [tr]DEVICES说明[/tr]
复位电路的话通过给89C51等单片机的复位引脚RST加上大于2个机器周期的高电平(即24个时钟振荡周期)就可以使单片机复位。 KEIL工程: 1.按照要求,设定外部信号发生器每2s钟产生一个下降沿,即设置频率0.5HZ; 2.步进电机是将脉冲信号转变为角位移或线位移的开环控制器件,非超载情况下,电机的转速停止的位置只取决于脉冲信号的频率和脉冲数,故它只有周期性的误差,而无累积误差; 3.步进电机驱动芯片使用ULN2003A。此芯片是高耐压、大电流达林顿阵列产品,它由7个NPN达林顿管组成。ULN2003A具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点其输入5V的电平输出可达50mA/50V。 主函数: #include #include #define uchar unsigned char #define uint unsigned int #define MotorPort P1 uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正转 ***it LED=P1^7; /*---函数声明---*/ void Init(); void SETP_MOTOR_FFW(uchar n); void SETP_MOTOR_REV(uchar n); void DelayMS(uint ms); /*--------------*/ void main(void) { Init(); while(1) { /*要做的任务*/ } } 定时器初始化及中断子函数: void Init() { EA=1; EX0=1; //外部中断0开 IT0=1; //边沿触发 LED=1; //灭灯 } /*外部中断0子程序,对应端口P3^2*/ void ISR_Key(void) interrupt 0 using 1 { SETP_MOTOR_FFW(1); } 电机驱动及延时函数: void SETP_MOTOR_FFW(uchar n) { uchar i,j,temp; LED=~LED; for(i=0;i<5*n;i++) { for(j=0;j<8;j++) { MotorPort = FFW[j]; for(temp=0;temp<25;temp++) { DelayMS(1); } } } LED=~LED; } void DelayMS(uint ms) { uchar i; while(ms--) { for(i=0;i<120;i++); } } |
|
|
|
只有小组成员才能发言,加入小组>>
2563 浏览 0 评论
762浏览 1评论
521浏览 0评论
275浏览 0评论
455浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 15:13 , Processed in 1.235494 second(s), Total 47, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号