标题: 关于KEIL4 注册过 如下程序不能生成HEX文件 [打印本页]

作者: 越快乐越堕落    时间: 2016-4-24 14:29
标题: 关于KEIL4 注册过 如下程序不能生成HEX文件
我给STC12C2052AD单片机编译程序,KEIL4是注册过的,不存在程序大于2K的问题。用任何一个KEIL都是同样的情况。在主函数处加入了P3M0=0X01;
P3M1=0X00;  就不行,就显示图里的文件不会创建。如果不加入这两句就能通过编译。用其他比这个还多的程序编译都能生成HEX文件,但唯独这个不行。是不是程序超过选择单片机的容量?????还是程序本身有问题?还是别的什么原因???这段程序别人编译就能通过。求大神解答!!!下面是程序


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

/*uchar code table[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
                                        0x82,0xf8,0x80,0x90,0x88,0x83,
                                        0xc6,0xa1,0x86,0x8e,0x89,0x8c};
uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xfb};
void delay(uint z)

{
         uint x,y;
        for(x=z;x>0;x++)
        for(y=120;y>0;y++);
}*/
//  //声明头文件



sbit key1=P3^4;  //按键接口定义

sbit key2=P3^5;  //按键接口定义

sbit speaker=P3^7;  //蜂鸣器接口定义

/************************************************************************************/

unsigned char code LED[10]={0x20,0xA7,0x90,0x82,0x07,0x42,0x40,0xA6,0x00,0x02};//数码管段位码定义

unsigned int time; //全局秒基准定义

/*-------------------------------------延时函数-------------------------------------*/

void delayms (unsigned int a){

unsigned int i;

while( --a != 0){

for(i = 0; i < 600; i++);

}

}

/*----------------------------------蜂鸣器驱动函数----------------------------------*/

void beep (void)

{   

unsigned char i=30;

while(i--)

{

speaker=~speaker;

delayms(3);

    }

}

/*----------------------------------数码管驱动函数----------------------------------*/

void display (unsigned char hour,min)

{

unsigned char H1,H2,M1,M2;

P3=0xf8; //数码管位选

P1 = LED[H1];     //数码管段选

delayms (2); //扫描延时

P3=0xf4; //数码管位选

P1 = LED[H2];     //数码管段选

delayms (2); //扫描延时

P3=0xf2; //数码管位选

P1 = LED[M1];     //数码管段选

delayms (2); //扫描延时

P3=0xf1; //数码管位选

P1 = LED[M2];     //数码管段选

delayms (2); //扫描延时

/*--------------------------------------分定义--------------------------------------*/

M1=min/10;//取分十位

min=min%10;//取余  

M2=min;//取分个位

/*--------------------------------------时定义--------------------------------------*/

H1=hour/10;//取时十位

hour=hour%10;//取余  

H2=hour;//取时个位

}

/*-----------------------------------按键去抖函数-----------------------------------*/

void qudou (unsigned char hour,min)

{

unsigned char i;

for(i=0;i<25;i++){//循环显示,等于键盘去抖的功能

display (hour,min);

}

}

/*--------------------------------------主函数--------------------------------------*/

void main(void)

{
P3M0=0X01;
P3M1=0X00;
////定时器初始设置

TMOD=0x01;//定时器工作方式1

TH0=0x3C;//定时器初始产生50ms时基信号

TL0=0xB0;//定时器初始产生50ms时基信号

ET0=1;//开定时器中断

EA=1;//开总中断

TR0=1;//启动定时器

/*************************************************************************************/

while(1)

{

unsigned char hour,min;//定义时分


display (hour,min);//调用显示函数


if (time>59)//60秒向分进1

{

time=0;

min++;

   }

if (min>59)//60分向时进1

{

min=0;

hour++;

beep ();

    }

if (hour>23)//24时时分秒清零

{

hour=0;

min=0;

time=0;

}

/*-----------------------------------按键判断程序-----------------------------------*/

if(key1==0)

qudou (hour,min);

if (key1==0) {hour++;}


if(key2==0)

qudou (hour,min);

if (key2==0) {min++;}

}

}

/*-----------------------------------中断服务程序-----------------------------------*/

void Timer0_Routine(void) interrupt 1

{

unsigned char a;

TH0=0x3C;//定时器初始产生50ms时基信号

TL0=0xB0;//定时器初始产生50ms时基信号

    a++;//定时器循环计数20次为一秒

if (a==20){//定时器循环计数20次为一秒

a=0;//次数清零,从新循环计数

time++;//秒加一

}

}




