智能车制作
标题:
为什么我的程序进不了中断
[打印本页]
作者:
weixiongda
时间:
2009-11-29 20:23
标题:
为什么我的程序进不了中断
本帖最后由 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波的程序,调试时不执行中断,这是为什么呢?希望各位朋友能指点一下
复制代码
作者:
weixiongda
时间:
2009-11-29 20:54
自己看懂了
作者:
zdhly0401
时间:
2009-11-30 09:32
回复
2#
weixiongda
总的中断打开了吗?再看看中断里面清除中断标志了吗
作者:
chenrunshe_007
时间:
2009-12-7 13:52
回复
2#
weixiongda
写的太乱了没有人会这么耐心帮你看的,给点建议:1.把可能出问题的代码写出来OK,不用全部都弄出来。2.写代码要规范,写的工整一些,该对齐的对齐,改换行的换行,不然有错的话连你自己都不好找,更何况是别人。3.现在论坛里面发表帖子有个代码工具,用它发表看起来舒服得多
作者:
chenrunshe_007
时间:
2009-12-7 14:17
是不是看起来爽多了
作者:
chenrunshe_007
时间:
2009-12-7 14:20
是不是看起来爽多了,而且你的程序时C51的,发表在这里多半没什么人看,因为大家都用Freescale公司的MC9S12系列芯片
chenrunshe_007 发表于 2009-12-7 14:17
作者:
小雨1111
时间:
2010-1-6 12:40
说的是
作者:
jiao19880804
时间:
2010-3-19 20:44
等待中
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2