智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4524|回复: 7
打印 上一主题 下一主题

为什么我的程序进不了中断

[复制链接]

3

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
威望
183
贡献
22
兑换币
0
注册时间
2009-11-10
在线时间
3 小时
跳转到指定楼层
1#
发表于 2009-11-29 20:23:15 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 chenrunshe_007 于 2009-12-7 14:16 编辑
  1. #include <reg51.h> //头文件,此文件为自己定义
  2. #include <intrins.h> //头文件,此文件为系统自带
  3. #include <math.h> //头文件,此文件为系统自带
  4. #define middle 1170 //舵机偏转角为0度时设定值
  5. #define high 14000 //high为后轮PWM波高电平时间,PWM波周期为14436;则低电平时间为14436减去high的值,high取值范围为0—14435
  6. #define uchar unsigned char //定义以后使用更加方便
  7. #define uint unsigned int //定义以后使用更加方便
  8. sbit rudder=P0^0; //定义舵机PWM波输出端口为P0.0口
  9. sbit pulse=P1^1; //定义后轮PWM波输出端口为P1.1口(此2个口可为单片机32个通用I/O,口中任意2个,但用到P0那8个口要加上拉电阻,在初学单片机时尽量不要用P0口)
  10. bit flag1=0,flag2=0; //定义全局变量(flag1用于控制舵机PWM标志位,flag2用于控制电机PWM)
  11. uchar highh,highl,lowh,lowl;

  12. main()
  13. {
  14.     pulse=0;
  15.     highh=(uchar)((16384-high)/256+192); //根据PWM计算定时器的值
  16.     highl=(uchar)((16384-high)%256);
  17.     lowh=(uchar)(high/256+200);
  18.     lowl=(uchar)(high%256);
  19.     IE=0x8a; //中断允许控制寄存器(设置为10001010)
  20. //EA - ET2 ES ET1 EX1 ET0 EX0
  21. //1 0 0 0 1 0 1 0
  22. //EA:中断允许总控制位(EA=0时中断总禁止,EA=1时中断总允许) //EX0,EX1外部中断允许位(这里没有用到外部中断,可设置成1或0)
  23. //ET0,ET1,ET2定时/计数中断允许位(这里只用到定时器0(控制舵机) //定时器1(控制电机),没有用到定时器2) //ES串行口中断允许位(这里没有用到串行口)

  24. TMOD=0x11; //定时器工作方式控制寄存器(设置为00010001)
  25. //T0,T1均工作于方式1
  26. //GATE C/T M1 M0 GATE C/T M1 M0
  27. // 0 0 0 1 0 0 0 1
  28. //GATE:门控位,当GATE=0 时以TR启动定时器
  29. // 当GATE=1 时以INT0或INT1和TR共同启动定时器
  30. //C/T:定时方式或计算方式选择位,当C/T=0时为定时器工作方式
  31. //当C/T=1时为计数器工作方式
  32. //M1M0:工作方式选择位,M1M0=01时定时器工作在方式1
  33. //定时器有方式0,方式1,方式2,方式3四种工作方式
  34. //方式0为13位工作方式,但不能自动重新装载,一般不用
  35. //方式1位16位工作方式,但不能自动重新装载,常使用
  36. //方式2为8位工作方式,可以自动重新装载,常使用
  37. //方式3一般不用

  38.     TH0=0x00; TL0=0x00;
  39.     TH1=0x00;
  40.     TL1=0x00;
  41.     TR0=1; //启动T0
  42.     TR1=1; //启动T1
  43. }
  44. void zhongduan_t0(void) interrupt 1 //产生舵机PWM波中断子程序(T0中断)
  45. {
  46.     if(flag1==0)
  47.     {
  48.         TH0=(uchar)((16384-middle)/256+192); //单片机晶振频率为11.0592MHz,则定时器每隔(1/11.0592)*12us加1
  49. //舵机PWM周期为20ms,定时器要加多少次才有20ms呢:
  50. // (1/11.0592)*12=1.085
  51. //20*1000/1.085=18432
  52. //所以定时器要加18432次才有20ms
  53. //定时器从装载到定时器里的数向上加,加到65535时产生中断。
  54. //要产生舵机PWM高电平时间段,则加载到定时器里的值应该是65535-b
  55. //即th0=(65536-b)/256
  56. //tl0=(65536-b)%256=(16384-b)%256
  57.         TL0=(uchar)((16384-middle)%256);
  58.         flag1=1;
  59.         rudder=1; //P0.0管脚电平跳变
  60.     }
  61.     else
  62.     {
  63.         TH0=(uchar)(middle/256+184); //th0为定时器0高8位起始计数值,tl0为定时器0低8位起始计数值
  64.         TL0=(uchar)(middle%256); // th0=[65536-(18432-a)]/256=184+a/256
  65. //tl0=[65536-(18432-a)]%256=a%256
  66.         rudder=0;
  67.         flag1=0; //P0.0管脚电平跳变
  68.     }
  69.     TF0=0;
  70.     TF1=0;
  71. }
  72. void zhongduan_t1(void) interrupt 3 //产生后轮PWM波中断子程序(T1中断)
  73. {
  74.     if(flag2==0)
  75.     {
  76.         TH1=highh; //th1为定时器1高8位起始计数值,tl1为定时器1低8位起始计数值
  77.         TL1=highl;
  78.         pulse=1; //P1.1管脚电平跳变
  79.         flag2=1;
  80.     }
  81.     else
  82.     {
  83.         TH1=lowh;
  84.         TL1=lowl;
  85.         pulse=0; //P1.1管脚电平跳变
  86.         flag2=0;
  87.     }
  88.     TF1=0;
  89.     TF0=0;
  90. }
  91. //以上是我用c51写的产生pwm波的程序,调试时不执行中断,这是为什么呢?希望各位朋友能指点一下
