关于C51定时器中断问题。

lzh280 2011-11-17 08:39:55
刚在网上看到的。源码如下,在keil v4里面编译通过,但有几点不解的,谁知道帮忙解释下,谢谢!

1、在中断函数里面的if(tt1 = 10)是什么意思?是赋值还是等于?

2、中断是如何执行到if里面的语句的?




//采用方式2,使用定时器T1定时1秒,循环点亮8盏LED灯,采用单片机c51
//---------------------------------------------------------------

#include<reg51.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar tt1, temp;

void timer1() interrupt 3
{
if(tt1 = 10)
{
tt1 = 0;
temp = _crol_(temp, 1);
P0 = temp;
}
}

void main()
{
temp = 0xfe;
TH1 = (256 - 100);
TL1 = (256 - 100);
EA = 1;
ET1 = 1;
TR1 = 1;
while(1);
}
...全文
136 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjtea 2011-11-18
  • 打赏
  • 举报
回复
原程序的本意应该是,每进入中断10次(例如1次50毫秒,10次半秒),执行一次if语句里面的内容。
_crol_(temp, 1); 应该是对temp移位1次。
正确的应该为:

tt1++;
if(tt1 == 10)
{ tt1=0;
...
}
hbwhck 2011-11-18
  • 打赏
  • 举报
回复
哦!看不懂 刚接触
lzh280 2011-11-18
  • 打赏
  • 举报
回复
谢谢各位!

本来是想在网上查C51 T1怎么使用的,在网上看到这个实例,就copy到Keil v4里面编译,竟然编译通过,而且在Kiel里面仿真也能执行到中断里面的if语句。特别是if(tt1 = 10)这句让人不懂,一般在别的编译这样写是会报错的。各位的解答让我明白了,谢谢各位的答复!
Frog1228 2011-11-18
  • 打赏
  • 举报
回复
可以写成 if(10==tt1),要是写错了变为10=tt1,编译器会报错,变量不能赋给一个常量。为了防止==写成=,可以把常量写在等号的左边。
liangboone 2011-11-17
  • 打赏
  • 举报
回复
(1) 应该是写错了,if里面是如果用赋值语句,一般C编译器是不会报错的。估计本意是像写成判断==的。
如果写成赋值语句,则等效于:
tt1 = 10;
if(tt1)
{
....
}

(2) 由于tt1不为0,所以if后面的语句会执行的。这样每来一次中断就会执行一次if里面的语句的。相当于这个if判断不存在的。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