数码之家

 找回密码
 立即注册
搜索
查看: 2008|回复: 21

写完了一段十几年前的烂尾程序

[复制链接]
发表于 2022-5-12 14:10:12 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前几天有坛友提问:帮我看下这个程序到底哪里有问题,为什么(key1==1)定时器还在计时呢?https://www.mydigit.cn/thread-310786-1-1.html
当时看到这个问题时并未多想,就按照定时/计数器控制的思路参与了回复,昨天看到了题主的回复就又认真的看了问题,竟然发现所提问题似曾相识,于是查找电脑里的老文件竟然真的有一个烂尾工程在哪里,虽然与题主的按键问题不同但却是一个LED灯按次数闪亮的问题,当时因为不是用专业的方式学习编程,所以费了很大力气也没能实现就烂在哪里了,看到题主的问题也是兴趣所致重新编写了这段简单的程序,为了参与问题的回复也为了完成当年的心愿。
十几年前刚刚接触单片机编程时,几乎都是从点亮一只LED灯开始熟悉编程的,我也不例外,先是点亮了一个LED,而后是让这个LED按照一定的规律闪亮,做完这些后曾突发奇想让一个LED亮3次就停在哪里,因为当时不懂得使用标志所以好久没能实现,后来弄的多了也就把它遗忘了,昨晚找出实验板重新做了这个实验而后根据坛友的问题也写了按键控制代码,点灯的简单代码就不贴出占用幅面了这里仅贴出按键代码,如果有新手用到可以参考下,同时也请编程高手指正。
下面是在原帖中回复的用软件延时控制的代码转帖于此便于查找:(代码用STC12C5A60S2单片机测试)

  1. #include<reg52.h>
  2. #include <intrins.h>//引用此头文件为了使用nop函数
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit key=P3^4;//定义P5.4为按键状态采集端口
  6. sbit led1=P3^3;//定义P1.4口控制LED灯,本例LED灯为低电平点亮高电平熄灭的控制模式
  7. //====(value)ms@12MHz=======================================================
  8. //此函数仅适合STC12系单片机,换用其他单片机时请重新编写,否则延时时间严重不准
  9. void delay_ms(uint value)
  10. {
  11. uchar i,j;
  12. while(value>0)
  13. {
  14. _nop_();
  15. _nop_();
  16. i = 12;
  17. j = 168;
  18. do
  19. {
  20. while (--j);
  21. }
  22. while (--i);
  23. value--;
  24. }
  25. }
  26. //===================================
  27. void main()
  28. {
  29. uchar flag=0;//设置一个标志变量并初始化,如果没有标志控制、程序将循环运行LED为常亮状态
  30. led1=1;//必须在此处初始化控制端口、否则可能会出现LED不可控或控制紊乱现象
  31. while(1)
  32. {
  33. if(key==0)
  34. {
  35. delay_ms(20);//等一等
  36. if(key==0)//如果按键属实被按下了
  37. {
  38. flag=1;//按键按下后标志状态置位
  39. led1=0;//按键不松开LED就一直发光
  40. while(!key);
  41. }
  42. //以下两行代码用来演示开关的切换状态
  43. //如果不加入以下两句则LED将保存点亮无法感知控制状态的转变
  44. //实际使用时请去除以下两行代码
  45. led1=1;//按键松开后LED关闭0.5S
  46. delay_ms(500);
  47. }
  48. if((key==1)&&(flag==1))
  49. {
  50. flag=0;//按键松开后清除标志状态
  51. led1=0;//点亮LED
  52. delay_ms(2000);//为了快速看到演示效果,无按键按下时LED仅仅点亮2秒钟
  53. led1=1;//如果无按键按下、LED点亮10秒后熄灭
  54. }
  55. }
  56. }
复制代码