复制代码

9

主题

199

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
8268

论坛元老奖章

QQ
威望
529
贡献
7627
兑换币
0
注册时间
2010-1-10
在线时间
56 小时
8#
发表于 2010-3-19 20:44:44 | 只看该作者
等待中
回复 支持 反对

使用道具 举报

5

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
QQ
威望
361
贡献
20
兑换币
0
注册时间
2009-11-16
在线时间
54 小时
7#
发表于 2010-1-6 12:40:41 | 只看该作者
说的是
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
6#
发表于 2009-12-7 14:20:14 | 只看该作者
是不是看起来爽多了,而且你的程序时C51的,发表在这里多半没什么人看,因为大家都用Freescale公司的MC9S12系列芯片
chenrunshe_007 发表于 2009-12-7 14:17
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
5#
发表于 2009-12-7 14:17:13 | 只看该作者
是不是看起来爽多了
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
4#
发表于 2009-12-7 13:52:55 | 只看该作者
回复 2# weixiongda
写的太乱了没有人会这么耐心帮你看的,给点建议:1.把可能出问题的代码写出来OK,不用全部都弄出来。2.写代码要规范,写的工整一些,该对齐的对齐,改换行的换行,不然有错的话连你自己都不好找,更何况是别人。3.现在论坛里面发表帖子有个代码工具,用它发表看起来舒服得多
回复 支持 反对

使用道具 举报

22

主题

518

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
6442
QQ
威望
943
贡献
5041
兑换币
99
注册时间
2008-2-26
在线时间
229 小时
3#
发表于 2009-11-30 09:32:15 | 只看该作者
回复 2# weixiongda

总的中断打开了吗?再看看中断里面清除中断标志了吗
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
威望
183
贡献
22
兑换币
0
注册时间
2009-11-10
在线时间
3 小时
2#
 楼主| 发表于 2009-11-29 20:54:57 | 只看该作者
自己看懂了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-28 14:13 , Processed in 0.054792 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表