打印

高手帮个忙啊,这个程序为什么烧不进去?

[复制链接]
2912|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
物理导学|  楼主 | 2008-3-26 11:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序在keil上编译成功,但是为什么烧不到单片机上呢,我用的是AT89s52,应该可以啊,是不是烧写程序问题?
还有,我把所有P1换成P0,因为52学习板上的数码管在P0上呢,就编译出错了,为什么?谢谢了,程序如下





#include <AT89x051.H>        //器件配置文件
#define uchar unsigned char    //变量类型的宏定义
#define uint unsigned int
uchar code DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
                    0x92,0x82,0xF8,0x80,0x90,};/*0-9数码管段码*/
uchar DATA[20];                    /* 存放电话号码的数组*/
uchar X[3];                            /*存放时间t1数组*/
uchar Y[3];                            /*存放时间t2数组*/
uchar flag;                /*RAM区防干扰标志*/
uchar data_flag=0;    /*输入电话号码计数器(最长二十位)*/
uchar set=0;        /*功能键值*/
uchar m=0;          //全局变量
uchar n=0;
uint f;
uchar t1_flag=0;    /*输入时间1计数器(最长三位)*/
uchar t2_flag=0;    /*输入时间2计数器(最长三位)*/
uchar cnt_1=0;        /*时间t1单元数**算后暂存单元*/
uchar cnt_2=0;        /*时间t2单元数**算后暂存单元*/
/*****************************************************/
void delay(uint k);    /*延时子函数声明*/
void stop();        /*关机子函数声明*/
void bh();            /*拨号子函数声明*/
/***************************************************/
/*定时器T0初始化*/
void init_timer()
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
IE=0x82;
}
/***************************************************/
/*100mS定时中断服务子函数*/
 void zd0()interrupt 1 
{
P3_0=!P3_0;        //P3.0每100ms取反一次,送出脉冲
P1_7=!P1_7;        //数码管小数点同步闪烁
n++;
TH0=-(50000/256);
TL0=-(50000%256);
}
/***************************************************/
/*INT0中断服务子函数*/
 void zd_int0()interrupt 0 
{
delay(10);
if(P3_2==0)set++;        //功能键值递增
if(set>=5)set=0;        //键值的范围0~4
if(set==1)flag=0x55;    //向RAM区的标志flag写入55H
PCON=0x00;f=8;
again:if(P3_2==0)goto again;    //若按键未释放,则等待
}
/******************************************************/
/*INT1中断服务子函数*/
 void zd_int1()interrupt 2 
{uchar h;
f=0;
for(h=0;h<10;h++)            /*检查磁性开关(P3_3状态)10次,共1秒*/
{
delay(100);
if(P3_3==0)f++;
}
}
/********************************************************/
/*---关机---*/
void stop()
{if(flag==0x55)P1=0xfb;
    else P1=0x86;            //数码管右下角显示"1"。
delay(1);
if(flag==0x55)PCON=0x01;    /*进入节电待机状态*/
delay(1);
}
/********************************************************/
/*延时1ms*K子函数*/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}}
}
/********************************************************/
/*----输入时间t1----*/    
void in_time1()
{
P1=0xf7;delay(1);                    /*数码管显示"一"*/
if(P3_5==0)
{
    delay(10);                        /*按下OK键确认并点亮小数点*/
    if(P3_5==0){P1=0x7f;m=0;t1_flag=0;delay(500);}
while(t1_flag<3)
    {
    if(P3_4==0)
        {delay(10);if(P3_4==0)        /*按下UP键数码管作0-9递增显示*/
                    {m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
        }
        P1=DATA_7SEG[m];delay(1);    /*若不按下UP键数码管也作0-9显示*/
        if(P3_5==0)
        {delay(10);if(P3_5==0)        /*按下OK键显示的数据存入数组X中*/
            {X[t1_flag]=m;t1_flag++;P1=0x7f;delay(500);}
        
        }
    }
}
if(t1_flag>=3)t1_flag=0;            /*时间1计数器>=3时归零*/
}
/***********************************************************************/
/*----输入时间t2----*/    
void in_time2()
{
P1=0xb7;delay(1);                    /*数码管显示"二"*/            
if(P3_5==0)
{
    delay(10);                        /*按下OK键确认并点亮小数点*/
    if(P3_5==0){P1=0x7f;m=0;t2_flag=0;delay(500);}
while(t2_flag<3)
    {
    if(P3_4==0)
        {delay(10);if(P3_4==0)        /*按下UP键数码管作0-9递增显示*/
                    {m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
        }
        P1=DATA_7SEG[m];delay(1);    /*若不按下UP键数码管也作0-9显示*/
        if(P3_5==0)
        {delay(10);if(P3_5==0)        /*按下OK键显示的数据存入数组Y中*/
            {Y[t2_flag]=m;t2_flag++;P1=0x7f;delay(500);}
        
        }
    }
}
if(t2_flag>=3)t2_flag=0;            /*时间2计数器>=3时归零*/
}
/***********************************************************************/
/*----输入电话号码----*/    
void in_data()
{uchar g;
P1=0xb6;delay(1);                    /*数码管显示"三"*/
if(P3_5==0)
{delay(10);if(P3_5==0)
            {P1=0x7f;m=0;data_flag=0;        /*按下OK键确认并点亮小数点*/
            for(g=0;g<20;g++){DATA[g]=10;}
            delay(500);                /*同时DATA数组中全部写入10*/
            while(1)
            {
            if(P3_4==0){delay(10);    /*按下UP键数码管作0-9递增显示*/
                if(P3_4==0){m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
                        }
            P1=DATA_7SEG[m];delay(1);/*若不按下UP键数码管也作0-9显示*/    
            if(P3_5==0)
                {delay(10);
                if(P3_5==0)            /*按下OK键显示的数据(号码)存入数组DATA中*/
                {DATA[data_flag]=m;data_flag++;P1=0x7f;delay(500);}
                }                    /*按下OK键超过2秒则退出向数组DATA送入号码*/
            if(P3_5==0){delay(2000);if(P3_5==0)break;}
            }
}
}                                    /*数码管显示"三"*/
F1:if(P3_5==0){delay(10);if(P3_5==0){P1=0xb6;delay(1);goto F1;}}
}
/***********************************************************************/
/*---启动报警器进入警戒工作---*/
void work()
{    uchar h;
    P1=0xdf;                        /*数码管左上角显示"1"*/
    delay(1);
if(set==1)                            /*进入时间1循环*/
{while(cnt_1<=X[0]*100+X[1]*10+X[2])
        {
        delay(1000);            
        cnt_1++;                    /*计数器cnt_1累加*/    
        if(set!=1){EX1=0;cnt_1=0;break;}
        }            /*如按下Set键,则退出此循环*/
}
else {EX1=0;PCON=0x00;}/*Set不为1,则关闭外中断1,退出待机状态*/
if(set==1)
{if(cnt_1>=X[0]*100+X[1]*10+X[2])
    {EX1=1;cnt_1=0;}    /*时间1到,打开外中断1,计数器归零*/
/*进入待机。若有1秒以上开关动作,退出待机*/
while(1)
{PCON=0x01;if(f>=5){PCON=0x00;break;}}
}
/*-----------------------------------------------------*/                    
EX1=0;                    /*关闭外中断1*/
if(set==1)                /*进入时间2循环*/
{while(cnt_2<=Y[0]*100+Y[1]*10+Y[2])
        {
        delay(1000);
        cnt_2++;        /*计数器cnt_2累加*/
        if(set!=1){cnt_2=0;break;}
        }                /*如按下Set键,则退出此循环*/
}
if(set==1)
{
bh();                    /*时间2到,调用拨号子程序*/
delay(3000);
P3_7=0;//控制输出端为低
for(h=0;h<60;h++)        /*发出60秒警音*/
{        for(f=0;f<500;f++)
        {f++;
        P3_1=!P3_1;P1=0x5f;
        delay(1);
        }
    P3_1=0;P1=0x7f;delay(500);
}
P3_7=1;//控制输出端恢复高
cnt_1=0;cnt_2=0;        /*有关计数器、端口回到初始状态*/
P3_0=0;P3_1=0;P1_7=1;
for(f=0;f<3;f++)delay(60000);/*关闭3分钟,以便进行电话报警*/
}
}
/********************************************************************/
/*---拨号---*/
void bh()
{data_flag=0;                /*电话号码计数器(二十位)归零*/
    P3_0=1;                    /*接通线路*/
    P1_7=0;                    /*数码管小数点亮*/
    delay(1000);
while(DATA[data_flag]<10)    /*号码小于10进入循环拨号状态*/
{
    if(DATA[data_flag]==0)    /*若号码为0*/
    {TR0=1;                    /*启动T0定时器*/
    if(n==20){data_flag++;    /*进行20次中断,产生10个脉冲*/
                n=0;TR0=0;
                P3_0=1;P1_7=0;
                delay(500);
                }
    }
    
    if(DATA[data_flag]>0)        /*若号码>0*/
    {TR0=1;                        /*启动T0定时器*/
    if(n==((DATA[data_flag])*2))/*进行号码x2次中断,产生号码个脉冲*/
            {data_flag++;
                n=0;TR0=0;
                P3_0=1;P1_7=0;
                delay(500);
            }
    }
}
TR0=0;
}    
/*********************************************************************/
/*--主函数--*/
void main()
{
init_timer();                    /*定时器T0初始化*/
EA=1;EX0=1;                        /*开总中断,开外中断0*/
P3_0=0;                            /*关闭线路(挂机)*/
P3_1=0;    
while(1)                            /*无限循环*/
{
switch(set)                        /*根据Set标志散转*/
{
case 0:stop();break;            /*关机*/
case 1:work();break;            /*警戒工作*/
case 2:in_time1();break;        /*输入时间t1*/
case 3:in_time2();break;        /*输入时间t2*/
case 4:in_data();break;            /*输入电话号码*/
default:break;

    if(flag!=0x55)                /*若flag标志变化,数码管显示E(错误)*/
     {P1=0x86;delay(1);}
}
}

相关帖子

沙发
物理导学|  楼主 | 2008-3-26 12:01 | 只看该作者

程序太长了

很麻烦,谢谢高手帮忙实验一下啊  跪谢。。。

使用特权

评论回复
板凳
zhaoyu2005| | 2008-3-26 12:21 | 只看该作者

#include

这一句有问题,决定所选器件只能是AT89C1(2,4)051,就P1和P3两个口,你现在出现了P0口当然报错了,改成#include <reg51.H>,看还有什么问题没

使用特权

评论回复
地板
cqwangsf| | 2008-3-26 12:58 | 只看该作者

空间不够?

使用特权

评论回复
5
物理导学|  楼主 | 2008-3-29 13:04 | 只看该作者

zhaoyu2005 谢谢了

使用特权

评论回复
6
gyt| | 2008-3-29 15:49 | 只看该作者

只要不是程序太大,

是否能够烧写和源程序应该没有关系吧

使用特权

评论回复
7
5_0_5| | 2008-3-29 15:54 | 只看该作者

楼上,看清楚咯

是编译错误,而不是烧写错误x051没有P0口的

使用特权

评论回复
8
gyt| | 2008-3-29 16:03 | 只看该作者

原来LZ问了两个分开的问题。

谢谢LS的纠正。

使用特权

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

本版积分规则

5

主题

16

帖子

0

粉丝