中级会员
- 积分
- 211
- 威望
- 183
- 贡献
- 22
- 兑换币
- 0
- 注册时间
- 2009-11-10
- 在线时间
- 3 小时
|
本帖最后由 chenrunshe_007 于 2009-12-7 14:16 编辑
- #include <reg51.h> //头文件,此文件为自己定义
- #include <intrins.h> //头文件,此文件为系统自带
- #include <math.h> //头文件,此文件为系统自带
- #define middle 1170 //舵机偏转角为0度时设定值
- #define high 14000 //high为后轮PWM波高电平时间,PWM波周期为14436;则低电平时间为14436减去high的值,high取值范围为0—14435
- #define uchar unsigned char //定义以后使用更加方便
- #define uint unsigned int //定义以后使用更加方便
- sbit rudder=P0^0; //定义舵机PWM波输出端口为P0.0口
- sbit pulse=P1^1; //定义后轮PWM波输出端口为P1.1口(此2个口可为单片机32个通用I/O,口中任意2个,但用到P0那8个口要加上拉电阻,在初学单片机时尽量不要用P0口)
- bit flag1=0,flag2=0; //定义全局变量(flag1用于控制舵机PWM标志位,flag2用于控制电机PWM)
- uchar highh,highl,lowh,lowl;
- main()
- {
- pulse=0;
- highh=(uchar)((16384-high)/256+192); //根据PWM计算定时器的值
- highl=(uchar)((16384-high)%256);
- lowh=(uchar)(high/256+200);
- lowl=(uchar)(high%256);
- IE=0x8a; //中断允许控制寄存器(设置为10001010)
- //EA - ET2 ES ET1 EX1 ET0 EX0
- //1 0 0 0 1 0 1 0
- //EA:中断允许总控制位(EA=0时中断总禁止,EA=1时中断总允许) //EX0,EX1外部中断允许位(这里没有用到外部中断,可设置成1或0)
- //ET0,ET1,ET2定时/计数中断允许位(这里只用到定时器0(控制舵机) //定时器1(控制电机),没有用到定时器2) //ES串行口中断允许位(这里没有用到串行口)
- TMOD=0x11; //定时器工作方式控制寄存器(设置为00010001)
- //T0,T1均工作于方式1
- //GATE C/T M1 M0 GATE C/T M1 M0
- // 0 0 0 1 0 0 0 1
- //GATE:门控位,当GATE=0 时以TR启动定时器
- // 当GATE=1 时以INT0或INT1和TR共同启动定时器
- //C/T:定时方式或计算方式选择位,当C/T=0时为定时器工作方式
- //当C/T=1时为计数器工作方式
- //M1M0:工作方式选择位,M1M0=01时定时器工作在方式1
- //定时器有方式0,方式1,方式2,方式3四种工作方式
- //方式0为13位工作方式,但不能自动重新装载,一般不用
- //方式1位16位工作方式,但不能自动重新装载,常使用
- //方式2为8位工作方式,可以自动重新装载,常使用
- //方式3一般不用
- TH0=0x00; TL0=0x00;
- TH1=0x00;
- TL1=0x00;
- TR0=1; //启动T0
- TR1=1; //启动T1
- }
- void zhongduan_t0(void) interrupt 1 //产生舵机PWM波中断子程序(T0中断)
- {
- if(flag1==0)
- {
- TH0=(uchar)((16384-middle)/256+192); //单片机晶振频率为11.0592MHz,则定时器每隔(1/11.0592)*12us加1
- //舵机PWM周期为20ms,定时器要加多少次才有20ms呢:
- // (1/11.0592)*12=1.085
- //20*1000/1.085=18432
- //所以定时器要加18432次才有20ms
- //定时器从装载到定时器里的数向上加,加到65535时产生中断。
- //要产生舵机PWM高电平时间段,则加载到定时器里的值应该是65535-b
- //即th0=(65536-b)/256
- //tl0=(65536-b)%256=(16384-b)%256
- TL0=(uchar)((16384-middle)%256);
- flag1=1;
- rudder=1; //P0.0管脚电平跳变
- }
- else
- {
- TH0=(uchar)(middle/256+184); //th0为定时器0高8位起始计数值,tl0为定时器0低8位起始计数值
- TL0=(uchar)(middle%256); // th0=[65536-(18432-a)]/256=184+a/256
- //tl0=[65536-(18432-a)]%256=a%256
- rudder=0;
- flag1=0; //P0.0管脚电平跳变
- }
- TF0=0;
- TF1=0;
- }
- void zhongduan_t1(void) interrupt 3 //产生后轮PWM波中断子程序(T1中断)
- {
- if(flag2==0)
- {
- TH1=highh; //th1为定时器1高8位起始计数值,tl1为定时器1低8位起始计数值
- TL1=highl;
- pulse=1; //P1.1管脚电平跳变
- flag2=1;
- }
- else
- {
- TH1=lowh;
- TL1=lowl;
- pulse=0; //P1.1管脚电平跳变
- flag2=0;
- }
- TF1=0;
- TF0=0;
- }
- //以上是我用c51写的产生pwm波的程序,调试时不执行中断,这是为什么呢?希望各位朋友能指点一下
复制代码 |
|