我不小心删掉了系统里的重要文件,现在无法启动xp了,怎么办?

如题所述

第1个回答  2019-06-18
51单片机的寄存器分为工作寄存器和特殊功能寄存器两大类。工作寄存器在内部RAM的00H~1FH地址区,共分4组,都用R0~R7表示,因为编写主程序时需要调用子程序或响应中断服务程序,如果都使用一组工作寄存器,必然会造成寄存器的数据冲突,而出现错误。因此,需用特殊功能寄存器程序状态字(PSW)的RS0、RS1两位来设置使用的工作寄存器组,应单片机开机上电复位时,PSW为00H,故自动选择第0组工作寄存器,而子程序和中断服务程序可使用第1组、第2组或第3组工作寄存器,这样即使编程时使用了相同的工作寄存器,也不会造成寄存器的数据冲突了。
特殊功能寄存器在内部RAM的80H~0FFH地址区,主要有累加器A,寄存器B,程序状态字PSW,P0~P3
I/O口寄存器,定时/计数器及串行通信控制、中断控制等特殊功能寄存器,这些寄存器的应用课本上都有详细的介绍,需要慢慢的学习体会。最好卖块51单片机的仿真实验板,边练边学,才能提高学习兴趣加深理解。
第2个回答  2019-05-14
嘿嘿
还是让俺来帮你解决吧
1
关于定时器定时时间的计算问题:
如果使用的是12M晶振计算,指令周期1uS,定时器是加1计数器,即是对内部时钟即指令周期脉冲计数
每当1uS到时,计数器加1。
假设
定时器的初始值=X,则每到1uS
计数器的值就加1
,则计数器值=X+1+1+...+1
值越来越大,最后达到FFFFH+1
就会产生溢出
结果计数器值回0(FFFFH+1=65536)
可以推出
定时时间=计数的1的个数×1uS=(65536—X
)1
uS
结论:
定时时间跟初始值即时间常数X有关。
如果要定时0.5毫秒=500uS
根据定时时间公式
500=(65536—X

即X=(65536-500)
一般把高8位送TH0

(65536-500)/256

(65536-500)%256即除上256后的余数
即低8位数送给TL0
每当定时时间到
计数器值都回0
必须重新送时间常数X
2每条指令的时间怎么算?
答复:
可以查指令表
每一条指令的执行时间的周期数
都是固定的

NOP
为一个机器周期
MOV
R6,#200;
为2个机器周期
机器周期=12/晶振频率
如果晶振频率=12MHZ
则机器周期=1
uS
就可以知道
;
执行NOP指令的执行时间为
1
uS
执行MOV
R6,#200指令的执行时间为
2
uS
因此
是可以精确计算出指令的延时时间的
呵呵
就介绍这些吧
满意就
给加分吧
第3个回答  2020-04-23
波特率跟晶振有关系的,51的印象中是24M最高频率;这个在单品及型号上会有;如果你是要进行串口通信可参考下下面的;
(以下内容非本人所写)
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率
=
fosc/12
方式2的波特率
=((2^SMOD)/64)•
fosc
方式1的波特率
=((2^SMOD)/32)•(T1溢出率)
方式3的波特率
=((2^SMOD)/32)•(T1溢出率)
注意:SMOD为PCON寄存器的最高位(即PCOM<7>)。
T1
溢出率
=
fosc
/{12×[256
-(TH1)]}
--将该公式代人方式1或3
最后推出公式:TH1=256-(fosc*2^SMOD)/(baudrate*12*32);
呵呵
如果你用方式2(波特率
=((2^SMOD)/64)•
fosc
)的话
12M的晶振就不能得到9600波特率了(除非你改变你的晶振,但是那样的晶振好像没有卖)
所以你只能选择方式1或3
而且12M的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点
TH1又只能是整数的
所以传输时会有误差.
参考:
#include
#define
baudrate
9600UL
#define
fosc
11059200UL//其中,UL是不能省略的,代表长整型。
unsigned
char
a,flag;
void
serial_init(void)
{
unsigned
char
S_MOD=1;
TMOD=0x20;//T1工作在方式2
SCON=0x50;//SM0=0
SM1=1->串口通信在模式1,
//SM2=0->多级通信中使用的位,REN=1;
PCON=0;
if((PCON&0x80)==0x80)
S_MOD=2;
TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0,
TL1=256-(fosc*S_MOD)/(baudrate*12*32);
TR1=1;ES=1;EA=1;
}
如还不明可看51串口通信章节,一般会有较为详细的介绍
第4个回答  2020-02-21
可以采用二字节除法,后8位二进制数可以在高位补零凑齐16位,下面程序供参考。
;function
name:
div-2
byte
;function:
unsigned
2
byte
divide
;(37h)(36h)=(37h)(36h)/(3bh)(3ah)
;working
area
data
memory:
(39h),(38h)
b
equ
0f0h
org
0000h
ljmp
start
org
0100h
start:
mov
r3,#16h
clr
c
loop1:
mov
r1,#36h
mov
r2,#04h
loop2:
mov
a,@r1
rlc
a
mov
@r1,a
inc
r1
djnz
r2,loop2
mov
r0,#39h
mov
r1,#41h
mov
r2,#02h
lcall
data_compare
jc
loop3
mov
r0,#39h
mov
r1,#40h
lcall
data_subtract
loop3:
cpl
c
djnz
r3,loop1
mov
r1,#36h
mov
r2,#02h
loop4:
mov
a,@r1
rlc
a
mov
@r1,a
inc
r1
djnz
r2,loop4
sjmp
$
;************************************************
data_compare:
mov
a,@r0
mov
b,@r1
cjne
a,b,loop5
inc
r0
inc
r1
djnz
r2,data_compare
loop5:
ret
;*************************************************
data_subtract:
mov
r2,#02h
clr
c
loop6:
mov
a,@r0
subb
a,@r1
mov
@r0,a
inc
r0
inc
r1
djnz
r2,loop6
ret
end
第5个回答  2019-08-13
51单片机中断源总共有5个,即2个外部中断、2个定时/计数器中断、1个串行口中断。
没有时钟中断,你说的时钟中断是指定时器中断吧。
中断优先级的设定
主要是对中断优先级寄存器ip的设置,
其8位内容
如下:xxpt2
ps
pt1
px1
pt0
px0
其中px0为外部中断0的优先级设定位,
px1为外部中断1的优先级设定位,
pt0
pt1
为定时器的
优先级设定位,
设置
优先级设定位=1时,该优先级最高
为高级中断。
设置
优先级设定位=0时,该优先级最低
为低级中断。
同一级别的中断内部优先级顺序是
外部中断0最高
定时器0
外部中断1
定时器2
串行口最低
最简单的方法是,将你用到的外部中断设为高级中断,其它的中断设为低级中断。
可以在程序中
使用置1指令
setb
px0,将外部中断0设为高级中断。
相似回答