找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6340|回复: 26
打印 上一主题 下一主题
收起左侧

如何让单片机程序里一段代码就运行一次,以后重启都不会再执行了

  [复制链接]
跳转到指定楼层
楼主
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:716656 发表于 2021-7-6 13:51 | 只看该作者
变量为1,判断第一次进入运行过以后,变量减一,为0,写入flash,下一次进入if(0)就不执行了。。。不知道可行不
回复

使用道具 举报

板凳
ID:660851 发表于 2021-7-6 15:06 | 只看该作者
做一个数据存储到单片机flash(掉电不会丢失数据)存储中,运行那段代码之后就改变存储数据,程序上电读取该数据,判断是否是设定值
回复

使用道具 举报

地板
ID:798631 发表于 2021-7-6 17:20 | 只看该作者
设定一个标志数据 进行硬件存储  软件修改标志数据的值 判断数值后执行相应代码就可以,执行1次 执行1年这样类似这样的功能这样的实现最方便
回复

使用道具 举报

5#
ID:415064 发表于 2021-7-6 18:31 | 只看该作者
第一次执行后,把flag写入flash。以后每次读取flag来不执行
回复

使用道具 举报

6#
ID:88256 发表于 2021-7-6 19:03 | 只看该作者
压着我头发啦 发表于 2021-7-6 13:51
变量为1,判断第一次进入运行过以后,变量减一,为0,写入flash,下一次进入if(0)就不执行了。。。不知道 ...

只有0和1,容易出错,要像板凳说的那样写入一个指定的字节比如 55H 然后判断,要求高的多写几个不同的字节
回复

使用道具 举报

7#
ID:452950 发表于 2021-7-6 20:39 | 只看该作者
关键在于如何判断是否第一次通电,所以只要用一个标志来表示是否已执行过此段程序就可以了,这就需要掉电记忆功能,可以用单片机的flash,也可以用外置的存储芯片来储存这个标志。
回复

使用道具 举报

8#
ID:81196 发表于 2021-7-7 08:56 | 只看该作者
带记忆性的得写到存储里边才可以方便下一次的断电重启后的再次判断.可以判断具体标志,常规是写0x5A或0xA5这种特殊的数据来做标记.
回复

使用道具 举报

9#
ID:716656 发表于 2021-7-7 09:59 | 只看该作者
hhdsdy 发表于 2021-7-6 19:03
只有0和1,容易出错,要像板凳说的那样写入一个指定的字节比如 55H 然后判断,要求高的多写几个不同的字 ...

谢谢,穴道了
回复

使用道具 举报

10#
ID:709761 发表于 2021-7-8 07:57 | 只看该作者
如果FLASH坏了,或者读出数据错误,怎么办
回复

使用道具 举报

11#
ID:709761 发表于 2021-7-8 08:00 | 只看该作者
用硬件的方法可靠,运行一次,再把单片机引脚焊接拉低为0,判断引脚电平
回复

使用道具 举报

12#
ID:88256 发表于 2021-7-8 09:40 | 只看该作者
李冬 发表于 2021-7-8 07:57
如果FLASH坏了,或者读出数据错误,怎么办

FLASH那么容易坏吗?你怎么不问单片机坏了怎么办?在调试正常程序时序没问题并且FLASH不坏的情况下,读出数据出错的情况极少(比如被干扰了,有这份担心就要做好软硬件抗干扰措施)。
回复

使用道具 举报

13#
ID:88256 发表于 2021-7-8 09:44 | 只看该作者
李冬 发表于 2021-7-8 08:00
用硬件的方法可靠,运行一次,再把单片机引脚焊接拉低为0,判断引脚电平

运行一次后再焊接引脚不觉得麻烦吗?STC单片机自带断电保存的寄存器,能用软件解决的为什么还要动手用软硬件结合的方法?
回复

使用道具 举报

14#
ID:531720 发表于 2021-7-8 15:19 | 只看该作者

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

使用道具 举报

15#
ID:709761 发表于 2021-7-9 11:19 | 只看该作者
胖球 发表于 2021-7-8 15:19
可以用
int  status = 1;
#if  status

下次重启又运行了
回复

使用道具 举报

16#
ID:176854 发表于 2021-7-9 18:01 | 只看该作者
本帖最后由 jjjjjjir 于 2021-7-9 20:01 编辑






回复

使用道具 举报

17#
ID:88256 发表于 2021-7-9 23:11 | 只看该作者
李冬 发表于 2021-7-9 11:19
下次重启又运行了

你会看程序吗?单片机每次上电,status都赋值为1一次,然后执行一次里面的程序,再次循环(不是断电上电))才跳过这个程序,根本就不符合你的要求,反而上面帖子那么多建议你用断电存储器保存状态的正确建议置之不理
回复

使用道具 举报

18#
ID:709761 发表于 2021-7-10 08:26 | 只看该作者
hhdsdy 发表于 2021-7-9 23:11
你会看程序吗?单片机每次上电,status都赋值为1一次,然后执行一次里面的程序,再次循环(不是断电上电 ...

我的意思是断电重启会再次运行。断电存储器有使用寿命,不保险,想找找更好的办法。
回复

使用道具 举报

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

随意的一款断电存储器,读写的寿命都不会低于10万次,你一天会写入几次寿命有多少可以自己算,更何况这个只需要写入一次(以后重启只要判断有数据并且正确,不会执行写操作,你不会认为不管对错每次都必须重写数据吧?),剩下的都是读取数据了,读取数据不影响存储器的寿命,你担心什么?
回复

使用道具 举报

20#
ID:854029 发表于 2021-7-10 11:03 | 只看该作者
有EEROM的单片机很容易,没有EEROM的做不了。
回复

使用道具 举报

21#
ID:641314 发表于 2021-7-10 15:32 | 只看该作者
设定一个标准位 只有第一次的运行的时候标志位是0 运行完之后将标志位写到flash 切记每次开机先从flash将数据读出来
回复

使用道具 举报

22#
ID:451718 发表于 2021-7-10 17:33 | 只看该作者
VCC5v就够了,FU 是个 50ma保险丝。   P1.1给一次高电平,  保险丝熔断。   保险丝熔断前,P1.2始终是高电平,当保险熔断后,P1.2就始终是低电平了。  这个可以满足你的要求,而且是纯硬件,可靠性高。   不过,打死我也不会这么用。

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

aaa.jpg
回复

使用道具 举报

23#
ID:689247 发表于 2021-7-10 17:46 | 只看该作者
robinsonlin 发表于 2021-7-10 17:33
VCC5v就够了,FU 是个 50ma保险丝。   P1.1给一次高电平,  保险丝熔断。   保险丝熔断前,P1.2始终是高电 ...

老哥这个想法绝了
回复

使用道具 举报

24#
ID:342822 发表于 2021-7-10 18:00 | 只看该作者
呵呵~~bascom avr 是有这一功能的。在按下复位键到向SRAM写0期间加入命令$NORAMCLEAR禁止清除,
就可以保留复位前的变量值也就保留了标志位。
回复

使用道具 举报

25#
ID:250637 发表于 2021-7-12 14:04 | 只看该作者

这个方法就牛皮了
回复

使用道具 举报

26#
ID:642999 发表于 2021-7-16 17:03 | 只看该作者
写个程序给你看一下:

u8 i;//i是全局变量
void main(){
u8 i;
while(1){
读取(i);
if(i==0){
led=1;
i=1;
存入(i);
}
}
}
回复

使用道具 举报

27#
ID:342822 发表于 2021-7-16 20:49 | 只看该作者

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表