在keilc环境下编辑的AT89C2051的C语言程序不能运行

2024-12-26 00:00:54
推荐回答(2个)
回答1:

不知道你的Keil是不是注册版的!如果没有注册的话,Keil本身是对一些单片机有约束的。例如2051的内部存储器只有2KB,如果没有破解Keil的话,就会出错,一个是根本无法生成Hex文件,一个是生成了出现错误。还有一个就是你的单片机是不是选择AT89C2051了?如果选择AT89S52等等,是无法通用的!

回答2:

//程序如下
//带上注释的 时钟计数和液晶显示程序做参考

#include //兼容51
#include

#define TimerCOUNT 49990//50ms定时器对12MHz的计数量50000-代码时间(如10),对11.0592MHz校对值46080-代码时间(如23)

sbit P1_0=P1^0;
sbit P1_1=P1^1;

unsigned char Hou=0,Min=0,Sec=0,pSec=0;

void delay(uint n) //延时函数
{
uint x,y;
for(x=n;x>0;x--)for(y=50;y>0;y--);
}
/*
//----------------------------------------//
//-----------------1602液晶---------------//
//----------------------------------------//
void LcdCom(uchar com) //1602写命令函数
{
PBlcdrs=0; //选择指令寄存器
PBlcdrw=0; //选择写
P0=com; //把命令字送入P2
delay(10); //延时一小会儿,让1602准备接收数据
PBlcden=1; //使能线电平变化,命令送入1602的8位数据口
PBlcden=0;
}
void LcdDat(uchar dat) //1602写数据函数
{
PBlcdrs=1; //选择数据寄存器
PBlcdrw=0; //选择写
P0=dat; //把要显示的数据送入P2
delay(3); //延时一小会儿,让1602准备接收数据
PBlcden=1; //使能线电平变化,数据送入1602的8位数据口
PBlcden=0;
}

void init1602() // 初始化
{
char i;
PBlcden=0;
LcdCom(0x38); //8位数据,双列,5*7字形
LcdCom(0x0c); //开启显示屏,关光标,光标不闪烁
LcdCom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
LcdCom(0x01); //清屏
LcdCom(0x84);
for(i=0;i<8;i++){
LcdDat(Welc[i]);
}
delay(50);
LcdCom(0xc1);
for(i=0;i<14;i++){
LcdDat(0xFF);
delay(10);
}
}
*/
/*50ms中断*/
void time1() interrupt 3 using 3
{ // Hou=0,Min=0,Sec=0,pSec=0;
EA=0;
TH1=(65536-TimerCOUNT)/256;
TL1=(65536-TimerCOUNT)%256;
pSec++;
if(pSec==20){
pSec=0;
Sec++;
if(Sec==60){
Sec=0;
/*Min++;
if(Min==60){
Min=0;
Hou++;
if(Hou==23)Hou=0;
} */
}
if(Sec%2==0)
else
}
EA=1;
}

void main(void)
{
//init1602();
//delay(1000);
TMOD=0x10;
TH1=(65536-TimerCOUNT)/256;
TL1=(65536-TimerCOUNT)%256;
EA=1;
ET1=1;
TR1=1;

P1_0=1;P1_1=0;
while(1){
delay(1000);
}
}