找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14461|回复: 99
收起左侧

一个中年人的起步之路

  [复制链接]
ID:703395 发表于 2020-3-7 18:43 | 显示全部楼层 |阅读模式
1981年出生的我,年级不小了。
时间过得太快了,从我懵懵懂懂的第一次敲完printf("hello world!!!\n"); 到现在已经过去了20年了
使用C语言出身,后面写过X86汇编,再后来C++,工作之余玩过N种各种各样花里胡哨的编程语言

虽然现在生活稳定,吃喝无忧。但总是感觉少了点什么
也许是10几年的拼搏磨灭了当初的激情。的确,再也不是那个熬夜敲代码的小伙子了。
趁这次特殊情况在家静养了一段时间,我也好好的问了下自己:“梦想还在吗?”
得到了一个很肯定的答案,从一个新的领域继续玩下去。
我这么琢磨的 :

1 可以找点正经事干干,不在把时间浪费在推杯换盏灯红酒绿里面。
2 可以教孩子制作各种各样玩具培养他的兴趣爱好。
于是我选择了单片机,顺理成章的来到了51hei 。
作为一个新人我想写个帖子,持续更新下去。就在本贴的下面,希望和新上路的你共勉!
回复

使用道具 举报

ID:6520 发表于 2020-3-7 19:42 | 显示全部楼层
加油!都是80后!
回复

使用道具 举报

ID:698901 发表于 2020-3-8 09:28 | 显示全部楼层
83年的,对单片机一窍不通,但想学,也愿意学!黑51是我前几天发现的新天地。
回复

使用道具 举报

ID:703395 发表于 2020-3-8 17:25 | 显示全部楼层
今天终于等到了快递小哥,第一次摸到51单片机。
迅速接电点亮。先从最简单的LED开始吧,虽然不明就里。但是通过4次测试
我发现我的板子是
P2 == 0       (00000000)  时全亮
P2 == 0xff   (11111111)  时全灭
P2 == 1       (00000001)  时最左面灯灭
P2 == 0X80 (10000000)  时最右面灯灭

好吧既然等了这么久,先不理会什么电路图懂不懂的。
打开音乐找到一首土嗨,让LED等给我HI起来吧
  1. #include "reg52.h"
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. void delay(u16 i)
  6. {
  7.         while(i--);
  8. }

  9. void power(u16 max, u16 d)
  10. {
  11.         u8 i;
  12.         for(i = 1; i <= max; i++)
  13.         {
  14.                 P2 = (0xff >> i);
  15.                 delay(d);
  16.         }
  17. }

  18. void powerlessness(u16 max, u16 d)
  19. {
  20.         u8 i;
  21.         for(i = 1; i <= max; i++)
  22.         {
  23.                 P2 = (P2 << 1) + 1;
  24.                 delay(d);
  25.         }
  26. }

  27. void main()
  28. {
  29.         u16 i;
  30.         u16 v = 0xff;
  31.         u16 n = v + 1;

  32.         power(8, 5000);
  33.        
  34.         for(i = 1; i <= 8; i++)
  35.         {
  36.                 P2 += (n >> i);
  37.                 delay(5000);
  38.         }
  39.        
  40.         delay(666666);
  41.        
  42.         while(1)
  43.         {
  44.                 power(6, 1888);
  45.                 powerlessness(3, 6666);
  46.                 delay(11111);
  47.         }
  48. }
复制代码




回复

使用道具 举报

ID:703395 发表于 2020-3-9 14:45 | 显示全部楼层
昨天拿到 了51开发板兴冲冲的一顿操作猛如虎。
把LED流水灯跑起来了,但随之而来不是高兴却是困惑!
今天花了些时间各种搜索,以及论坛发帖求人解惑
http://www.51hei.com/bbs/dpj-181455-1.html

首先 sbit 这个类型是什么
sbit 位变量名=地址值

我理解如下:
例如P2 = 0xA0;
sbit led1 = 0xa0 ^ 0; 与 sbit led1 = P2 ^ 0;
效果相同,下面打一个不那么恰当的例子 :
它其实就是一个地址
P2 = 0xA0
0xA0 ^ 0 = 0xA0 | 1010 0000
0xA0 ^ 1 = 0xA1 | 1010 0001
0xA0 ^ 2 = 0xA2 | 1010 0010
0xA0 ^ 3 = 0xA3 | 1010 0011

0xA0 ^ 4 = 0xA4 | 1010 0100
0xA0 ^ 5 = 0xA5 | 1010 0101
0xA0 ^ 6 = 0xA6 | 1010 0110
0xA0 ^ 7 = 0xA7 | 1010 0111

