2469|6

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

初学者:跑马灯+中断出错了怎么会事啊 [复制链接]

我用的是AT89S52的片,把下边的程序烧进去后,只要进了中断就出不来了是怎么会事啊,出不来还好,灯还在哪瞎闪,希望大家帮帮我啊
#include
/*
        本源程序有三种跑马灯的方式:
                第一种:8个LED灯同时闪亮
                第二种:3个LED灯自0到7跑步走
                第三种:0号LED灯来回跑
        触发方式:
                其中第一种方式为默认跑等方式
                第二种跑灯方式由外部中断0来触发
                第三种跑灯反式由外部中断1来触发
*/
/**************函数声明*****************/
void timelag(unsigned int n);//延时子程序
/***************************************/
void main()
{
        IE=0x84; //打开中断总开关
        EX0=1;//打开中断0
        PX1=1;
         /*选择触发方式为边沿触发方式*/
        IT0=0;
         IT1=0;

        while(1)//跑等方式1
        {
                P1=0xFF;//全部熄灭
                timelag(2);
                P1=0;//全部点亮
                timelag(2);
        }
}
/*
//中断0的服务程序
void discontinue0(void) interrupt 0 using 1//中断0服务程序选择寄存器组1
{
        unsigned int run_style2[11]={0xFF,0xFE,0xFC,0xF8,0xF1,0xE3,0xC7,0x8F,0x1F,0x3F,0x7F};       
        unsigned int i;//循环变量
        for(i=0;i<5;i++)
        {
                for(i=0;i<11;i++)
                {
                        P1=run_style2;
                        timelag(2);
                }
        }
        IE0=0;
}
*/
//中断1的服务程序
void discontinue1() interrupt 2 using 2//中断1服务程序选择寄存器组2
{
        //unsigned int run_style3[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
        //unsigned int i,j,n;
        P1=0xFF;//先全部熄灭
        timelag(10);
        /*
        for(n=0;n<10;n++)//控制跑的圈数
        {
                for(i=0;i<8;i++)
                {
                        P1=run_style3;
                        timelag(2);
                }
                for(j=6;j>=0;j--)
                {
                        P1=run_style3[j];
                        timelag(2);
                }
        }
        */
}

void timelag(unsigned int n)//延时子程序
{
        unsigned int i,j;
        for(i=0;i                 for(j=0;j<30000;j++);
}

最新回复

中断里面尽量不要再加延时  详情 回复 发表于 2009-11-23 23:02
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你编译的时候应该有警告啊,延时程序被重复调用了
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 wangfan027 的回复:
你编译的时候应该有警告啊,延时程序被重复调用了
延时程序被重复调用了 也会报错?不是吧,你写的子程序 都是只能调用一次?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
//中断0的服务程序
void discontinue0(void) interrupt 0 using 1//中断0服务程序选择寄存器组1
{
unsigned int run_style2[11]={0xFF,0xFE,0xFC,0xF8,0xF1,0xE3,0xC7,0x8F,0x1F,0x3F,0x7F};
unsigned int i;//循环变量
for(i=0;i <5;i++)
{
for(i=0;i <11;i++)
{
看看你的for语句里面的条件,好好分析一下这里
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
timelag(2);

可能会在同一时间调用两次这个函数

LZ再理一下逻辑
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
几点建议:
1.下次发帖时,把屏蔽掉的代码删掉,否则没人愿意看;比如“中断0的服务程序 ”以及“中断1的服务程序 ”中的/*...*/部分;
2.主循环中,在控制点亮、熄灭,同时“中断1的服务程序 ”中又在控制熄灭;这样逻辑很混乱。“灯还在哪瞎闪”就是这里的原因。
3.不要到处使用类似于timelag的延时。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

7
 
中断里面尽量不要再加延时
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表