精华内容
下载资源
问答
  • 如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用"复位",因为复位是纯硬件过程,软件是不可控的。但是我们还是要讨论方法,一般流传的方法如下:1、放狗;2、((void(code...

    单片机实现软件复位(软复位)的方法及讨论

    单片机实现软件复位(软复位)的方法及讨论

    (天堂雨林博客blog。sina。com。cn/acer收集整理)

    单片机软复位有什么好的方法?如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用"复位",因为复位是纯硬件过程,软件是不可控的。

    但是我们还是要讨论方法,一般流传的方法如下:

    1、放狗;

    2、((void(code *)(void))0x0000)();

    3、用单片机一个引脚控制点一下RSTRST;

    4、用单片机一个引脚控制重新加电;

    5、用单片机自带的软件复位指令或内狗指令;

    6、goto大法;

    天堂雨林博客对以上方法的意见:

    方法1:“放狗”是单片机软复位的最好办法,也基本上是唯一的一个办法。

    但并不是所有单片机都具备看门狗的功能,也不是一个万全之策。

    办法2:这不是复位,只是把程序转到地址0去执行,不如用一个JMP更直接。目前可能极少数单片机或者用户已经自行添加Boot load时用户程序的程序开始地址并不为0x0000,所以需要查找这些特定单片机的启动地址。

    在keil C51下面可以这样实现:

    void soft_reset(void)

    {

    ((void (code *) (void)) 0x0000) ();

    }

    在需要软件复位的地方使用语句:

    soft_reset();

    一般可实现软件复位。

    办法3:用软件实现的硬复位。需要牺牲一个单片机引脚,且增加了单片机外部电路构造的复杂性,很不可取。

    办法4:类似办法3,同样需要牺牲一个单片机引脚,且增加了单片机外部电路构造的复杂性,很不可取。但不能把它单单地当成是复位,应该叫上电复位。

    办法5:Atmel 89C不带内狗,S的有内狗,只是一条指令就行。如STC的单片机有软件复位指令,即ISP_CONTR,地址在0E7H 单元(即str ISP_CONTR=0xE7),MOV ISP_CONTR,#00100000B(C语言为ISP_CONTR=0x20),内狗也是一条指令MOV WDT_CONTR,#00111100B!

    STC 51系列单片机Datasheet中指出:传统的8051 单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。

    现STC 新推出的增强型8051 根据客户要求增加了ISP_CONTR 特殊功能寄存器,实现了此功能。用户只需简单的控制ISP_CONTR 特殊功能寄存器的其中两位 SWBS / SWRST 就可以系统复位了。

    办法6:程序从头(上电复位处)开始运行,且只有一个循环这种情况,当然可以用goto,如在main()的开头设一个start:,在程序的唯一循环中设定一个条件,然后goto命令。

    但需要注意,如果是在中断例程里,那么中断挂号寄存器仍置位,同级中断不能执行。所以必须先使中断挂号寄存器清零,EA = 0。只有RETI指令可以使中断挂号寄存器清零。51单片机有两级中断优先级,所以需要执行两次RETI指令。这用汇编是很简单的事,而C则比较难以实现。

    但是,goto命令尽量不要用,因为goto会到处乱窜,而且goto不能跑到函数外面去执行一个命令。

    最后总结如下:最好使用办法5最为简洁方便,使用办法2实现也不失为一种好方法。

    全部

    展开全文
  • 满意答案waterMM推荐于 2017.09.02采纳率:57%等级:13已帮助:6010人单片机实现...如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用"复位",因为复位是纯硬件过程,软...

    满意答案

    dcebd7a0de6265b6ccae5ead692f1eab.png

    waterMM

    推荐于 2017.09.02

    dcebd7a0de6265b6ccae5ead692f1eab.png

    采纳率:57%    等级:13

    已帮助:6010人

    单片机实现软件复位(软复位)的方法及讨论

    单片机实现软件复位(软复位)的方法及讨论

    (天堂雨林博客blog.sina.com.cn/acer收集整理)

    单片机软复位有什么好的方法?如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用"复位",因为复位是纯硬件过程,软件是不可控的.但是我们还是要讨论方法,一般流传的方法如下:

    1、放狗;

    2、((void(code *)(void))0x0000)();

    3、用单片机一个引脚控制点一下RSTRST;

    4、用单片机一个引脚控制重新加电;

    5、用单片机自带的软件复位指令或内狗指令;

    6、goto大法;

    天堂雨林博客对以上方法的意见:

    方法1:“放狗”是单片机软复位的最好办法,也基本上是唯一的一个办法。但并不是所有单片机都具备看门狗的功能,也不是一个万全之策。

    办法2:这不是复位,只是把程序转到地址0去执行,不如用一个JMP更直接。目前可能极少数单片机或者用户已经自行添加Boot load时用户程序的程序开始地址并不为0x0000,所以需要查找这些特定单片机的启动地址。

    在keil C51下面可以这样实现:

    void soft_reset(void)

    {

    ((void (code *) (void)) 0x0000) ();

    }

    在需要软件复位的地方使用语句:

    soft_reset();

    一般可实现软件复位。

    办法3:用软件实现的硬复位。需要牺牲一个单片机引脚,且增加了单片机外部电路构造的复杂性,很不可取。

    办法4:类似办法3,同样需要牺牲一个单片机引脚,且增加了单片机外部电路构造的复杂性,很不可取。但不能把它单单地当成是复位,应该叫上电复位。

    办法5:Atmel 89C不带内狗,S的有内狗,只是一条指令就行。如STC的单片机有软件复位指令,即ISP_CONTR,地址在0E7H 单元(即str ISP_CONTR=0xE7),MOV ISP_CONTR,#00100000B(C语言为ISP_CONTR=0x20),内狗也是一条指令MOV WDT_CONTR,#00111100B!

    STC 51系列单片机Datasheet中指出:传统的8051 单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。现STC 新推出的增强型8051 根据客户要求增加了ISP_CONTR 特殊功能寄存器,实现了此功能。用户只需简单的控制ISP_CONTR 特殊功能寄存器的其中两位 SWBS / SWRST 就可以系统复位了。

    办法6:程序从头(上电复位处)开始运行,且只有一个循环这种情况,当然可以用goto,如在main()的开头设一个start:,在程序的唯一循环中设定一个条件,然后goto命令。但需要注意,如果是在中断例程里,那么中断挂号寄存器仍置位,同级中断不能执行。所以必须先使中断挂号寄存器清零,EA = 0。只有RETI指令可以使中断挂号寄存器清零。51单片机有两级中断优先级,所以需要执行两次RETI指令。这用汇编是很简单的事,而C则比较难以实现。但是,goto命令尽量不要用,因为goto会到处乱窜,而且goto不能跑到函数外面去执行一个命令。

    最后总结如下:最好使用办法5最为简洁方便,使用办法2实现也不失为一种好方法

    00分享举报

    展开全文
  • 众所周知,单片机在上电复位,或程序正在执行时候按下复位键,PC指针就会指向0地址,程序从0地址处开始执行,这是硬件复位,我暂且称它为“硬复位”,因为下文所讲的是程序在运行过程通过调用执行一段代码跳转到0...
  • 1前言在隧道窑温度控制系统、自助式寄存柜等多个实际应用中,我们利用单片机高级C语言编制应用程序,满足了用户对各项性能参数的不同要求。下面以一实例,介绍C语言在应用程序设计上的优点。2系统结构系统由电器和...

    1前言

    在隧道窑温度控制系统、自助式寄存柜等多个实际应用中,我们利用单片机高级C语言编制应用程序,满足了用户对各项性能参数的不同要求。下面以一实例,介绍C语言在应用程序设计上的优点。

    2系统结构

    系统由电器和机械两部分组成。机械部分由寄存柜箱位、电控锁组成;电器部分由单片机、控制继电器、操作面板、工作状态指示组成。系统结构如图1所示。

    79b5347a683a9228bf4a6c4942c2123a.png

    3系统功能程序设计

    系统程序有以下部分组成:主程序、存取程序、监控管理程序、控制输出程序、柜体箱位排序程序及键盘中断、时钟定时中断和报警程序。下面主要介绍箱位排序程序、存取程序和防止密码重复程序。软件设计采用了模块化结构设计方法,所有程序采用单片机高级C语言编写。

    主程序完成各个外设接口初始化,然后,进入键盘采样处理显示程序,由时钟中断程序完成显示扫描更新及采样处理。下面是箱位号初始化子程序。

    536c09a73d8f7e5d8549bf433d00272d.png

    上述程序中的jICunnum[]变量用于保存箱位的箱位号,初始时的jicunnum[i]=i(i=1,2,…,32),即所有的32个箱位分别设置为1,2,…,32,以便于箱位状态指示和接受继电器的输出控制,完成柜体箱位的闭锁控制,因为箱位电控锁的开启是按照箱位对应的箱位号进行操作的。例如,对应5号箱位初始号码为jicunnum[5]=5,其他依此类推。

    存放物品时,在有空箱位情况下,系统随机自动产生一个12位密码,并保存起来,同时将该密码打印出来由顾客自己随身携带。密码随机产生程序如下:

    void Take(){

    1.qq:Mimac=ReadKey();

    2.if(Mimac!=0x11){

    3.if(Mimacount<numset){

    4。Mimac--;Mimac=c&0x00f;

    5.display[Mimacount]=Mimac;

    6。Mimatemp*=10;

    7。Mimatemp+=Mimac;

    8。Mimacount++;goto qq;}

    9。goto endt;}

    10.for(j=0;j<count;j++){

    11.if(jicun[j]=Mimatemp){

    12。orinum=j;}}

    13。endt:return();}

    上面程序中的第3行rand()是随机数发生子程序,程序中的2~4行随机自动产生一个12位密码,并以十进制的形式保存在变量Mimanew中。

    为了防止本次产生的密码与当天已经产生的密码重复,程序中设置了判别程序。程序中的5~7行将随机产生的12位密码与原来已经产生的其他密码进行比较,其中jiold[]变量用于存放当天已经产生的密码,totalcount变量为已经产生密码的个数。

    若比较的结果相同,说明新产生的密码重复,程序返回,再重新产生一个12位密码。若不同,说明密码没有重复,将新密码保存在密码变量jICun[]中,同时自动打开一个新箱位,对应箱位的占位指示灯亮。8~11行调整密码计数指针(count)和当天已经产生密码计数指针(totalcount)。

    当柜体箱位己满,也就是count大于32时,工作状态指示箱位已满,提醒后来的顾客不要继续在该寄存柜操作。

    取出物品时,通过操作面板输入12位数字密码,12位密码数据分别存放在变量display[i](i=1,2,…,12)单元,显示程序将display[]中的数值在数码管上显示出来。控制系统将这次输入的密码与原来保存在变量jicun[]中的12位数字密码进行比较,若相同,打开原来存放物品对应箱位门锁,并熄灭相应箱位的占位指示灯;否则,不执行任何操作。取出物品程序如下:

    void Take(){

    1.qq:Mimac=ReadKey();

    2.if(Mimac!=0x11){

    3.if(Mimacount<numset){

    4。Mimac--;Mimac=c&0x00f;

    5.display[Mimacount]=Mimac;

    6。Mimatemp*=10;

    7。Mimatemp+=Mimac;

    8。Mimacount++;goto qq;}

    9。goto endt;}

    10.for(j=0;j<count;j++){

    11.if(jicun[j]=Mimatemp){

    12。orinum=j;}}

    13。endt:return();}

    上述程序中的第1行ReadKey()是键盘按键读取子程序,2~9行等待读取操作面板输入12位数字密码,并将输入的密码以十进制的形式暂时保存在变量Mimatemp中,程序中的第2行用于判断是否退出键。10~12行判别输入的12位密码是否与原来某一内存变量jicun[]的密码相同,若相同,打开原来存放物品的箱位门锁;否则,不执行任何操作。第3行Mimacount用于计算密码输入个数的位置,第4行Mimac用于保存密码的一位数字,第12行orinum用于保存对应密码的箱位号。numset是初始设定的密码位数,这里,numset=12。

    为防止恶意操作,密码不相符时,可重复输入三次,然后设置禁止操作标志位,自动闭锁延时一段时间(例如3分钟),再允许操作;在时钟定时中断程序中对设置的禁止操作标志复位,恢复正常操作。

    前面已经介绍,jicunnum[]变量用于保存箱位的箱位号,初始状态为jicunnum[i]=i(i=1,2,…,32)。但是,经过一段时间操作运行以后,jicunnum[]的原始状态已经发生了变化。假如,现在第7位顾客取走了物品,jicunnum[7]的内存已经不是7,为实现箱位状态指示和接受继电器控制输出,必须保证操作的密码和其箱位号一致,每次取出物品后,要对箱位号变量进行重新排序。下面是箱位的排序程序。

    void sort(){

    1。count--;

    2。tempnum=jicunnum[orinum];

    3.for(i=orinum;i<count;i++){

    4.jicun[i]=jicun[i+1];

    5.jicunnum[i]=jicunnum[i+1}

    6.jicunnum[count]=tempnum;

    7。return();}

    程序中的第1行为计数器减1操作,说明物品已经被取走,空出一个箱位,第2行保存密码所对应的箱位号,3~5行将当时空的那个箱位后面的箱位号(jicunnum[])及对应密码(jicun[]),挨个往前依次移动,直到已经存放的箱位i=count逐个移动完毕。

    程序中的第6行把已经取出物品的箱位号排到最后内存变量jicunnum[count]。

    经过箱位排序程序重新排序后,此时第7位顾客的箱位号jicunnum[7]保存的是当时空的那个箱位后面的箱位号。程序中的变量count、orinum、jicun[]定义与前面相同。

    存、取物品过程中,为了让使用者了解系统的工作状态,例如:存放或取出物品,柜体箱位已满或已空,哪些箱位已空等状态,通过工作状态指示灯提醒顾客。

    为了便于操作管理,程序中设置了监控管理程序,遇有特殊情况,需要随时打开任一箱位时,系统操作人员有权完成该操作。设置不同的管理权限密码,只有系统管理人员,才能进入该操作;其操作过程与取出物品时相同。

    参考文献

    [1] 徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M].北京:电子工业出版社,1999.

    展开全文
  • 单片机的软件复位分析(C语言)

    千次阅读 2008-10-07 20:30:00
    在单片机的软件抗干扰原理中,常常采用软件复位的方法,以下是两种常用的软件复位程序:1、常用软件复位程序void reset(void){(*(void(*)())0x0000)();}汇编码: 我们来分析一下:(*)()是函数指针的强制转换(*(void...

    在单片机的软件抗干扰原理中,常常采用软件复位的方法,以下是两种常用的软件复位程序:
    1、常用软件复位程序

    void reset(void)
    {
    (*(void(*)())0x0000)();
    }

    汇编码:





     

    我们来分析一下:
    (*)()是函数指针的强制转换
    (*(void(*)())0x0000)()就是将函数的入口地址强制指向0x0000处,即进行了软复位。
    它的缺点是不能在中断子程序中调用,因为这句指令仅仅使PC指针指向0x0000处,而并没有清除中断标志位。

    2、可以在中断程序中调用的软件复位程序

    void reset(void)
    {
    uchar code rst[] = {0xe4, 0xc0,0xe0,0xc0,0xe0,0x32};

    (*((void(*)(void))(rst)))();
    }

    汇编码:









    我们来分析一下:
    程序中将代码当作数组的数据来存储。
    rst是程序代码的首地址
    (void(*)(void))是函数指针的强制转换
    (void(*)(void))(rst))是将数组名rst强制转换成一个无参数无返回值的函数的指针,指向rst的首地址,只需调用(*((void(*)(void))(rst)))()即可将数组中的数据当作函数代码来运行。
    由汇编语言可知,这段程序可以清除掉中断标志位(使用了RETI指令),因此该段代码可以在中断子程序中运行。

    展开全文
  • 汇编程序调用C语言

    2021-04-29 09:54:00
    SVC模式就是管理模式,当程序复位或者重启时就是SVC模式。在我们设置好SVC的栈之前是不能调用C程序的。可知SVC模式的SP寄存器应该设置为0xd0037D80,因为ARM是用的满减栈。 4.2.2 设置SVC的栈 #define SVC_STACK 0...
  • 复位程序如下: ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP 在复位程序内,声明了外...
  • 《答辩材料-基于LCD1602的数字钟程序设计(C语言》由会员分享,可在线阅读,更多相关《答辩材料-基于LCD1602的数字钟程序设计(C语言(6页珍藏版)》请在人人文库网上搜索。1、答辩材料一、 LCD1602概要LCD1602液晶显示...
  • 随着单片机技术的发展,单片机性能得到很大提升,抵消了C语言编译后,执行代码大、运行内存占用多、运行时间长的不足。采用汇编语言编写程序时,只要规划好,按功能设计模块,就可以提高程序的可读性,而且还有助于...
  • 实验三_C语言程序实验1实验报告肇 庆 学 院电子信息与机电工程 学院 实验日期: 2015 年 12 月 21 日班级:12电气1班 姓名:李俊杰 学号: 19 老师评定:____ _实验三:C语言程序实验1一、实验目的学会使用Embest IDE...
  • c语言中的中断函数注意事项单片机_C语言函数_中断函数(中断服务程序)在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在...
  • 以上是我在单片机上调试好的can总线程序 #include //SJA存储器定义头文件 #include //SJA子程序文件 调试好的can总线程序 // void Init_Cpu(void); //初始化单片机 void Sja_1000_Init(void); //初始化SIA // void ...
  • I2C读写程序C语言编写,注释详细,欢迎下载
  • 原标题:搭建第一个程序控制电路LED灯,体会C语言的魅力学习C语言,先从读程序开始!这一点是过来人的经验之谈。本文建议大家选择一款图形编程软件,本文选择了Mixly。一、首先,介绍一下arduino UNO控制器内部电压...
  • 满意答案xioangmen2013.06.08采纳率:41%等级:12已帮助:10789人函数...当调用kbhit()函数检测后,它的状态会自动复位。即重新进入检测状态而不会保留上一次的检测结果的。用 法:int kbhit(void);包含头文件: in...
  • 满意答案icewolf04042014.02.05采纳率:53%等级:12已帮助:9204人int biosdisk(int cmd, int drive, int head, int track, int ...这强迫驱动器控制器来执行硬复位.忽略所有其它参数.1 返回最后的硬盘操作状态.忽...
  • DS18B20驱动程序(C语言)//#include"reg51.h"sbit DQ =P1^4; //定义通信端口//延时函数/*void delay(unsigned int i){while(i--);}*///初始化函数Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //...
  • C语言编程基础:1.十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。2.如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。3.++var表示对变量var先增一;var—表示对变量后减一...
  • 采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图2所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置...图2电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watch...
  • C语言模块化程序设计

    千次阅读 2017-09-07 22:29:29
    C语言模块化程序设计 模块划分 C语言模块化程序设计需理解如下概念:  (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;  (2) 某模块提供给其它模块调用的...
  • linux下包监控程序[C语言]

    千次阅读 2016-12-21 20:18:28
    在linux下实现一个数据包监控程序,此程序主要包含3个主要模块:底层模块、中层模块和上层统计模块。其中底层模块是数据包的捕获过程; 中层模块包括MAC 层处理模块、IP 层处理模块、TCP 处理模块、UCP 处理模块和...
  • 简单使用C语言写梯形图精简V2.0C语言实现梯形图写法1: AND2: LDI3: ANDB4: ANDP5: ORB6: C17: T08: MPS19: LDF1...
  • 单片机c语言万年历程序 LCD显示 #define uint unsigned int #define uchar unsigned char sbit DS1302_CLK = P3^6; //实时时钟时钟线引脚 sbit DS1302_IO = P3^7; //实时时钟数据线引脚 sbit DS1302_RST = P1^4...
  • 这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么?写一个很简单的程序试一...
  • 有一个《单片机八人抢答器...P3.7接主持人“开始/复位”按钮;P0口接一个数码管(共阳极);P2口接8个LED灯,用于对应8个小组抢答指示。(1)当主持人没有按下“开始”按钮时,数码管显示0;(2)当主持人按下“开始”按钮...
  • 但是C语言都忘光了,又找出郭天祥的书啃了一天。那就开始做吧其实逻辑很简单,AT89C51单片机检测io口,有信号,显示并锁存。复位重新开始。要显示信号,就驱动数码管最简单,八路抢答器,需要8个io口,数码管需要7个...
  • /*秒表复位*/ void StopwatchReset() { StopwatchRunning=0; //停止秒表 IntegerPart=0; DecimalPart=0; StopwatchReset=1//重置刷新标志 } /*秒表启停函数*/ void StopwatchAction() { if(StopwatchRunning...
  • 51单片机C语言程序100例

    万次阅读 多人点赞 2018-04-13 13:08:30
    目录目录................................................................................................................................1函数的使用和熟悉********************************/.................
  • 郑州大学远程教育学院C语言程序设计题库(二)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,131
精华内容 4,452
关键字:

复位程序c语言

c语言 订阅