当设置某个地址的 值 为 0 时 LED被点亮
mem addr  | value
1010 0000 | 1
1010 0001 | 1
1010 0010 | 1
1010 0011 | 1
1010 0100 | 1
1010 0101 | 1
1010 0110 | 1
1010 0111 | 1

就好像
sbit led1 = P2 ^ 0;
while(1) {
    led1 = 0;
}

第二个困惑 sfr P2    = 0xA0;
为什么 P2的地址等于0xA0,但是我修改P2为 0x80的时候依然可以控制LED灯
例如
P2 = 0x80;
其实P2是一个地址, 是一个指针.
我们在执行P2 = 0x80的时候应该是隐式的执行了下面的语句
*(char*)0xA0 = 0x80; 所以可以控制LED灯
有兴趣的小伙伴们可以尝试修改
P2 = 0xA0;
看看8个等是不是只有6个亮了,其中排布类似于 1010 0000 = 0xA0
这就充分的证明了我们只是向 地址(0xA0) 当中写入了一个值 0xA0
等同于
mem addr | value
0xA0        | 0xA0

解决了上面两个疑问整个人感觉都轻松了不少。


回复

使用道具 举报

ID:703395 发表于 2020-3-9 15:03 | 显示全部楼层
本帖最后由 钱木头 于 2020-3-9 16:16 编辑

占楼占楼占楼占楼占楼占楼占楼占楼占楼
回复

使用道具 举报

ID:699250 发表于 2020-3-9 15:42 | 显示全部楼层
同LZ一样,人到中年,总觉得少些什么,所以来这里学习学习
回复

使用道具 举报

ID:705286 发表于 2020-3-9 17:31 | 显示全部楼层
到了中年做技术做不动了,单位小伙子每天看书到半夜,中年人太“南”了。
回复

使用道具 举报