下面是用定时器实现的代码:
  1. #include<reg52.h>
  2. #include <intrins.h>        //引用此头文件为了使用nop函数
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit key=P3^4;                        //定义P5.4为按键状态采集端口
  6. sbit led1=P3^3;                        //定义P1.4口控制LED灯,本例LED灯为低电平点亮高电平熄灭的控制模式
  7. //设置2个公共变量用于计数
  8. uchar count=0;       
  9. uint  count1=0;
  10. //设置一个标志变量
  11. uchar flag=0;                       
  12. //====定时/计数器0初始化函数=========================
  13. void init_T0()
  14. {
  15.     IE=0x82;                             //EA=1;开启总中断、ET0=1;开启定时/计数器0中断
  16.     TMOD=0x01;                            //设置定时/计数器0的工作于Mode1模式16位寄存器计数满值65536
  17.     TH0=(65536-1000)/256;         //高8位填值(1ms定时)
  18.     TL0=(65536-1000)%256;         //高8位填值
  19. }
  20. //====定时/计数器0中断子函数======================
  21. //STC12XX芯片12T模式,12MHz晶体,定时1ms
  22. void clock_T0(void) interrupt 1
  23. {
  24.     TH0=(65536-1000)/256;
  25.     TL0=(65536-1000)%256;
  26.     count++;                        //中断次数累计
  27.     count1++;
  28. //以下限定变量的最大值避免数据超值
  29.         if(count>20)                //20ms计数用于按键抖动判断
  30.     {
  31.         count=0;               //累计值超过10000后归0
  32.     }
  33.         if(count1>10000)        //10s计数
  34.     {
  35.         count1=0;       //累计值超过10000后归0
  36.     }
  37. }
  38. //===================================
  39. void main()
  40. {
  41.     init_T0();                //初始化定时/计数器0
  42.     led1=1;
  43.     while(1)
  44.     {
  45.         if(key==0)
  46.         {
  47.             TR0=1;                        //启动定时/计数器0开始计数
  48.             if((key==0)&&(count>=20))//定时20ms后再次查询按键状态、如果仍然为0则判定按键为按下状态
  49.             {
  50.                 flag=1;
  51.                                 TR0=0;                        //关闭定时/计数器0
  52.                 count=0;                //清空计数变量等待重新计数
  53.                 led1=0;                        //点亮LED
  54.                 while(!key);                //等待按键状态改变
  55.             }
  56.             led1=1;                        //关闭LED(此句可以不用)
  57.                 }
  58.             if((key==1)&&(flag==1))
  59.             {
  60.                                 TR0=1;                //重新启动定时/计数器0
  61.                 if((key==1)&&(count>=20))
  62.                 {
  63.                                         count=0;
  64.                     led1=0;
  65.                     if(count1==10000)        //计数10000次大约延时10秒
  66.                     {
  67.                         TR0=0;
  68.                         count1=0;
  69.                         led1=1;
  70.                                                 flag=0;
  71.                     }
  72.                 }
  73.             }
  74.     }
  75. }
复制代码






发表于 2022-5-12 14:31:45 | 显示全部楼层
拖延症晚期啊
回复 支持 反对

使用道具 举报

发表于 2022-5-12 14:37:20 | 显示全部楼层
我这还有个刚开了个头的十来年的程序
回复 支持 反对

使用道具 举报

发表于 2022-5-12 14:45:36 | 显示全部楼层

这不是晚期,是埋了十年后诈尸了吧
回复 支持 反对

使用道具 举报

发表于 2022-5-12 14:46:24 | 显示全部楼层
耐心点其实程序不难,多练练就是了
回复 支持 反对

使用道具 举报

发表于 2022-5-12 20:28:48 来自手机浏览器 | 显示全部楼层
我也有很多烂尾楼…
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-5-12 21:29:58 | 显示全部楼层
ww5223017240 发表于 2022-5-12 14:46
耐心点其实程序不难,多练练就是了

没有经过系统学习的人起始的时候真的很难,也有一本谭浩强的C语言教科书,记得那时候读的时候即读不明白也读不进去,转眼玩单片机有十二个年头了,前些天无聊找出来看了几页竟然感觉挺简单的,因为只是爱好并无实际用途所以写的代码也不多,但身边涉及单片机控制的的东西也玩了挺多的,今天写的这段代码对于真实应用已经没啥意义了,只是爱好而已。
回复 支持 反对

使用道具 举报

发表于 2022-5-12 22:05:00 | 显示全部楼层
现在回去看当初电子设计大赛的题觉得很简单了,是因为知识积累了,实践增多了。
回复 支持 反对

使用道具 举报

发表于 2022-5-12 23:55:24 | 显示全部楼层
慕名而来 发表于 2022-5-12 21:29
没有经过系统学习的人起始的时候真的很难,也有一本谭浩强的C语言教科书,记得那时候读的时候即读不明白 ...

