标题: 如何让单片机程序里一段代码就运行一次,以后重启都不会再执行了 [打印本页]

作者: 李冬    时间: 2021-7-6 12:09
标题: 如何让单片机程序里一段代码就运行一次,以后重启都不会再执行了
如题

作者: 压着我头发啦    时间: 2021-7-6 13:51
变量为1,判断第一次进入运行过以后,变量减一,为0,写入flash,下一次进入if(0)就不执行了。。。不知道可行不
作者: joyang    时间: 2021-7-6 15:06
做一个数据存储到单片机flash(掉电不会丢失数据)存储中,运行那段代码之后就改变存储数据,程序上电读取该数据,判断是否是设定值
作者: design003    时间: 2021-7-6 17:20
设定一个标志数据 进行硬件存储  软件修改标志数据的值 判断数值后执行相应代码就可以,执行1次 执行1年这样类似这样的功能这样的实现最方便
作者: wojiaoguogai    时间: 2021-7-6 18:31
第一次执行后,把flag写入flash。以后每次读取flag来不执行
作者: hhdsdy    时间: 2021-7-6 19:03
压着我头发啦 发表于 2021-7-6 13:51
变量为1,判断第一次进入运行过以后,变量减一,为0,写入flash,下一次进入if(0)就不执行了。。。不知道 ...

只有0和1,容易出错,要像板凳说的那样写入一个指定的字节比如 55H 然后判断,要求高的多写几个不同的字节
作者: xxpp2011    时间: 2021-7-6 20:39
关键在于如何判断是否第一次通电,所以只要用一个标志来表示是否已执行过此段程序就可以了,这就需要掉电记忆功能,可以用单片机的flash,也可以用外置的存储芯片来储存这个标志。
作者: shumivan    时间: 2021-7-7 08:56
带记忆性的得写到存储里边才可以方便下一次的断电重启后的再次判断.可以判断具体标志,常规是写0x5A或0xA5这种特殊的数据来做标记.
作者: 压着我头发啦    时间: 2021-7-7 09:59
hhdsdy 发表于 2021-7-6 19:03
只有0和1,容易出错,要像板凳说的那样写入一个指定的字节比如 55H 然后判断,要求高的多写几个不同的字 ...

谢谢,穴道了
作者: 李冬    时间: 2021-7-8 07:57
如果FLASH坏了,或者读出数据错误,怎么办
作者: 李冬    时间: 2021-7-8 08:00
用硬件的方法可靠,运行一次,再把单片机引脚焊接拉低为0,判断引脚电平
作者: hhdsdy    时间: 2021-7-8 09:40
李冬 发表于 2021-7-8 07:57
如果FLASH坏了,或者读出数据错误,怎么办

FLASH那么容易坏吗?你怎么不问单片机坏了怎么办?在调试正常程序时序没问题并且FLASH不坏的情况下,读出数据出错的情况极少(比如被干扰了,有这份担心就要做好软硬件抗干扰措施)。
作者: hhdsdy    时间: 2021-7-8 09:44
李冬 发表于 2021-7-8 08:00
用硬件的方法可靠,运行一次,再把单片机引脚焊接拉低为0,判断引脚电平

运行一次后再焊接引脚不觉得麻烦吗?STC单片机自带断电保存的寄存器,能用软件解决的为什么还要动手用软硬件结合的方法?
作者: 胖球    时间: 2021-7-8 15:19

可以用
int  status = 1;
#if  status
      里面是你需要执行一次的语句
#end if
status = 0;

作者: 李冬    时间: 2021-7-9 11:19
胖球 发表于 2021-7-8 15:19
可以用
int  status = 1;
#if  status

下次重启又运行了
作者: jjjjjjir    时间: 2021-7-9 18:01
本帖最后由 jjjjjjir 于 2021-7-9 20:01 编辑







作者: hhdsdy    时间: 2021-7-9 23:11
李冬 发表于 2021-7-9 11:19
下次重启又运行了

你会看程序吗?单片机每次上电,status都赋值为1一次,然后执行一次里面的程序,再次循环(不是断电上电))才跳过这个程序,根本就不符合你的要求,反而上面帖子那么多建议你用断电存储器保存状态的正确建议置之不理
作者: 李冬    时间: 2021-7-10 08:26
hhdsdy 发表于 2021-7-9 23:11
你会看程序吗?单片机每次上电,status都赋值为1一次,然后执行一次里面的程序,再次循环(不是断电上电 ...

我的意思是断电重启会再次运行。断电存储器有使用寿命,不保险,想找找更好的办法。
作者: hhdsdy    时间: 2021-7-10 09:07
李冬 发表于 2021-7-10 08:26
我的意思是断电重启会再次运行。断电存储器有使用寿命,不保险,想找找更好的办法。

随意的一款断电存储器,读写的寿命都不会低于10万次,你一天会写入几次寿命有多少可以自己算,更何况这个只需要写入一次(以后重启只要判断有数据并且正确,不会执行写操作,你不会认为不管对错每次都必须重写数据吧?),剩下的都是读取数据了,读取数据不影响存储器的寿命,你担心什么?
作者: acolorwolf    时间: 2021-7-10 11:03
有EEROM的单片机很容易,没有EEROM的做不了。
作者: gcysmart    时间: 2021-7-10 15:32
设定一个标准位 只有第一次的运行的时候标志位是0 运行完之后将标志位写到flash 切记每次开机先从flash将数据读出来
作者: robinsonlin    时间: 2021-7-10 17:33
VCC5v就够了,FU 是个 50ma保险丝。   P1.1给一次高电平,  保险丝熔断。   保险丝熔断前,P1.2始终是高电平,当保险熔断后,P1.2就始终是低电平了。  这个可以满足你的要求,而且是纯硬件,可靠性高。   不过,打死我也不会这么用。

aaa.jpg (58.13 KB, 下载次数: 42)

aaa.jpg

作者: cpu小白白    时间: 2021-7-10 17:46
robinsonlin 发表于 2021-7-10 17:33
VCC5v就够了,FU 是个 50ma保险丝。   P1.1给一次高电平,  保险丝熔断。   保险丝熔断前,P1.2始终是高电 ...

老哥这个想法绝了
作者: taotie    时间: 2021-7-10 18:00
呵呵~~bascom avr 是有这一功能的。在按下复位键到向SRAM写0期间加入命令$NORAMCLEAR禁止清除,
就可以保留复位前的变量值也就保留了标志位。
作者: 唐欢    时间: 2021-7-12 14:04
cpu小白白 发表于 2021-7-10 17:46
老哥这个想法绝了

这个方法就牛皮了
作者: 15411    时间: 2021-7-16 17:03
写个程序给你看一下:

u8 i;//i是全局变量
void main(){
u8 i;
while(1){
读取(i);
if(i==0){
led=1;
i=1;
存入(i);
}
}
}
作者: taotie    时间: 2021-7-16 20:49






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1