一个单片机程序问题。

作者&投稿:东方柱 (若有异议请与网页底部的电邮联系)
单片机中一个程序的运行过程~

单片机中一个程序的运行过程分为取指令,分析指令和执行指令几个步骤。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。
下面我们将举个实例来说明指令的执行过程:
开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。
例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:
1 程序计数器的内容(这时是0000H)送到地址寄存器;

2 程序计数器的内容自动加1(变为0001H);

3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;

4 CPU使读控制线有效;

5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。

至此,取指阶段完成,进入译码分析和执行指令阶段。
由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。
ROM是只读存储器,用于存储程序代码;RAM是数据存储器,用于存放单片机运行时的数据,也就是说RAM中的数据掉电(复位)后就会消失,而ROM中的数据不会。

答:
1.要看你的单片机的型号,有一些单片机是OTP型的(OneTimePrograming的缩写,中文意思就是一次性编程),这种单片机只可以编程一次,编程完毕便不可以读出,一般在商品成品中多见,常用的AT89C51系列,AT89S51系列,STC89C51系列,还有很多型号单片机都是可以重复编程,一般都可以重复编程达1000次以上(AT89C51系列,AT89S51系列1k次,,STC89C51系列100k次(技术资料上是这样说的)).
2.单片机编程,一般都用 汇编 和 C语言 外,还可以用机器语言(这个想是没有人用了).(这点不是太懂,见笑,我一般用C语言,用keil编译调试很方便,程序也易读).
3.一般单片机都有相应的程序下载工具,这里所说的工具并不复杂,AT89S51系列用SPI下载,STC单片机都用串口下载.这两者单片机的下载工具都可以自己做.如果你处于单片机入门阶段,本人建议用AT和STC的单片机.

1、0x38的值是56,也就是256-200的结果,说明定时器是200个周期溢出一次,12M晶振是就为200微妙。
2、5000一秒,是因为定时时间是200微妙,溢出5000次,两者相乘即为1000000微妙,等于1秒。
3、一个机器周期是时钟周期的12倍,所以12M晶振,机器周期是1微妙。


单片机程序出错
如果数码管能正常显示数字,一般不太像是损坏了,所以很可能是程序不合适。比如,把共阳(阴)当成共阴(阳)了,或者,数码管与单片机之间存在驱动电路,使得点评逻辑翻转了。另外,程序中可以在位值变换前先将段值口清零,这样能减少残影干扰。5、按上述方法排查,应该能解决问题,如果不行还可以私信联系。

怎样来判别单片机的程序是否有问题
首先你是要编译的,检查语法错误,如果连在keil里面编译都无法通过则肯定有问题的。然后就要自己检查有没有一些逻辑错误,导致实际的程序和你需要的根本不一致。之后就要下载到实际的产品或者开发板上进行验证,比如看显示能不能正常,中断可以不可以正常进入,按键响应是否迅速等等,这些光靠keil里面是看不...

单片机程序问题
我们只能谈理论上的,不论你多快的速度刷新寄存器,和内部的RAM,单片机都会以自己固定的时序去完成操作,我们写的C语言程序,都是经过编译器编译后才能下载到单片机中执行,所以不会有任何出格的地方。但是对于实际出现了什么不可预测的情况,很有可能是单片机自身设计的稳定性以及周围环境因素产生的影响,...

问几个单片机程序问题
这样的问题好歹也贴点赏分上来呀,10分也行啊。不过还是给你回答吧。MOV A,#00H 是将实数00H就是十六进制数0写入ACC ADDC A,#00H,这句就没有什么意义了,将ACC加0并带有进位功能。加0不等于白加吗。ANL 是有两数各位相与,任何一数中有0该位就为0 如:11100011与10111111后,就等于10...

单片机程序问题
(60H)=45H 执行下列指令:MOV RO,#60H;(RO)=60H MOV A,#30H;(A)=30H XCHD A,@RO;立即数低四位互换(即30H与45H的0、5互换),此时(60H)=40H,(A)=35H MOV @RO,A; 将A中数据给到(60H)故(A)=35H,(60H)=35H ...

单片机程序问题 本人初学单片机看到一个例程不知道是什么意思,屏大家帮 ...
这个是最简单的单片机点灯程序,而且是最浪费单片机资源的一种程序,不过也是最初学习者便于理解的一种方式:第一:定义LED1,LED2及LED3分别连接到P1.0 \\P1.1及P1.2口线上。第二:进入主程序后,初始化变量i=0;(便于等会延时使用)第三:LED1=0;如果是单片机P1.0口接LED的负极,则这个...

关于stc单片机做LED点亮和灭的时间控制程序问题?
} LED=1; \/\/点亮LED delay(3000); \/\/LED持续3秒 LED=0; \/\/灭掉LED while(1); \/\/芯片不工作 } 在上述程序中,使用了一个计数器来实现上电后30秒的延时,然后LED点亮并持续3秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参考,具体实现方式需要根据实际情况进行调整和优化。

