51单片机程序编译出错

51单片机程序编译出错,第1张

我按错误提示顺序说:第一个错误你只包涵了stdio头文件,没有reg51头文件,系统对P0无法识别;第二个错误你的delay函数没有在main函数之前声明,系统无法识别delay;第三个错误声明sleep函数时最后没有分号;第四个变量i重新定义;第五个错误delay函数中最后一个for循环没有分号。

希望我的回答能帮助到你。

51单片机程序存储区的大小取决于具体型号,不同型号的存储区大小可能会有所不同。一般来说,51单片机的程序存储区大小为4KB、8KB、16KB、32KB等。在实际应用中,程序存储区是否可以用满取决于程序的大小和复杂度。如果程序比较简单,且使用了一些优化技巧,那么可以尽可能地利用存储区,使其用满。但是,如果程序比较复杂,或者使用了大量的库函数和数据表,那么可能无法用满存储区。此时,可以考虑使用更大容量的单片机或者外部存储器来解决存储问题。

程序如下,仿真见附件。有问题请追问。

#include <AT89X51h>

#define uchar unsigned char

#define uint unsigned int

bit flag_1s=0;

uchar code tab[8]={1,2,4,8,16,32,64,128};//[第1小题用这个表]

//uchar code tab[8]={0x05,0,0x50,0xa0,0xaa,0x55,0xff,0x00};//[第2小题用这个表]

void InitTimer1(void)

{

    TMOD = 0x10;

    TH1 = 0x3C;

    TL1 = 0x0B0;

    EA = 1;

    ET1 = 1;

    TR1 = 1;

}

void main(void)

{

    static uchar j;

    InitTimer1();

P0=0;

P1=0;

P2=0;

P3=0;

flag_1s=1;

while(1)

{

if(flag_1s==1)

{

flag_1s=0;

P2=tab[j];

j++;

if(j>=8) j=0;

}

}

}

void Timer1Interrupt(void) interrupt 3

{

    static uchar i;

    TH1 = 0x3C;

    TL1 = 0x0B0;

    //add your code here!

    i++;

    if(i>=20)//50ms20=1000ms

    {

    i=0;

    flag_1s=1;

    }

}

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

CLR P10

MOV R2,#10

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E

CPL P10

MOV R2,#10

T0E:

RETI

END

你好:

三个警告应该是void int_initial()与void timer0_initial()前边不用加void,然后就是Display()这个函数没有用。

其次我想说,TMOD=0x01就行了,因为程序里边只用到了定时器0,其他的状态不管,甚至可以说把其他定时器关掉。,也用不着TMOD&=0xfd。

然后中断函数要尽量精简、短小实干、不宜过长,因为中断本身就打扰了main函数的正常运行,而且中断内容太多反而容易在下次中断到来时还没处理完,就会栈溢出。养成好的习惯,中断就对最基本的时间计次就行,其余的都抛给main函数吧。

EA、ET0尽量就和定时器0一起初始化,你这习惯看着别扭。可读性略低。

中断里不要声明变量,你用个全局变量就OK。

希望我的回答能帮助到你。

1、打开keil5,点击文件,打开管理权限。

2、复制CID,关闭keil5。

3、打开KEIL_Lic,输入(1)CID,得到(2)代码。

4、以管理员省份打开keil5,点击文件,打开授权管理。

5输入(1)LID。点击(2)确定,就得到了功能更强的keil5。

怎么样才能够写好51单片机程序?首先要对单片机及编程语言要 熟悉、精通,不断学习 提高自己的逻辑思维能力,多看一些仿真实例 学习人家的编程技巧,也可以先 用人家的仿真实例加以改编 来达到自己 预期的效果,能力是不断积累,如果能够持之以恒就会那么自己的能力也会进步的。

#include <AT89X51H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义显示用的段码

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义显示用的位码

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //定义显示缓冲区

unsigned char dispbitcnt; //定义显示的位

unsigned char second; //定义秒

unsigned char minite; //定义分钟

unsigned char hour;//定义小时

unsigned int tcnt;//定义定时累加器

unsigned char mstcnt;//定义毫秒累加器

unsigned char i,j;

void main(void) //主函数

{

TMOD=0x02; //设置定时器工作模式

TH0=0x06; //设置初值

TL0=0x06;

TR0=1; //开定时器

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

EA=1; //开总中断

while(1)

{

if(P0_0==0) //判断P00口的按键是否按下

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);//延时消抖

if (P0_0==0) //判断按键真的按下了

{

second++; //秒加1

if(second==60) //秒加到60?

{

second=0; //秒清零

}

dispbuf[0]=second%10; //取秒的个位放在显示缓冲

dispbuf[1]=second/10; //取秒的十位放在显示缓冲

while(P0_0==0); //等待,知道按键松开

}

}

if(P0_1==0) //p01的按键按下,设置分钟,请参考秒的程序,一样的

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_1==0)

{

minite++;

if(minite==60)

{

minite=0;

}

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

while(P0_1==0);

}

}

if(P0_2==0) //p02的按键按下,设置小时,请参考秒的程序,一样的

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_2==0)

{

hour++;

if(hour==24)

{

hour=0;

}

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

while(P0_2==0);

}

}

}

}

void t0(void) interrupt 1 using 0 //定时器中断函数

{

mstcnt++; //累加器加一

if(mstcnt==8) //计时满8毫秒?

{

mstcnt=0; //累加器清零

P1=dispcode[dispbuf[dispbitcnt]]; //送显示段码

P3=dispbitcode[dispbitcnt]; //送显示位码

dispbitcnt++; //显示位加1

if(dispbitcnt==8) //8位都显示完了?

{

dispbitcnt=0; //从第一位开始显示

}

}

tcnt++; //累加器加一

if(tcnt==4000) //记满1秒

{

tcnt=0; //累加器清零

second++; //秒加一

if(second==60) //秒满60?

{

second=0; //秒清零

minite++; //分钟加一

if(minite==60) //分钟满60

{

minite=0; //分钟清零

hour++; //小时加1

if(hour==24) //小时满24

{

hour=0; //小时清零

}

}

}

dispbuf[0]=second%10; //将时分秒的个位与十位分开,装在显示区

dispbuf[1]=second/10;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

}

}

其实这个程序不难,仔细想想,有不懂的再问我吧

以上就是关于51单片机程序编译出错全部的内容,包括:51单片机程序编译出错、51单片机程序存储区可以用满吗、51单片机流水灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9330649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存