我就是文科生自学的编程,单片机也是自学的,现在电脑,手机,单片机都会编,C,C++,C#,java都会,别急,一旦入门了就学的很快了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-13 10:42:03 | 显示全部楼层
ww5223017240 发表于 2022-5-12 23:55
我就是文科生自学的编程,单片机也是自学的,现在电脑,手机,单片机都会编,C,C++,C#,java都会,别急 ...

你的成绩让我这个学自动化专业的很惭愧。
回复 支持 反对

使用道具 举报

发表于 2022-5-13 12:26:59 | 显示全部楼层
大学数学,也有一学期c科,c学的还行,考试时就没背题,编程题忘了时请编程打印水仙花数还是杨辉三角形了,忘了时啥结构,也没有提示,我就问老师我应该打印啥,老师就一脸看渣渣生的嫌弃表情,跟我说上课不好好学,考试时问老师有什么用
回复 支持 反对

使用道具 举报

发表于 2022-5-13 13:41:29 | 显示全部楼层
这也太吓人了。。。这已经是晚期中的晚期了。。
回复 支持 反对

使用道具 举报

发表于 2022-5-13 14:18:17 | 显示全部楼层
飞向狙沙 发表于 2022-5-13 12:26
大学数学,也有一学期c科,c学的还行,考试时就没背题,编程题忘了时请编程打印水仙花数还是杨辉三角形了, ...

虽然一直在编程序,也喜欢编程序,但是我真的害怕做这些考试题,特别是各种算法的,甚至包括最简单的冒泡排序!
回复 支持 反对

使用道具 举报

发表于 2022-5-14 08:41:25 | 显示全部楼层
hlt253 发表于 2022-5-12 22:05
现在回去看当初电子设计大赛的题觉得很简单了,是因为知识积累了,实践增多了。 ...

倒立摆我感觉还是不简单啊
回复 支持 反对

使用道具 举报

发表于 2022-5-14 09:06:09 | 显示全部楼层
ww5223017240 发表于 2022-5-12 23:55
我就是文科生自学的编程,单片机也是自学的,现在电脑,手机,单片机都会编,C,C++,C#,java都会,别急 ...

厉害了。
---

我没读大学。所以也不敢以理科生自居。

编程语言学了一大堆,至少十几门是有的。
win,androd,linux,web前后端,嵌入式,逆向都玩。

刚开始以为自己很厉害,
后来在网上碰到过很多大神,看看他们再看自己只好自惭形秽。
之可是大大得不敢当啊,只敢说浅尝辄止

电子则是20多年前读书时淘老书摊开始自学的。

学东西有个一通百通的过程,就像武侠书上的任督二脉,没有到境界时,感觉哪都难,然后修练积累到一定过程时,总有一天感觉豁然开朗。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-14 10:35:41 | 显示全部楼层
junyee 发表于 2022-5-14 09:06
厉害了。
---

“浅尝辄止”正是我玩单片机的过程,玩了十几年虽然从点亮LED到TFT驱动几乎都是简单玩玩,最为尴尬的是曾经两次弄SD卡(TF卡)文件系统每次都是从头来过的,毕竟这些东西对于我没有实用性,对什么东西感兴趣时玩一玩、过了一段时间就撂下了,业余爱好是没有理想和目标的只能跟着感觉走了。
回复 支持 反对

使用道具 举报

发表于 2022-5-14 16:02:11 | 显示全部楼层
junyee 发表于 2022-5-14 09:06
厉害了。
---

和学历没啥关系,喜欢就学呗,多练练总会会的。现在00后,10后更厉害
回复 支持 反对

使用道具 举报

发表于 2022-5-14 17:38:35 | 显示全部楼层
深入研究总能有新收获
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-15 10:32:06 | 显示全部楼层
本帖最后由 慕名而来 于 2022-5-15 10:41 编辑

或许时间也是学习的助力,时间久了积累多了有些难题也就不是问题了,但要保证一直在弄否则兴趣没了问题也就没了,而能真正激励一个人能做的久的事情就只有“爱好”了。
回复 支持 反对

使用道具 举报

发表于 2022-12-21 23:02:28 | 显示全部楼层
TR0=0;                        //关闭定时/计数器0
为什么要关闭计时器呢,一直让他计时不好吗,只要判断标志就好了。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 07:19 , Processed in 0.234000 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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