关于计算机和单片机程序执行过程的几个问题
1,计算机有地址总线、数据总线,计算机一上电就从一个固定的地址取第一条指令,这一条指令一般为跳转指令。接下来计算机就会不停的取指令、执行指令,这些工作一般为流水线结构。每条指令取完后,去哪里取下一条指令,这个是CPU自动完成的,写C语言的同学就不用管了。2,烧程序的时候,C语言不能自...

单片机汇编程序的问题
这段程序似乎有个问题,我不知道你用的什么片子。有条指令貌似是多余的:ljmp main ret 这个RET指令在LJMP MAIN的后面,指令时顺次从上向下执行的(遇到跳转指令时除外),当执行到LJMP时,程序跳回主程序开始处,貌似这个RET指令这辈子也得不到执行,所以,我个人认为他是多余的,可以去掉。。。

单片机问题,如果一个单片机的主频是1m赫兹,那么就是1s的时间可以执行1m...
1. 不可以简单地认为,如果一个单片机的主频是1MHz,那么它在1秒内可以执行1百万条汇编程序。2. 实际上,单片机的主频指的是其时钟速度,即每秒钟可以产生1百万次时钟周期。3. 一个单片机的指令周期通常由其内部设计决定,例如,如果一个单片机的指令周期是1微秒,那么它确实可以在1秒内执行1百万条指令...

太仆寺旗13361828541: 单片机程序问题 -
司马利安内: 1、你没有启动AD2、你怎么也的有检测一个转换结束状态才能读取AD值吧3、看看硬件是不是有问题.选择的通道对不对?4、用万用表量一下输入有没有变化.

太仆寺旗13361828541: 一个简单的单片机c语言程序问题 -
司马利安内: #include <reg52.h> /*C52单片机寄存器、端口定义.比如程序中的p0,p1就定义在reg52.h中.*/#include <absacc.h> /*用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、...

太仆寺旗13361828541: 一条单片机程序问题
司马利安内: 单片机置1(高电平)是灭灯,置0(低电平)是亮

太仆寺旗13361828541: 一个单片机程序问题 -
司马利安内: 是uart串口通讯的代码哦 看看main函数吧 initiate_RS232();//串口初始化操作 EA = 1;//打开所有中断 Uart_SendString("HELLO BKS !\r\n");//通过串口发送字符串 Uart_SendString("INPUT A CMD !\r\n"); Uart_SendString("Hello ...

太仆寺旗13361828541: 每日一个单片机程序问题 -
司马利安内: 延时时间太短 显示程序*...

太仆寺旗13361828541: 单片机程序问题
司马利安内:由福州卓跃为您解答问题:不同的编译器的目的不一样,他所支持的命令也不一样,keil C 一般拿来做八位单片机的程序,这些程序结构简单,而且需要运行速度有限.所以用不着栈,于是他就不设置了,但是win32为是32甚至64位机,内存上G,CPU也有好几个G,这么高的速度,当然对一些程序有高要求了.但是如果你一定要用栈的话,建议你在Linux的对单片机进行编程,那样子会好一点.

太仆寺旗13361828541: 请教单片机程序的一个问题
司马利安内: #include<reg51.h> sbit P1_0=P1^0; void main(void) { IT0=1; // 外部中断0使用下降沿触发 EX0=1; // 外部中断0允许 EA=1; // 全局中断允许 while(1); // 等待中断 } exint 0() interrupt 0 //外部中断0子程序 {P1_0=0;} // 当外部中断有下降沿来时进入中断0服务子程序,让P1.0口输出0

太仆寺旗13361828541: 单片机程序问题?
司马利安内: MOV A,21h SUBB A,22H JNC N1 MOV A,22H SUBB A,23H JNC N3 JC N4 N1:MOV A,21H SUBB A,23H JNC N2 MOV 30H,23H SJMP LP N2:MOV 30H,21H SJMP LP N3:MOV 30H,22H SJMP LP N4:MOV 30H,23H LP:NOP END

太仆寺旗13361828541: 求一个单片机的编程题 -
司马利安内: ORG 0000H SJMP MAIN ORG 0040H MAIN:MOV R2,#40H ;R2用作计量正数的地址 MOV R3,#50H ;R3用作计量负数的地址 MOV R0,#30H ;R0用作计量数组的地址 LP4: CJNE @R0,#00H,LP0 ;这十个数中为零的数,不存储,接着判断下一个数 ...

太仆寺旗13361828541: 一个关于单片机编程的问题 -
司马利安内: 要实现你说的功能,需要使用EEPROM,单片机上电后需要去读取EEPROM中的密码,修改密码后再将新密码写入EEPROM中,这样就可以了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网