打印

对于kile c编程序遇到的奇怪问题,府上代码

[复制链接]
3164|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoyu9632|  楼主 | 2007-6-12 11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <atmelAT89X52.H>
#include <stdio.h>

#define T0_LOW 0x3A
#define T0_HIGH 0xFE

idata led_coder[10] = {0xbf,0x8c,0xdb,0xde,0xec,0xf6,0xf7,0x9c,0xff,0xfe};
unsigned char led_bit = 0;

void led_disp(void)
{
    switch(led_bit)
    {
        case 0:
            P2 = 0xff;
            P1 = led_coder[0];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x0;

            break;
        case 1:
            P2 = 0xff;
            P1 = led_coder[1];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x1;
            break;
        case 2:
            P2 = 0xff;
            P1 = led_coder[2];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x2;
            break;
        case 3:
            P2 = 0xff;
            P1 = led_coder[3];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x3;
            break;
        case 4:
            P2 = 0xff;
            P1 = led_coder[4];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x4;
            break;
        case 5:
            P2 = 0xff;
            P1 = led_coder[5];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x5;
            break;
        case 6:
            P2 = 0xff;
            P1 = led_coder[6];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x6;
            break;
        case 7:
            P2 = 0xff;
            P1 = led_coder[7];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x7;
            break;
        case 8:
            P2 = 0xff;
            P1 = led_coder[8];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x8;
            break;
        case 9:
            P2 = 0xff;
            P1 = led_coder[9];
            P1_7 = 0;
            P2 = 0xff;
            P1_7 = 1;
            P2 = 0x9;
            break;
        default:
            break;

    }
    if(led_bit == 9)
        led_bit = 0;
    else
        led_bit++;
}

void ISRTimer0() interrupt 1
{
    TL0 = T0_LOW;
    TH0 = T0_HIGH;
    led_disp();
    
}

void InitCPU(void)
{
    IP = 0x0;//-- PS1 PT2 PS0 PT1 PX1 PT0 PX0
//PT2 定时器2 中断优先级
//PS 串行通信中断优先级
//PT1 定时器1 中断优先级
//PX1 外部中断1 优先级
//PT0 定时器0 中断优先级
//PX0 外部中断0 优先级
            // 中断优先级为外部中断0最高,其次外部中断1,其次定时器0,串口中断
    IE = 0x82;    //0  外部中断0   1  定时器0 溢出  2  外部中断1   3  定时器1 溢出  4   串行口中断  5   定时器2 溢出  
            // EA=0,中断关闭 EA ES1 ET2 ES ET1 EX1 ET0 EX0
            // ET1=0,允许定时中断1
                // EX0=1,允许外中断0
                // EX1=0,不允许外中断1
                // ET0=1,允许定时中断0
                // ES=1,允许串口中断
    TMOD = 0x10; // 定时器0,采用方式1,16位计数
                    //        GATE=0,由TR0控制
                    //        C/T=0,做为定时器
                    //        (M1,M0)=01,16位定时器
                    // 定时器1,采用方式1,16位计数
                    //        GATE=0,由TR1控制
                    //        C/T=0,做为定时器
                    //        (M1,M0)=10,8位自动重载定时器
                    //T0用来做延时,T1用来产生串口通信的波特率。
    TL0 = T0_LOW;
    TH0 = T0_HIGH; 
    TR0 = 1;
}

void main(void)
{
    InitCPU();
    while(1)
    {
        ;
    }
    
}
我用汇编编写了一段调试程序,已经达到效果,然后我再kile c的环境下编写这段c程序,仿真我都觉得通过了,烧录上去没有任何反应,我查看生成的汇编代码,发现程序代码是从0x4190处开始执行的(定时器0的代码)我很奇怪为什么会这样,朋友们帮我分析下

相关帖子

沙发
xiaoyu9632|  楼主 | 2007-6-12 11:43 | 只看该作者

希望路过的朋友们能留步看下

如果有需要看我的汇编代码也可以,很奇怪

使用特权

评论回复
板凳
xiaoyu9632|  楼主 | 2007-6-12 16:49 | 只看该作者

没有人回答我

郁闷中,,,,,

使用特权

评论回复
地板
lenglx| | 2007-6-12 17:01 | 只看该作者

没怎么懂你的意思