作者: baofu    时间: 2016-4-24 15:09
一般说,Keilc中仅有传统的51系列的寄存器定义,却没有stc单片机特有的寄存器定义,如果需要,允许自己在头文件中加入相关的定义,然后就可以用了。stc文档中对这些是有说明的,看看就明白了。
作者: wc86110    时间: 2016-4-24 15:10
LZ,把它改成 :P3MO=0x01;
        P3M1=0x00;
那个 x 要英文小写。
作者: wc86110    时间: 2016-4-24 15:13
标点符号也得用小写。


作者: 越快乐越堕落    时间: 2016-4-24 15:35
wc86110 发表于 2016-4-24 15:10
LZ,把它改成 :P3MO=0x01;
        P3M1=0x00;
那个 x 要英文小写。

试过了 不行,不管是x还是分号,都不行
作者: 越快乐越堕落    时间: 2016-4-24 15:36
wc86110 发表于 2016-4-24 15:13
标点符号也得用小写。

应该是程序其他地方和这两句不一致,
作者: cyy998    时间: 2016-4-24 15:59
应该是没有包含STC头文件的原因。

STC12C2052AD.rar (1.49 KB, 下载次数: 9)


作者: wc86110    时间: 2016-4-24 16:40
呵呵,原来是你画蛇添足啊,刚才我也没注意看。把这两行去掉然后再编译。固件烧录STC12C2052一样可用,只是当普通的 51 芯片用而已。
作者: 越快乐越堕落    时间: 2016-4-24 19:34
wc86110 发表于 2016-4-24 16:40
呵呵,原来是你画蛇添足啊,刚才我也没注意看。把这两行去掉然后再编译。固件烧录STC12C2052一样可用,只是 ...

是啊 是因为数码管的亮度太低,别人建议我这样做的。还有别的办法可以提升它的亮度吗?我试过在数码管的共阳极6 8 9 12接四个PNP和四个4.7K电阻,结果发现是亮了很多,但是数码管的显示完全不受控制了,不停的亮0和8,按键也不起作用了
作者: wc86110    时间: 2016-4-24 23:54
一般买数码管时都选高亮的,这样可避免不必要的麻烦。像你那样的是选错了数码管,你会发现点亮的段与用正确的数码管截然相反。也是因为选错数码管,按键给你的感觉不起作用了。
作者: 越快乐越堕落    时间: 2016-4-24 23:56
wc86110 发表于 2016-4-24 23:54
一般买数码管时都选高亮的,这样可避免不必要的麻烦。像你那样的是选错了数码管,你会发现点亮的段与用正确 ...

是高亮的
作者: liuyimao485812    时间: 2016-4-25 00:19
在 reg52.h 文件里没有定义P3M0和P3M1,可以下载STC12C2052AD的头文件,代替reg52.h
作者: wc86110    时间: 2016-4-25 00:37
嗯,你还是不明白人家说的意思,很明显是因为你选错数码管的类型。共阴共阴数码管张冠李戴电路会出现你说的异常现象,而原先能正常显示的但亮度低是因为没有用高亮数码管的缘故。
作者: 越快乐越堕落    时间: 2016-4-25 17:19
wc86110 发表于 2016-4-25 00:37
嗯,你还是不明白人家说的意思,很明显是因为你选错数码管的类型。共阴共阴数码管张冠李戴电路会出现你说的 ...

都说了我没有选错 是高亮,选用共阳的,作者要求的也是共阳的啊。不是我没明白
作者: 呆呆三少爷    时间: 2016-4-25 18:52
设置好了嘛
作者: wc86110    时间: 2016-4-25 20:43
呵呵,既然是这样就只有一个可能, LZ 现在用的单片机与数码管并未正确连接,这个源代码的数码管定义有点特殊你是否觉察到了。
作者: 越快乐越堕落    时间: 2016-4-25 22:17
wc86110 发表于 2016-4-25 20:43
呵呵,既然是这样就只有一个可能, LZ 现在用的单片机与数码管并未正确连接,这个源代码的数码管定义有点特 ...

那应该怎么改
作者: luoluoluo136    时间: 2016-4-27 09:20
这两句中的P3M0 P3M1没有定义啊,你要去找相应单片机的头文件包含以下,就可以了额
作者: liuzhaoxin1020    时间: 2016-12-17 09:08
数码管太亮,程序执行看不出来数
作者: liuzhaoxin1020    时间: 2016-12-17 09:13
数码管太亮,程序执行看不出来数




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1