难题,单片机高手请帮帮忙

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-04
请高手帮忙解答,单片机原理及应用​知识的难题,非常感谢。

/***********************************************************************/
已知P2口接7段共阴发光数码管(a接P2.0,b接P2.1其他顺序类推),试编写一段测试
程序,让数码管始终显示P1口的低4位的数值,例如P1为0时,数码管显示“0”,
P1为09H时,数码管显示“9”。

你试试,有问题你在追问。
/**********************************************************************/
#include
#define uchar unsigned char
uchar table[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar temp=0xff;

void main()
{
int Value;

while(1)
{
temp=P1;

if (temp==0x00)
{
Value= 0;
}
else if (temp==0x01)
{
Value= 1;
}
else if (temp==0x02)
{
Value= 2;
}
else if (temp==0x03)
{
Value= 3;
}
else if (temp==0x04)
{
Value= 4;
}
else if (temp==0x05)
{
Value= 5;
}
else if (temp==0x06)
{
Value= 6;
}
else if (temp==0x07)
{
Value= 7;
}
else if (temp==0x08)
{
Value= 8;
}
else if (temp==0x09)
{
Value= 9;
}
else //其他的值都显示F
{
Value= 15;
}

P2=table[Value];
}
}

1/#includesbit pluse=P0^2;main(){TMOD=0x20;TH1=56;TL1=56;TR1=1;whlile(1) { while(TF1==1); pluse=~pluse; TF1=0; }}2/ORG 0000HLJMP MAINORG 001BHLJMP T1ISRORG 0030HMAIN: MOV TMOD,#00H MOV TH1,#(8192-5000)/32; MOV TL1,#(8192-5000) MOD 32 SETB TR1 SETB ET1 SETB EA SJMP $T1ISR: CLR TR1 MOV TH1,#(8192-5000)/32; MOV TL1,#(8192-5000) MOD 32 SETB TR1 CPL P0.2 RETI END

相信你经过检查读写程序都没有问题的话。

那么从你所说的现象判断,是程序跑飞所致。

当单片机复位不良、或者抗干扰性能不好时,程序很容易跑飞(程序跳转到未知位置开始执行),尤其RISC的单片机这种现象特别明显,因为其指令长度固定,基本上程序存储器中任何一个单元就是一条指令,所以当程序计数器乱跳时,跳到任何一个位置都会找到一条可以执行的指令并开始从这里执行。

如果跑飞时刚好跳到写EEPROM指令程序前面一段,就会出现在未给待写入数据正确赋值的情况下写入EEPROM的情况,导致EEPROM被误写。

因为刚好跳到写EEPROM指令前面一段是小概率事件,所以一般被改写的只有开始几个字节。

解决办法:

1、完善上电复位电路,确保单片机在电源电压稳定的情况下才开始运行。在上电期间,如果电压不稳定,是导致单片机程序跑飞的最主要原因。

2、增强电路抗干扰性能。

3、在写EEPROM指令前加一条条件跳转指令,当某软件标志位1未设置时就跳转,并且在写EEPROM指令后立即清除软件标志位1。

当需要写EEPROM时,在正确赋值写入数据之后紧接着设置软件标志位1,然后立即调用写EEPROM子程序。

按以上优化的程序,将使误写现象降到最低概率,因为只有恰好跳转到设置软件标志位1指令时才会发生误写现象。

如果以上优化还让你不放心,你可以做成2级甚至更多级的防误写,在设置软件标志位1之前加一条条件跳转指令,只有当软件标志位2设置时才不跳转……

可以查一下数据是怎么丢的,错成了什么数,分几种情况:

1、数据变成FF,软件可能有误擦除操作

2、数据错一两位,其他位正常,可能存在芯片质量问题

3、变成了完全不相关的另外一个数,应该是软件误操作,擦除和写全干了

另外,你也该说一下型号啊,EEPROM有好多种呢,并行、两线串行、三线串行、还有MCU内置的等

软件处理不良的可能性较大

1:外界干扰,你工作的环境是不是处于公路旁边?有汽车马达干扰!或者附近有高频辐射源?比如电台电信基站?
做好电源滤波,而且要等电源开机稳定后几秒在去读写EEPROM

2:电源异常使EEPROM的数据彻底丢失;看看你的电源是否稳定?

3:复位电路是否正常?

4:scl,sda有没有上拉电阻?

BOD开启,BODLEVEL=4V,或者写EEPROM是被打断.

烧录器接触不好??.或者芯片坏了?或者烧录器坏了?再要么是你写的软件有问题?再么是你的电脑上的软件的问题?

单片机上电时,初始化结束后,延时一段时间再对EEPROM进行操作.

  • 单片机习题请求 题目比较长 高手请留Q
    答:1.MCS—51系列单片机的复位时RST引脚上至少需要保持( 2 )机器周期的高电平。2.若MCS-51系列单片机的PSW寄存器的RS1、RS0=10则堆栈指针的取值要大于( 17H )。3.若PSW.4=0,PSW.3=1,则 R0—R7占用的内部存储器地址范围为( 08H - 0FH )。4.需要用紫外线擦除的只读程序存储器ROM简称为(...
  • 怎样实现51单片机根据温度动态控制风扇转速,请高手帮帮忙!
    答:给您思路:第一,你需要使用温控元件测温,比如DS18B20温度传感器。第二:你所需要使用的控制芯片可以选择单片机,比如STC89C55(带掉电参数保存功能)。第三:使用数码管或者LCD1602显示您所检测的温度或者显示您所需要设置的温度范围。第四:按键,根据你所需要的温度范围,根据按键来设置参数范围。第五:...
  • 7种寻址方式 高手帮忙教下单片机的问题 谢谢
    答:1. MOV Ro,#70H 指令形式是MOV Ri,#date(i=0,1)结果:(Ro =70H)RO和Ri有什么关系吗?为什么是Ro =70H?答:是R0非Ro,MOV R0,#70H是把70H这个十六进制数存进R0这个寄存器,所以R0=70H,H是表示这个数是十六进制 RO和Ri有什么关系吗?: Ri(i=0,1)->R0和R1这是单片机里...
  • 单片机问题,请高手作答!不对会挂掉的,谢谢~!
    答:AT89C52单片机中,将累加器A中的数送入外部RAM的60H单元,可执行的指令(d)。选项:a、MOVR1,60H MOVX@R1,A b、MOVR1,#60H MOVXR1,A c、MOVX 60H,A d、MOVR0,#60H MOVX@R0,A 设在30H单元存有#6DH,执行下面程序后,则(31H)和(32H)单元的内容为(c)。MOVA,30H ANLA,#0FH MOV ...
  • 单片机高手的兄弟请帮帮忙!!!
    答:PSW各位分别为 CY(进位位)AC(辅助进位)F0(标志位)RS1 RS0 OV(溢出)- P(偶校验)根据以上可分别判断 (1) ADD A, #5FH ;执行前A=83H,执行后PSW=01000 000=40H (2) ORL 30H, #0FH ;执行后PSW=0000 0000=00H (3) INC A ;执行前A=03H,执行后PSW=0000 0001=01H (4) ...
  • 单片机的问题 各位高手帮帮忙啊~~~!
    答:关键词:时钟电路;实时时钟;单片机;应用 1 引言 现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可...
  • 单片机高手请速速解我疑惑,最好给一点做题思路,在此万分感谢!!!如答案...
    答:设工作寄存器R0=58H,R1=6AH,执行下列程序填入执行的结果 MOV 6AH,R0 ;目的操作数寻址方式( 直接寻址 )CJNE @R1,#6AH, NEQU ;比较结果是否相等?( 不等,实际是58H和6AH比较 )MOV A,#0 ;SJMP N2 ;转移地址的寻址方式( 相对寻址 )NEQU: J...
  • 单片机高手请进
    答:可以的,数字钟电路要有数码管或者液晶显示屏;定时控制方面AT89C51自带2个定时器;5种模式以上变换的闪灯电路这个是最简单的了,用单片机的IO口加发光二极管和电阻就可以做出来,五种模式只是写程序的问题。光控开关你可以直接买光耦开关就可以用单片机控制另一端的开关了,过放电保护要看你怎么设计外面的...
  • 急需单片机高手帮忙用C语言写一个单片机4个灯轮流闪亮的源程序。 详...
    答:/*对于个单片机的初学者,我希望用最直观的方式来达到你要的要求,程序每一句我已经写好备注,希望对你有帮助*/ include<reg51.h> //使用51功能头文件 sbit L1=P0^0; //L1对应P0.0,表示第一盏灯 sbit L2=P0^1; //L1对应P0.1,表示第二盏灯 sbit L3=P0^2; //L1对应P0.2,...
  • 单片机编程题,请高手帮忙
    答:都是MCS-51指令系统。(1)movx a,@r1 anl a,#0f0h mov b,a inc r1 movx a,@r1 swap a anl a,#0fh orl a,b sjmp end (2)甲机:mov tmod,#20H mov th1,#0f4h mov th0,#0f4h setb tr1 mov scon,#01010000B mov r0,#40H s:mov sbuf,@r0 jnb ti,clr ti mov r7,#...