我用汇编编写了一段调试程序,已经达到效果,然后我再kile c的环境下编写这段c程序,仿真我都觉得通过了,烧录上去没有任何反应,我查看生成的汇编代码,发现程序代码是从0x4190处开始执行的(定时器0的代码)我很奇怪为什么会这样,朋友们帮我分析下

既然仿真通过,那便是从地址0开始的了,否则怎么仿真通过的.
那你是怎么发现从0x4190开始的?

使用特权

评论回复
5
computer00| | 2007-6-12 17:05 | 只看该作者

是不是你的定时器重装值搞错了? 时间很短.

使用特权

评论回复
6
小小电子| | 2007-6-12 17:08 | 只看该作者

加个延时看看

使用特权

评论回复
7
awey| | 2007-6-12 23:43 | 只看该作者

不像是时间的问题,可能是编译器设置不对

使用特权

评论回复
8
xiaoyu9632|  楼主 | 2007-6-14 10:50 | 只看该作者

我说的地址是定时器跳转的地址了

定时器地址是000B,这里生成的汇编有条指令,LJMP跳转到哪个地方地址是0X4190,我说的仿真通过就是在运行程序的时候可以看到I/O口的变化,但是烧录上去却看不到I/O口有波形输出

使用特权

评论回复
9
lxshd| | 2007-6-14 16:22 | 只看该作者

没使能中断

void ISRTimer0() interrupt 1 
中断处理程序在退出时没有开中断

使用特权

评论回复
10
happy803| | 2007-6-14 17:48 | 只看该作者

对于kile c编程序遇到的奇怪问题,府上代码

程序执行一般从0000H开始,然后通过一条长跳转指令转到主程序的存储位置处执行.按理说定时器值大小并不影响操作,但前提是需要在主程序中的循环中不断给定时器零赋值.如果没有这一步,定时器中断只执行一次,肯定输出没什么变化的.

使用特权

评论回复
11
xiaoyu9632|  楼主 | 2007-6-17 21:51 | 只看该作者

我中断里面不是已经给定时器0赋值了吗?楼上的兄弟怎么说只会执行一次呢,而且谁写程序会在主程序不断给定时器赋值呢??

使用特权

评论回复
12
Flyer369| | 2007-6-18 13:49 | 只看该作者

奇怪问题

#include <atmelAT89X52.H>

使用特权

评论回复
13
hugerat| | 2007-6-18 14:04 | 只看该作者

EA=0,所有中断都被关闭了。

使用特权

评论回复
14
xiaoyu9632|  楼主 | 2007-6-19 20:40 | 只看该作者

再晕楼上的

肯定没有仔细看程序, IE = 0x82; 你看看这句话,哪里令EA=0了???

使用特权

评论回复
15
xplore| | 2007-6-19 21:26 | 只看该作者

那个startup

连进去了吗?

使用特权

评论回复
16
枣树根| | 2007-6-19 22:37 | 只看该作者

是中断服务程序的问题?

老大开了这么多中断怎么不见中断服务程序?
// ET1=0,允许定时中断1(无服务程序)
              // EX0=1,允许外中断0(无服务程序)
                // EX1=0,不允许外中断1
                // ET0=1,允许定时中断0
 // ES=1,允许串口中断(无服务程序)

使用特权

评论回复
17
xiaoyu9632|  楼主 | 2007-6-20 20:33 | 只看该作者

回15楼

这个文件我加了进去的,很奇怪,我好像找不出原因,我在kile c中编译运行都正确,就是烧录进去不行,而我在wave中编译会说我超出范围。楼上的好像不懂程序,//后面都是解释,要看前面的代码才知道我到底开了哪些中断,并写了那个中断的服务程序。

使用特权

评论回复
18
lichear| | 2007-6-21 14:28 | 只看该作者

回楼主

定时器  TMOD = 0x10; // 定时器0,采用方式1,16位计数
只产生一次中断。
你既然没有修改中断优先级你这句 IP = 0x0;多余
编程习惯不好!

使用特权

评论回复
19
风_007| | 2007-6-22 00:01 | 只看该作者

可能是你的优化程序太高了!!

程序的优化程度如果设的太高可能产生这样的错误,建议修改优先级。。。看看反编译的代码!!

使用特权

评论回复
20
fishingok| | 2007-6-22 00:07 | 只看该作者

333

我也看不懂哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

159

帖子

0

粉丝