ID:703395 发表于 2020-3-9 20:46 | 显示全部楼层
今天解决了几个困惑继续上路,先把所有基础的东西用源代码跑一遍。
顺便认识一下各个元器件,和很多陌生的名词。
下面是我写的一个数码管显示数字。尝试了一下C语言的抽象, C++程序员的陋习^_^

  1. Interface.h

  2. #ifndef __INTERFACE_H__
  3. #define __INTERFACE_H__

  4. typedef unsigned char u8;
  5. typedef unsigned int u16;
  6. typedef unsigned long u32;

  7. /**
  8. *  接口说明 : 显示一个数字
  9. *        参数 :
  10. *                x        : 显示位置的X坐标
  11. *                y        : 显示位置的Y坐标
  12. *                val : 具体需要显示的内容
  13. *        返回 :
  14. *                无返回值
  15. */
  16. typedef void(*pfnDisplayNumber)(u8 x, u8 y, u8 val);

  17. /**
  18. *        接口说明 : 清除屏幕
  19. */
  20. typedef void(*pfnClearScreen)(void);

  21. /**
  22. *        结构体说明 : 负责显示
  23. *        例如数码管、或者液晶屏等等
  24. */
  25. typedef struct _DisplayInterface {
  26.         pfnDisplayNumber displayerNumber;        // 用于显示一个数字的接口
  27.         pfnClearScreen clear;                                // 用于清除的一个接口
  28. }DisplayInterface;

  29. #endif

  30. ---------------------------------------------------------
  31. NixieTubeDisplay.h

  32. #ifndef __NIXIETUBEDISPLAY_H__
  33. #define __NIXIETUBEDISPLAY_H__
  34. #include "reg52.h"
  35. #include <intrins.h>
  36. #include "Interface.h"

  37. // 初始化一个数码管,例如外部创建的一个局部 DisplayInterface
  38. // 将地址传进来由InitNixieTube初始化.
  39. // 因为使用malloc不正常所以只设计了一个Init
  40. DisplayInterface * InitNixieTube(DisplayInterface * );

  41. #endif

  42. ---------------------------------------------------------
  43. NixieTubeDisplay.c

  44. #include "NixieTubeDisplay.h"

  45. sbit LSA = P2 ^ 2;
  46. sbit LSB = P2 ^ 3;
  47. sbit LSC = P2 ^ 4;

  48. // 0 - 9
  49. static const u8 numberHex[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

  50. // 将一个数字显示到数码管
  51. void displayNumberToNixieTube(u8 x, u8 y, u8 val)
  52. {
  53.         if((val >= 0 && val < 10) && (x >= 0 && x < 8))
  54.         {
  55.                 // 设置显示内容
  56.                 P0 = numberHex[val];
  57.                
  58.                 // 设置显示索引
  59.                 LSA = (x >> 0 ) % 2;
  60.                 LSB = (x >> 1 ) % 2;
  61.                 LSC = (x >> 2 ) % 2;
  62.         }
  63. }

  64. // 清除显示
  65. void clearNixieTube()
  66. {
  67.         P0 = 0;
  68. }

  69. DisplayInterface * InitNixieTube(DisplayInterface * pDisplay)
  70. {
  71.         if(pDisplay) {
  72.                 pDisplay->displayerNumber = displayNumberToNixieTube;
  73.                 pDisplay->clear = clearNixieTube;
  74.                 return pDisplay;
  75.         }
  76.         return 0;
  77. }

  78. ---------------------------------------------------------
  79. main.c

  80. #include "NixieTubeDisplay.h"

  81. typedef u8(*pfnCallback)(DisplayInterface * displayObject);

  82. void delay(u16 i)
  83. {
  84.         while(i--);
  85. }

  86. void display(u8 index, u8 number,
  87.         DisplayInterface * displayObject, pfnCallback callback)
  88. {
  89.         if(displayObject)
  90.         {
  91.                 displayObject->displayerNumber(index, 0, number);
  92.                 if(callback) { callback(displayObject); }
  93.         }
  94. }

  95. void message(DisplayInterface * displayObject)
  96. {
  97.         delay(100);
  98.         // 当接收到这个消息的时候,说明已经显示完了
  99.         if(displayObject)
  100.         {
  101.                 displayObject->clear();
  102.         }
  103. }

  104. void main()
  105. {
  106.         u8 n = 0;
  107.         u8 i = 0;
  108.         DisplayInterface v;
  109.         InitNixieTube(&v);
  110.         while(1)
  111.         {
  112.                 for(i = 0; i < 10; i++)
  113.                 {
  114.                         display(i, i + 2, &v, message);
  115.                 }
  116.         }
  117. }
复制代码
回复

使用道具 举报

ID:703395 发表于 2020-3-10 17:04 | 显示全部楼层
今天花了一天时间把中断系统看了一遍,并且编写了对应的代码。独立按键以及定时器都可以接收到中断信号了
其它的外设模块我想暂时没必要看下去了,是时候回过头去研究最小系统了。然后就是画一个PCB打样焊接了。
在这里和很多入门的新人交流一下心得,我认为按我上面这几天的步骤学习就差不多了
以后那些外设模块。用到了什么就查看对应芯片的手册,以及如何设计到板子上面。
快速的画板打样焊接,当焊接调试通过了之后我估计在学校那些数电和模电的知识也巩固的差不多了。就算没学过,也学的差不多了。
后面用到什么学什么
回复

使用道具 举报

ID:611988 发表于 2020-3-16 11:05 | 显示全部楼层
支持楼主,八零后
回复

使用道具 举报

ID:16848 发表于 2020-3-22 10:43 | 显示全部楼层
有电路基础,自己确实爱好,又想学,那就能学好。
回复

使用道具 举报

ID:611988 发表于 2020-3-23 16:05 | 显示全部楼层
做市场销售、硬件 软件 壳体 技术和管理的朋友们,大家相互照顾,若遇到有客人需要可以相互推荐下
回复

使用道具 举报

ID:117433 发表于 2020-3-24 16:36 | 显示全部楼层
80年,16年开始复习电子,单片机,只为充实,
回复

使用道具 举报

ID:263989 发表于 2020-3-26 14:13 | 显示全部楼层
标题描述了一个20年的老油条来混51了
回复

使用道具 举报

ID:603753 发表于 2020-4-2 16:37 | 显示全部楼层
80后业余学了两年了,花了不少时间。太多地方还是没明白,目前水平入门阶段,简单的都理解了,稍微变换一下就转不过弯了,总是很难深入。
回复

使用道具 举报

ID:722677 发表于 2020-4-5 12:33 来自手机 | 显示全部楼层
70后默默地看
回复

使用道具 举报

ID:497780 发表于 2020-4-12 00:21 | 显示全部楼层
我个人认为培养一下兴趣是好的,总比整天无所事事不是抽烟喝酒赌博好,还有不要让你的兴趣和爱好作为你的谋生工具就好了!
回复

使用道具 举报

ID:401564 发表于 2020-4-14 09:48 | 显示全部楼层
sdvic 发表于 2020-4-12 00:21
我个人认为培养一下兴趣是好的,总比整天无所事事不是抽烟喝酒赌博好,还有不要让你的兴趣和爱好作为你的谋生 ...

哥们你这就错了
有一门工作,你又喜欢它,它又能给带来面包,对于一个中年男人来说这得是多快乐的事呢!
回复

使用道具 举报

ID:497780 发表于 2020-4-16 22:27 | 显示全部楼层
呵,每个人的认识和经历都不同,没有谁对谁错的,适合自己就行,如果这兴趣得天天要弄,不弄就没饭吃了,这会让人倍感压力!我喜欢兴趣偶尔拾起好了.
回复

使用道具 举报

ID:732554 发表于 2020-4-22 19:17 | 显示全部楼层
停更了?
回复

使用道具 举报

ID:624444 发表于 2020-5-5 11:18 | 显示全部楼层
这个好,顶一下
回复

使用道具 举报

ID:735148 发表于 2020-5-27 16:17 | 显示全部楼层
插个眼,等大叔更新
回复

使用道具 举报

ID:743654 发表于 2020-5-28 00:34 | 显示全部楼层
同为80后,现在还在逛论坛
回复

使用道具 举报

ID:763471 发表于 2020-5-28 15:57 | 显示全部楼层
俺是年级大了只能当个爱好了,俺没基础学也费劲
回复

使用道具 举报

ID:782419 发表于 2020-7-12 08:25 | 显示全部楼层
       81年,在学校的时候学PLc和单片机却从来没有见过实物,只有一些简单的概念。毕业时也不知道单片机和PLC是什么样子的。只知道能编制程序。程序?那是做什么的?根本就没有这种概念。语言也只知道一点,估计那种编程语言早就已经淘汰了。汇编也仅仅是知道一点。
       毕业几年后才当的电工,有机会见到曾经的尝过的PLc,是欧姆龙的C40,看外壳已经很老了,不过能见到实物也算不容易了,可能当时的同学还有很多人到现在依然没有见过PLC吧!在学校学的是三菱的,不过大同小异,咱也只会一些基础的编程,什么高速计数,中断完全没有概念。根本没有机会编程,车间的程序也不是没事就让你编的!
       刚开始编程序或者说是修改程序是用手持的编程器的,不过能接触实际的程序就已经很高兴了,后来才知道用电脑也可以编程,需要编程软件!接着就自学相关的编程软件,在网上找相关视频。也学了点东西。
       直到车间进行设备改造,安装电子制动器,制动器坏了后修不好的就被分解了,见到上面的集成电路不知道上面写的是什么,在网上查才知道这是传说中的单片机!说实话,这是我第一次见到单片机,可能大家觉得可笑,学过的东西居然没有见过!不过这是真的,于是把在学校时发的书找出来看一下,唉!那是一脸茫然!真的好难!
       后来在网上找到一些视频看才知道,单片机的编程已经开始用C了,不过对C也没有什么概念。在学校时没有学过,不过视频上说这都不是问题,就看一些视频后觉得还行,就买了开发板,巧的是开发板上的单片机与我在制动器上拆下来的居然是一个型号,长的一模一样。
      也就是因为手上有了实例,学着才有一个大致的方向,看视频,抄程序,然后烦了就好长时间不看,反复了几次,视频大概看了才两遍,已经五六年了,通信以前的内容理解还凑合,到了通信就走的很慢,不过做为兴趣也好,高兴的时候再看看。
      不为别的,只为学校那几年,说实话,学校学的东西除了单片机,PLc、机床编修的基本知识外,其余的已经记不清了!
回复

使用道具 举报

ID:587994 发表于 2020-7-21 22:23 | 显示全部楼层
刚要毕业的我,看到前辈都这么努力,我更要努力点!!
回复

使用道具 举报

ID:807124 发表于 2020-7-23 11:24 | 显示全部楼层
毕业两年,一直在做三菱PLC的程序,电路之类的,打算捡起单片机学一下(虽然已经忘光了)
回复

使用道具 举报

ID:807124 发表于 2020-7-23 11:26 | 显示全部楼层
向前辈看齐,开始学习单片机,有那位大佬可以分享一下进修的过程,比方说单片机,树莓派,linux,PYthon什么的。
回复

使用道具 举报

ID:611988 发表于 2020-7-23 17:16 | 显示全部楼层
有个想法欢迎大家说说可行性:做技术和业务两拨朋友结合起来,可以成事吧
回复

使用道具 举报

ID:810376 发表于 2020-8-1 18:11 | 显示全部楼层
加油 ,新手路上共勉
回复

使用道具 举报

ID:454000 发表于 2020-8-1 19:39 | 显示全部楼层
本人60年,儿孙满堂,爱好电子,爱动手,喜欢新知识新技术,不爱吹牛喝酒玩游戏,整电子己成了人生一大乐趣!
回复

使用道具 举报

ID:808399 发表于 2020-8-7 17:19 | 显示全部楼层
noble64 发表于 2020-4-2 16:37
80后业余学了两年了,花了不少时间。太多地方还是没明白,目前水平入门阶段,简单的都理解了,稍微变换一下 ...

和你一样,简单的能理解学会,深入一点就不会了,网上找了很多资料,大多是观赏性的,一步一步教实操性的不多
回复

使用道具 举报

ID:587620 发表于 2020-10-6 22:07 | 显示全部楼层
您好,同为80后,做了这么多年电子行业,我和您的情况如出一辙,有机会认识一下
回复

使用道具 举报

ID:587620 发表于 2020-10-6 22:09 | 显示全部楼层
同为八零后,我的情况与您如出一辙,希望认识一下
回复

使用道具 举报

ID:57512 发表于 2020-10-22 22:13 | 显示全部楼层
看到老哥们都在努力,我也来参和几句,小弟我93年的,但每每想到奔三了,就抑制不住心中的不舒服。诸葛曰:创业未半,而中道满三十。其实我现在在家接单呢,家里有个没用的三室一厅,所以把客厅摆了一张2米长桌子,用于接单做事。为什么我会这样?细细道来
2016年毕业于二本院校机械设计制造及其自动化,在校表现中规中矩,可能因为对机械的工作环境不向往,所以大学期间一直对C语言和单片机感兴趣,由于学长很好和学校需要发展,有幸浑水摸鱼拿了四五次省级奖。PWM、IIC、显示、按键、遥控、步进、测距、测温啥的都会了,然而,总觉得自己是一桶水不响,半桶水响叮当的感觉。又由于我从小性格容易膨胀,读书时候不按常理出牌,毕业后总想自己能搞点什么。即使我的第一份实习工作是我PK掉300人连升两级,到了公司oppo项目助理位置,我也由于刚毕业的幼稚天不怕地不怕,辞职了。这一操作,导致我流浪祖国大地,首先是离开泉州,然后到了晋江,再然后到了重庆,再然后到了山东,再然后又到重庆,再然后就是今天,在贵州家里(四线城市,我们市里就没有搞研发的,艹)。流浪期间,我要么接单,要么啃老。回到贵州前在重庆某公司呆了近2年,还算有些收获。结婚也是重要原因。好了,现在我是真的慌的一批。第一,我是流浪工程师,技术没有高贵的血统。第二,我家这个城市压根几乎没有搞单片机的。第三,接单一个人搞真的吃不消(最近有个2万项目,计划40天,实际已经快3月)最后,配一张心酸.jpg  大哥们自行体会,呜呜呜 1603375820(1).png

回复

使用道具 举报

ID:58775 发表于 2020-11-14 00:34 | 显示全部楼层
楼主你好,我也是80后,小你两岁,做硬件出身,自学51单片机,自学过程中发现自己的C语言基础很差,C语言也是自学的,基本上是用到哪里学哪里,最近决定把C语言系统的学一遍,目前看的书是C Primer Plus。楼主的代码很规范,抽象能力也很强,真不愧是码农出身。

看楼主的代码我也是一知半解,比如看到楼主用typedef定义了两个为函数指针一个为结构体的新类型,其中结构体里的成员又包含了之前定义的函数指针类型,目前我的水平就是在51里用if,,if else和switch,基本上把51简单的外围跑过一遍问题不大,要是我想达到像楼主一半的水平,那样的抽象能力,编程思维,我应该看什么书?
回复

使用道具 举报

ID:3448 发表于 2020-11-15 18:24 | 显示全部楼层
楼主加油!
回复

使用道具 举报

ID:462827 发表于 2021-1-12 08:12 | 显示全部楼层
哈哈,比我还小几岁,我去年才开始自学51单片机的,因为有C语言基础学起来还是很容易的,现在连51汇编也会了。
回复

使用道具 举报

ID:883031 发表于 2021-2-24 11:01 | 显示全部楼层
P2的寄存器地址是A0,P2=0xA0是对端口赋值,也就是将值0XA0放进了P2(0xa0)这个地址里了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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