|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
# t$ W4 m+ p' I6 v1 E8 q
单片机控制舵机源程序如下:" u( C B5 A9 ]3 h
* ]; M9 K8 L+ S& c. m#include <reg52.h>8 ]- _9 q+ n( Y; X
6 s z1 n; h( I6 b9 d7 P, Dunsigned char count; //0.5ms次数标识
2 \, h L! }6 M9 `+ x8 w! g, L3 K8 j$ O) O0 Y. {6 D7 l; V5 }
sbit pwm =P1^0 ; //PWM信号输出
& ?3 [# c9 S1 M% E! u( f( J& h" j1 ^% Z& `- h/ K% L) X0 b
sbit jia =P2^4; //角度增加按键检测IO口
3 W, d, g; o) N6 j
! s$ a4 Z7 f6 Z' t; K' _sbit jian =P2^5; //角度减少按键检测IO口0 m3 w7 \1 T4 S x
! ^2 a) v3 g0 Q3 c
unsigned char jd; //角度标识. o8 ?+ C' e; E& z2 w1 A
2 L! i! M# ]$ Y1 Y0 g: U) ^8 e6 u8 L+ C8 V3 d7 z# u
$ v2 S0 J& r6 |) x5 q8 A) N7 s9 S9 Tsbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用: _( f7 Y# J$ Y5 s6 k& E
/ u* d6 f! f! {& M0 J: F
void delay(unsigned char i)//延时
" |9 N1 t% H, B* o6 U+ u4 F0 O/ _7 O q/ J2 @
{
0 C! E4 k9 H: W+ n0 v7 A
( X6 N9 R. M! [" } u. A( v- | unsigned char j,k;1 N. m1 [9 \) |, g& I G# I \! Z
, h+ K: E- w; D for(j=i;j>0;j--)
. T4 Y! m0 s% d v0 @
9 \& }' k# l' T/ U, e7 e for(k=125;k>0;k--);2 E Y" O4 }! Z. {2 E% i7 @8 d
' a' W. \5 }6 l. z
}& {* r( v2 y8 F1 ^0 E+ s2 K
8 q) U) \% [5 q8 Z \
void Time0_Init() //定时器0初始化$ u- Z- {, @! r( v3 I1 _
2 o: e+ I/ p; w- e
{
6 k) h# _- c8 B2 q; h+ j3 U: V
! S8 L- M" @ o0 Y$ y' j$ }: }//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下8 H+ U* i; {4 I' R5 ?: O
2 e2 m# F8 J& {
TH0 = (65536-445)/256;9 j' ~8 y& S( e+ O
6 C1 {6 j. M2 o6 r8 d+ A B% `5 P& VTL0 = (65536-445)%256;$ N: j6 O, U, V! T
+ G( i( B; x0 `$ h; l! o
' o4 F" N1 o% r7 q, S+ t' wTMOD = 0x01; //定时器0工作在方式1 8 K- P. w9 F0 w6 t
0 J' F" E% i B6 o* {" w% N' b8 PIE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断, i+ _5 A' P; t4 c
8 L: a/ X" [/ c
TR0=1; //开定时器06 z- P) L5 |) |# n. h
4 p! e' L: b' r) j- m0 e4 |) A, T
}# P4 I2 j8 r; E7 G! {
. M. e5 L* D( B- G5 t0 u# x
void Time0_Int() interrupt 1 //中断程序
, e. ?6 e4 q, ~4 f; Z# g/ |* y5 G9 @# O- J) h; R) z
{
3 \! z/ [) A& p3 u0 f! b3 |' a4 P; T# i m$ _9 f- F( @
//重装初值
, D/ u* t! n7 _. z7 t3 F
6 A) n6 E6 d0 Q8 }) H4 b$ d5 ^TH0 = (65536-445)/256;
2 r' e* d% j0 ~ j/ W. r! k' ]4 @: _9 P' o9 h0 o Z! W3 H) |
TL0 = (65536-445)%256;, n+ {" P5 q) |. J" [
( O1 [# u. ]: x* H3 v
7 M( U @- V4 |# ~3 Q
0 S9 x/ q. Q" J4 M: x2 W- t+ _
if(count< jd)0 J* Q. }$ o; o2 B) L
{
% s6 ?( _, H- J U' c# [+ l4 |pwm=1; //确实小于,PWM输出高电平) Z8 X7 b* J+ A5 B% V
pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识
: \+ X3 j+ J$ C+ d% A8 E" S1 ^//pwm=1; //确实小于,PWM输出高电平
" ^5 U) |4 Z" `! R1 _* s9 V else
) E6 A3 ?7 p9 i& s{
]2 R1 e! {$ J! X8 r+ o' o9 V+ dpwm=0; //确实小于,PWM输出高电平
$ W4 C6 c! r& Vpwm1=pwm; //接示波器用的io口,观测PWM波形用 }0 l$ `' s I7 u3 V& o
// pwm=0; //大于则输出低电平
- Y/ j* P, J/ P/ P n5 j count=(count+1); //0.5ms次数加1
" m$ E( N& q7 h- H' T2 X9 N7 F count=count%40; //次数始终保持为40 即保持周期为20ms# y3 d0 a/ F9 |2 ^' ]2 K- C
}$ W& I0 b4 `7 b2 Y- |: C
1 j8 E" \. n# _( p9 x
//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
5 c& W( p0 Q5 t//通过jian按键控制反转
2 c8 S; V5 T t) f0 T, d5 H/*void keyscan() //按键扫描' g# @* K9 X2 q
{3 [! n/ f6 y/ X/ T
if(jia==0) //角度增加按键是否按下3 D- k& Q* K+ Q% n9 M
{
8 k: j9 g \$ Q$ q- m delay(10); //按下延时,消抖
/ ^: [ m% m% H/ O if(jia==0) //确实按下
2 k$ C6 [4 M0 e& y" s {. a: y, Y2 i, G- \$ J
jd++; //角度标识加13 _1 G6 A* ]' {3 b* K0 }) [0 Z
count=0; //按键按下 则20ms周期从新开始
$ U7 Z8 z# }% F4 j) J3 _, c! N if(jd==6)* I8 x$ { W7 G5 f
jd=5; //已经是180度,则保持5 x2 G* N! S7 T. T/ [; |3 q& a
while(jia==0); //等待按键放开
$ `& @ b+ ?8 \# m }0 {2 z+ W+ J( g
}
6 F5 s% q6 C. d# s! o. ]$ T if(jian==0) //角度减小按键是否按下# p% J' F8 c0 J. z B. \0 f
{
* u* V$ A& c4 w0 d: U delay(10);- ?/ t: |4 k% t+ h) Z3 q; n% a( H- r
if(jian==0)$ ^' I0 j# S/ w6 _* O
{
& j3 G( p8 c8 _' K jd--; //角度标识减1
7 b* r& _. r; s- a9 D" a6 a count=0;
5 m7 _2 r* U# ^5 E& w; A if(jd==0)! c3 S* t7 j# N- J" j. y
jd=1; //已经是0度,则保持
* `' f) p4 D- h: M* Y4 u4 ` while(jan==0);
* I3 _1 Y& z4 _8 p+ v: ~ }& b1 ]) b# a- k
}1 ~& D2 k8 i% J1 [
}*/2 O P% Y ~ Z
/ c* m: D0 j4 h1 l
void main()
3 B! W5 V! C6 n6 G# D9 [3 g" z{
; \9 Q+ [7 t/ a: _//上电,舵机自动正反转
7 E9 ]+ c! A; W6 M! `6 O5 }//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想 1 U+ m7 @1 p, l& X7 ~ ~3 w2 O
while(1)" [5 W/ ]: J& {+ R, b
{0 S& L5 ?/ M5 _8 N% B$ H4 i$ }
for(jd=1;jd<6;jd++)
! [$ f+ t. t* D{
! E0 e4 K2 [! n! s& mcount=0;
9 j$ c1 E$ t- d0 ?Time0_Init();
& R' ?4 e9 x l( N$ qdelay(50000000);
/ V. y* t4 @$ Z! p}+ h# D, `, Q" Y% T+ k/ A' r
delay(50000000);
' `1 \, v# ^' p% `for(jd=6;jd>0;jd--)
' y5 X% M5 r' Q8 n- M" q: v- c A3 c! } T. A2 k# @, ~8 I6 a
{2 }2 C4 ]7 T; S; g% `2 ?6 }
+ Q5 [; s6 o& icount=0;) b( _; Y* F' X( e0 E. L
% E6 T4 S3 F; V/ u* LTime0_Init();
1 }" h# B( ~; q _. x! d* Y
# K3 J0 t- }4 p4 gdelay(50000000);
: ?; K* ~& v9 I- a
4 q" |$ E; M0 C4 O* O}4 F& k4 I1 n5 S
# U3 Z1 G0 y& k' d# P* C
/ i! z9 L0 y+ [9 c, ^
; L7 N; I, R1 O7 \7 f: Z" Z5 \' V |
|