找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4730|回复: 19
收起左侧

关于KEIL4 注册过 如下程序不能生成HEX文件

[复制链接]
ID:99130 发表于 2016-4-24 14:29 | 显示全部楼层 |阅读模式

如图

如图
我给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++;//秒加一

}

}



回复

使用道具 举报

ID:113415 发表于 2016-4-24 15:09 | 显示全部楼层
一般说,Keilc中仅有传统的51系列的寄存器定义,却没有stc单片机特有的寄存器定义,如果需要,允许自己在头文件中加入相关的定义,然后就可以用了。stc文档中对这些是有说明的,看看就明白了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:96682 发表于 2016-4-24 15:10 | 显示全部楼层
LZ,把它改成 :P3MO=0x01;
        P3M1=0x00;
那个 x 要英文小写。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:96682 发表于 2016-4-24 15:13 | 显示全部楼层
标点符号也得用小写。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:99130 发表于 2016-4-24 15:35 | 显示全部楼层
wc86110 发表于 2016-4-24 15:10
LZ,把它改成 :P3MO=0x01;
        P3M1=0x00;
那个 x 要英文小写。

试过了 不行,不管是x还是分号,都不行
回复

使用道具 举报

ID:99130 发表于 2016-4-24 15:36 | 显示全部楼层
wc86110 发表于 2016-4-24 15:13
标点符号也得用小写。

应该是程序其他地方和这两句不一致,

评分

参与人数 1黑币 +60 收起 理由
admin + 60

查看全部评分

回复

使用道具 举报

ID:113376 发表于 2016-4-24 15:59 | 显示全部楼层
应该是没有包含STC头文件的原因。

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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:96682 发表于 2016-4-24 16:40 | 显示全部楼层
呵呵,原来是你画蛇添足啊,刚才我也没注意看。把这两行去掉然后再编译。固件烧录STC12C2052一样可用,只是当普通的 51 芯片用而已。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:99130 发表于 2016-4-24 19:34 | 显示全部楼层
wc86110 发表于 2016-4-24 16:40
呵呵,原来是你画蛇添足啊,刚才我也没注意看。把这两行去掉然后再编译。固件烧录STC12C2052一样可用,只是 ...

是啊 是因为数码管的亮度太低,别人建议我这样做的。还有别的办法可以提升它的亮度吗?我试过在数码管的共阳极6 8 9 12接四个PNP和四个4.7K电阻,结果发现是亮了很多,但是数码管的显示完全不受控制了,不停的亮0和8,按键也不起作用了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:96682 发表于 2016-4-24 23:54 | 显示全部楼层
一般买数码管时都选高亮的,这样可避免不必要的麻烦。像你那样的是选错了数码管,你会发现点亮的段与用正确的数码管截然相反。也是因为选错数码管,按键给你的感觉不起作用了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:99130 发表于 2016-4-24 23:56 | 显示全部楼层
wc86110 发表于 2016-4-24 23:54
一般买数码管时都选高亮的,这样可避免不必要的麻烦。像你那样的是选错了数码管,你会发现点亮的段与用正确 ...

是高亮的
回复

使用道具 举报

ID:110895 发表于 2016-4-25 00:19 | 显示全部楼层
在 reg52.h 文件里没有定义P3M0和P3M1,可以下载STC12C2052AD的头文件,代替reg52.h

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:96682 发表于 2016-4-25 00:37 | 显示全部楼层
嗯,你还是不明白人家说的意思,很明显是因为你选错数码管的类型。共阴共阴数码管张冠李戴电路会出现你说的异常现象,而原先能正常显示的但亮度低是因为没有用高亮数码管的缘故。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:99130 发表于 2016-4-25 17:19 | 显示全部楼层
wc86110 发表于 2016-4-25 00:37
嗯,你还是不明白人家说的意思,很明显是因为你选错数码管的类型。共阴共阴数码管张冠李戴电路会出现你说的 ...

都说了我没有选错 是高亮,选用共阳的,作者要求的也是共阳的啊。不是我没明白

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:116631 发表于 2016-4-25 18:52 | 显示全部楼层
设置好了嘛
回复

使用道具 举报

ID:96682 发表于 2016-4-25 20:43 | 显示全部楼层
呵呵,既然是这样就只有一个可能, LZ 现在用的单片机与数码管并未正确连接,这个源代码的数码管定义有点特殊你是否觉察到了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:99130 发表于 2016-4-25 22:17 | 显示全部楼层
wc86110 发表于 2016-4-25 20:43
呵呵,既然是这样就只有一个可能, LZ 现在用的单片机与数码管并未正确连接,这个源代码的数码管定义有点特 ...

那应该怎么改
回复

使用道具 举报

ID:97438 发表于 2016-4-27 09:20 | 显示全部楼层
这两句中的P3M0 P3M1没有定义啊,你要去找相应单片机的头文件包含以下,就可以了额

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:153199 发表于 2016-12-17 09:08 | 显示全部楼层
数码管太亮,程序执行看不出来数
回复

使用道具 举报

ID:153199 发表于 2016-12-17 09:13 | 显示全部楼层
数码管太亮,程序执行看不出来数
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表