网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月02日
漏签
0
天
单片机吧
关注:
210,629
贴子:
1,042,573
看贴
图片
吧主推荐
视频
游戏
1
2
下一页
尾页
146
回复贴,共
2
页
,跳到
页
确定
<<返回单片机吧
>0< 加载中...
吧友可以给个带标志位的中断范例程序吗?
只看楼主
收藏
回复
用户阿黑
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
现在有多个任务要执行,内个任务之间需要定时两秒执行下一个,怎么中断呢?
一直编的乱七八糟的
马浪狂
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
计时器中断
翰轩网络科技
岁月哥
单片机
专业毕业,擅长51
单片机
,STM32
单片机
,Proteus仿真设计,Keil程序代写,实物订制服务
2025-02-02 01:27
广告
立即查看
honyry
上校
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
慢慢加标志位呗,着急干啥呢!一个任务完成加一。
用户阿黑
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include <reg52.h>
#include <intrins.h>
#define LED P2
typedef unsigned char u8;
typedef unsigned int u16;
u16 T;
u8 i,j;
void delay15ms(void)
{
for(i=100;i>0;i--)
for(j=150;j>0;j--);
}
void Timer0Init()
{
TMOD |= 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
ET0 = 1;
EA = 1;
TR0 = 1;
TF0 = 0;
}
void main()
{
Timer0Init();
while(1)
{
if(T==40)
{
T = 0;
LED = 0xfe; //第一个任务
delay15ms();
for(i=0;i<7;i++)
{
LED = _crol_(LED,1);
delay15ms();
}
}
if(T==40)
{
T = 0;
LED = 0x7f; //第二个任务
delay15ms();
for(i=0;i<7;i++)
{
LED = _cror_(LED,1);
delay15ms();
}
}
}
}
void Timer0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
T++;
}
像朕这样的人
上士
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
30快,卖给你
用户阿黑
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
来過这世界
大校
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
honyry
上校
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
楼主这么写,外面还留个中断函数干啥!直接主函就可以了呀!第一个任务完成后,延时2秒,再第二个任务,再延时 再第三个任务 再延时,一直这样,所有任务都完成了,主函数的while 循环1次,多简单。我以为多大点问题呢!你上面不是有个delay15ms吗,就用他延时就行,1次15ms 10次150ms 100次1500ms 2000ms是多少次?
自己算吧
用户阿黑
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
用户阿黑
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
haolizhong4924
上尉
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
楼主@口琴癌
兄:
首先,既然用了定时器,就没有必要再用那个“延时子程序”delay15ms了。全部靠定时器来调度时序,程序可以非常非常简单。
比如,要想让流水灯每15毫秒向左动一格,只要将定时器设定成每15毫秒中断一次,在中断服务程序里做一次LED = _crol_(LED,1);即可。主程序中初始化后什么都不需要做(写一个空的死循环)。
另外,您的“第一个任务”、“第二个任务”,是想实现什么样的效果?您想清楚,说清楚,别人才好帮你考虑。
haolizhong4924
上尉
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
另外,您的:
TH0 = 0x3C;
TL0 = 0xB0;
是什么意思?因为我不知道您用的主频是多少,所以不知道您的0x3C B0是代表多少时间?
您告诉我,下面才好考虑。
用户阿黑
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
haolizhong4924
上尉
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我仍然没有明白您说的任务一、任务二、任务三是什么意思。看了您上面贴出的程序猜想可能是下面的叙述,不知对不对?
无限重复以下操作:
{
(1) 维持两秒钟;
(2) 流水灯由最低位亮,每15ms向左移动一格,直到变成最高位亮;
(3) 维持两秒钟;
(4) 流水灯由最高位亮,每15ms向右移动一格,直到变成最低位亮;
(5) 维持两秒钟;
(6) 重复以下操作三遍:
{
(6-1) 流水灯由最低位亮,每15ms向左移动一格,直到变成最高位亮;
(6-2) 流水灯由最高位亮,每15ms向右移动一格,直到变成最低位亮;
(6-3) 接着由???亮,每15ms向左移动2格,直到变成??位亮;
(6-4) 接着由bit1位亮,每15ms向左移动2格,直到变成最高位亮。
}
}
(部分因图片不全看不清楚)
也就是说,上述的(2)就是任务一。(4)就是任务二,(6)就是任务三。
是不是?
如果是的话,这个程序存在以下问题:
(待续)
haolizhong4924
上尉
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(续)这个程序存在以下问题:
一、
您采用while(TF0==0);来查询定时器时间到标志,有可能出现:当TF0刚变成1而主程序还没来得及读取TF0做判断的时候,先进入了中断,于是TF0就被硬件自动清零了,返回主程序后while的判断中发现不了TF0变成过1,于是while(TF0==0);语句就不能退出了。
上面说的是“有可能”。另外也有可能当TF0刚变成1的瞬间,正好处在主程序的读取TF0的汇编指令的前一半尚未读TF0的瞬间,而中断响应是不会打断半条汇编指令的,故此时仍能发现TF0变成1了。
所以这段程序的效果是不确定的(与所用的C编译程序如何优化有关)。
为避免这种不确定性,可以将原来的
for (T=0;T<40;T++)
{
while(TF0==0);
}
改成
for (T=0;T<40;T++)
{
ET0 = 0;
while(TF0==0);
ET0 = 1;
}
保证查询期间不会进入中断程序,即可。
不过可以告诉您,这样虽然可以,但一般的实用程序中,很少用这种在主程序中“查询中断标志位”的设计方法的。更常用的是:直接将定时的操作编到中断服务程序里面去。
还有其他问题,因时间关系,容缓。
(待续)
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示