粉丝1297获赞9841

好,我们找一个东西啊,找一什么呢?你在这里输 c c 呃, r o l, 然后马上左边会弹出来啊, c r o l c r o l 看杠 c 五幺 library routine routine 是 吧,双击第一个啊,看 这个实现一个什么功能?看啊,这里双击,我们打开之后,它这里写了啊, 这个 c r o l routine rotates the beat pattern for the character c left b v this routing is implemented。 这这这不是说的啥了你,你不知道啥意思呢,直接选上它来复制回来。我们有道翻译 进去,回车这个子程序,将字母 c 的 位模式向左旋转 b 位,此程序作为内连函数使用 啊,这里有几个关键词啊,第一个呢,这是个子程序啊,他是把 c 的 位, c 里面的 位啊,位的模式呢?向左旋转 b 位,实际上他是个叫循环移位,这是个循环移位啊,哎,这就非常方便了啊,此子程序作为内联函数使用,内联函数呢,就是系统自带的,系统会自动自己给你一些函数呀, 不需要你去写这个函数呢,函数已经写好了,就你看,就叫这个函数, 就是杠 c r o l 就 这函数。函数里面有两参数看, on send chart c, on send on chart b, 就 这两参数啊,把 c 循环左移 b 位啊,它给你了,它包含在这个头文件当中, include 在 这个头文件当中,所以我们调用它,我们需要把这个头文件加进来,然后直接调用这函数就可以了啊,在这下面举了个例子啊,这有啊,你看他就写了 叉 a 叉 b, 然后 a 呢是零 x a 五,然后 b 呢是这么写的, b 呢等于把 a 循环左移三位, b 的 值呢?是零 x 二 d。 啥意思啊?我们,我们一画我们就知道了。 你看啊, a 是 零 a, a 是 零 x a 五,那我们先写出来, a 五是啥? a 五是 a 是 多少 幺零幺零五是零幺零幺,对不对啊?哎,就快速写出来,然后他是把 a 循环左移三位之后变成了零 x 二 d, 那 我们先把二 d 写出来呗,二 d 是 零零幺零是吧? d 是 啥? d 是 什么?幺幺零幺吗? c 位加一吗?是吧? c 位加一啊。哎,为啥让你们快速学会这个就有用了啊?你从今天开始你天天都得用啊啊啊。零 s r d 他, 他是把他怎么了个三是吧?把 a 怎么了个三位,他就变成了这个 c r o l 左移 left, 把 c 左移 b 位, b 是 第二个参数,第二个参数这三左移, b 位左移三位左边移,移三个。看啊,移三个,那这三个幺零幺移哪去了啊?那他这三个移出去了,左边这五个就补上来了,这五个是 零零幺零幺,补过来,零零幺零幺是补过来了,补到这了啊,然后这三个到这边来了,他是循环一,就转圈,转圈一,这个一转回来,转转转转, 转到这是最最头上的那个,最头上那个跟到他的屁股后面去,所以他移到这了啊,零,再跟到他的后面,移到这去了,这个一移过来,哎,移到最后面去了。 循环移,懂了吗?这个叫做循环移,我们刚才学的那个左移和右移啊, 不循环移出去就没了,哎,他这个循环呢,就就好多了呀。这个咱们流水灯就非常方便了,你想想,留几个灯,你给他给个出值,你循环移啊,来,我们用这个,这个来实现一个代码啊, 它这里面有好多有用的啊,等等我们用到的时候慢慢给大家讲啊。来,我们怎么用呢?你看啊,第一步呢,我们把这个函数,把函数先复制上呗。 这款啊,把它整个这块直接复制上,复制一下啊,回到我们的代码,回到我们代码呢,我怎么写呢?你看啊, 我每次我循环一位呗,所以我就 p e 啊,等于我就搁这写,搁这改了啊,隔着改,哎,粘贴进来,我把这个, 我这就不是 e a 了,我这个 four 呢,是一个循环,循环八次的一个循环,我只是用来循环的, 我移的时候呢,我得给一个出值,所以呢,我这块重新再定一个变量啊,重新定一个变量呢?我,我把这个数呢给到这个变量, 连续定义变量,直接写个逗号,我再来一个我要移的这个数吧,就叫 r o t, 我 就写 r o t 吧,它出值呢,我等于什么呢? 我还是流水灯,让一个灯亮,我就让最后面的一个灯亮,零 x f e, 最后面那灯亮就是这个数 f 一, 所以这块我写 r o t, 实际上就是把这个值放到这了。循环左移多少呢?每次循环左移一位啊,我连续一八次的循环左移啊, 那这就是我的最低一个灯,开始一次二三四五六,一直一直一直转起来了。 好,我们编一下。编肯定会报错的啊,你看报什么错?你看啊,他肯定不认识这个函数,看到吧, missing function, prototype。 嗯,缺,缺少声明,函数函数的声明啊,没声明。你们,你们现在开始要记录你们的错误了啊,当你们出现一个错误的时候,你把它记到你的那个错误的那个文档里,下次出现错误先去找你有没有遇到过 有的同学同一个错误出现了七八次,他还记不住是哪个错误啊?所以你们,你们要记住啊,就 missing function protocol 缺少函数的声明, 那这是个内联函数,内联函数不需要声明,函数体在哪里都没有,它集成在系统内部,它不给你开放啊,就你只能用,但是你不知道里面是咋写的,它呢?是在这个头文件里面,所以我们直接把这个头文件包含上, 复制上,回来在我这这儿粘贴一下就行了。

家人们玩五幺单片机,绕不开的 p w 脉宽调制,今天我们从原理到代码,从仿真到实物。哦,对哈,我身边没有识破器就不能有实物了,但是依然可以给你讲的明明白白。看完这个视频, 你不仅能懂 p w 的 梦,还能直接上手做 led 调光、电机调速,点赞收藏,新手也能直接抄作业。 今天咱们分六步走,先搞懂 pwm 是 什么,然后再看硬件怎么搭,拆解代码核心逻辑,讲透每个关键模块,最后看仿真和调试,还有拓展玩法,全程干货。 首先,什么是 pwm 呢? pwm 全称脉宽调制,英文全称就是 holdwave modulation, 嗯,说白了,他就是通过改变脉冲占空比来实现数字模拟信号,就是用数字反拨模拟模拟电压, 它有两个核心参数,频率和占空比。频率就是信号,它的这个更新的频率占空比就是高电频它的一个所在,一个周期内所占的这个比例 好,嗯, pwm 在 我们的身边啊,很广,到处都有它的影子,比如手机调亮度、 led 呼吸灯、电动车调速、无人机舵机全靠它。 那么我要单片机怎么实现呢?咱们用的这个 at 八九 c 五二单片机,没有这个硬件 pwm, 我 们可以用定时器中断来进行模拟, 用定时器零切换这个 i u 口电瓶定时器一来刷新数码管的显示,就可以实现这个 p w m 这个信号的一个模拟啊,它是一个很也是感觉很有意义的一个案例啊。 好,这个就是就是在一个周期内,高电瓶和低电瓶的一个视频期间,我们可以做一个引入,我们只需要在一个周期内,对吧?翻转用一个状态两周一个翻转,高电瓶持续完之后,那么剩下的时间就是低电瓶啊,这是一个一个思路, 在硬件我们用的这个单,这是我们单面积的这个时钟,还有就是它的引脚定义, 我们用 p 二零作为这个 pwm 信号输出来,然后输入呢,就是用这个外部中断 p 三二作为一个信号输入, 然后数码管来进行一个显示,定时器零以及定时器一来这个分别用来控制高低电瓶持续时间,还有这个显示的这个刷新时间。 好,下面我们来看到这个 produce 原理图里面这个 a t 八九 c 沃尔就是我们单闭界的这边最小系统和这个 receive 就是 接的是复位键的, 然后红色框框标选出来的这个 p 二零就是这个信号输出,我们用这个 led 灯做一个信号输出,并且我们来接一个试播器来监测这个 pwm 这个脉冲信号是否符合我们的预期。 然后 p 三二作为这个外部输入信号输入,我接到这个外部中断,外部中断零,这里当我们每次按键按下的时候,他这个 嗯占空比都会发生改变,然后这个蜂鸣器模块就是我们最开始待会要用来作为一个案例引入的一个讲解。好,下面我们来看一下这个这个代码的这个总架构。 首先我们在这个 c 四腾看飞过里面来对数据类型进行一些重定义,然后这个电器中断的触使化有一个接口封装,然后这是数码管显示的一个驱动。好,在主函数里面, 我们就要对这个中断服务函数进行一个设置好它的一个核心执行流程。首先我们对电器,电器呃中断那些进行一个设置好它的一个核心执行流程。首先我们对电器触发出中断,就打开电视机, 然后 i o 口,根据我们这个 p w m 这个信号的频率,对吧?在一个周期内的这个时间来切换电瓶,然后电信一就来设置一个时间来刷新数码管的显示啊。主循环就是一个空转, 因为我们没有大多数功能都是在这个呃电器和终端里面实现的,这空转的话也可以可以拓展很多功能。 好,下面我们通过这个蜂鸣器的一个这个案例来引入, 好在这个引入按钮里面我们要实现的功能就是按键之后有蜂鸣器会发生叮咚的声音一直持续,然后当我们再次按下的时候,这个声音就会停止, 然后这是蜂鸣器的这个一个接口,用示波器我们来检测它的这个高低电频持续的时间。然后我们先开始啊,开始开始,我们现在把这个示波器这个调出来 设置一下,然后当我们按键之后蜂鸣它就会 好,这个声音非常尖锐啊,可以看到这个高低电频持续的时间基本上是一致的,这里我们可以加一个光标。 好在这个案例里面可以看到他这个两种频率的声音,分别就对应的这个高低电频,在蜂鸣器里面,因为我们是这样设置的,下面我们来看一下这个代码, 好在代码里面这个前面就是我们定期出中断的出手话,然后这是分别对应着两种频率的声音, 结合前面我们音单片机做音乐盒的这个案例,我们可以知道,嗯,每一种频率它其实对应的就是嗯共鸣器它翻转这个时长, 那么对于如果说对于这个五百毫五百赫兹这个频率,那么就是 蜂鸣器在一定以一定的频率嗯电瓶做一个翻转,对吧?那么七百赫兹,他以以七百赫兹这个时间里面时间作为做新这个翻转,然后就会得到这个七百赫兹对应的这个声音, 对吧?然后这样我们实验思路就比较简单了,因为每个我们把它的持续时间都设为一个固定值, 我们以二百五十微微秒作为一个初始初始值计数计时,当达到五百毫秒的时候,对吧?我们对它的状态变量,状态这个 变量作为一个翻转,那么初始状态是零,那么它就会执行,对吧?执行这一段, 执行这一段代码,对吧?执行这一段代码每每一次每一次溢出都会使它加加,然后翻转,然后单 在放鞭器这个代码里面,嗯,前面是这个触使话,触使话还有一些定义值,我们知道 这个声音它是由不同频率这个信号来产生的,不停的翻转,那么对于丁这个声音,那么它的频率就是五百赫兹,也就是说我们要在五百赫兹对应的时间内 来对蜂鸣器这个电瓶做一个翻转,就得到他就会产生这样一个叮的声音,好,那么对于七百赫兹也是一样的, 这两个赫兹他对应的都是嗯这两种状态,对于状态一我们就执行,我们就让他产生丁这样的声音,对于状态零,我们就将产生咚的这个声音,对吧? 好,那么 好,在蜂鸣器嗯,发生叮咚声音的这个段代码里面我们做一个讲解。嗯,我们先做一个前提回顾,声音是由嗯,不同频率的震动来产生的,对吧? 首先是这个震动来产生声音,然后再是,嗯,这个声音要持续多长时间?这是两个时长,这在前面的单片机音乐盒里面我没有提到过。 好,对于丁这样的声音就是五百赫兹,咚就是声音是七百赫兹,也就是说我们要在五百赫兹对应的时间里面来翻转蜂鸣器的这个电瓶, 就可以实现这个五百赫兹对应的声音,那么在案例代代码里面就是这样实现的,对吧? 好,我们这是在,这是在这个时,这是蜂鸣器翻转,那么时间是如何控制控制的呢?我们定义这个五二百五十微秒,这个,呃,定时器用来计时,当他达到这个预计的时间之后啊, 我们就进行一个翻转,然后就可以产生这个声音,那么对于几百赫兹的声音是一样的, 那么这两种声音就对应着两种状态,我们就可以考虑设置一个状态变量来控制他发出的是丁和东的一个声音。 好,那么这个状态呢?我们就可以用一个时间来控制,每五百毫秒就 就那个调整一次声音的这个发发声的这个,嗯,状态,对吧?每五百毫秒我们进行一次中断,然后来翻转这个,嗯,丁和东的这个声音,然后 在五百毫秒内,对吧?他就会产生这个特定的这个声音频率, 好,那么这就是这个蜂鸣器,他这个发生叮咚声音的这个嗯,案例讲引入,那么对应到这个蜂嗯 pwm 呢?那么其实就是对于状态一的时候,我们让高电频, 对吧?那么这里就是产生,就是设置为高电频,那么这里来控制高电频它的一个时间,对吧?然后这里就是低,剩下的时间就是低电频要持续的时间, 好,我们来到 p w m 这个代码里面,可以看到这个里这个核心代码和刚刚的几乎是如出一辙,唯一就是改变的就是 p w m 这个持续时间, 这持续时间我们只需要在他这个状态里面对这个持续时间进行更新,那么高电频 这是对于高电频,这是他的一个计算公式,公式大家可以根据自己的这个时间进行一个推算。 核心就是我们用这个用频率,对吧?一千就是换,换成毫秒除以这个,他的这个频率就得到了每一秒,每一毫秒要翻转多少次?我们以一百微秒做一个这个定时的话,那么再乘以十, 他的单位就是一百,每一百微秒,对吧?他会翻转多少次?然后乘乘以占空比,再出一百 就得到了高电频的持续性,那么剩下的时间就低电频,当他处于嗯这个状态变的状态变的时候,那么就会执行这段代码, 对吧?一直给他高低电频,然后当这个持续时间完之后,他就会进入中断,然后更改这个状态变量, 好,这里就是我们这个刷新显示,定期一来刷新显示,然后外部中断,通过这个按键来控制他这个占空比这个动态调整 以二十的一个不长作为调整。好,那么本次案例分享就到此结束了。

咱们今天来看一个 c 五一点六 t 的发动机报了一个涡轮增压调节故障,你们看看是哪的问题, 也是一个一点六 t 发动机典型的故障,而且在修理店也经过两到三次的检修,目前没有卖太好的解决方案。那咱们来看看故障码和如何解决。 首先这个东西这个故障出来了,一会咱们再看故障提示啊,需要检查的这颗管子是不是掉了,然后再往下看我手指的这颗管子是不是掉了, 然后再看看进气管有没有松脱,这 这个管卡子怎么不对呢?哎,你看找着这找着找着就发现了问题啊,这个应该是拆节气门的时候没拧 剩下的,再读一下故障,看看他其他的问题还有哪些。 公里数十一万 故障我已经读完了,这是典型的涡轮增压呃,电磁阀故障,在节气门后边的那个东西,咱们看看所有的参数,电磁阀不公 证明跟刚才断开的那个,呃,刚才松脱的那个卡子没有关系。 不看不知道啊,进气道有严重的漏油现象,而且这个车现在有轻微的烧机油,一起爱三千公里一升,我们现在怀疑是进气道和气门屎盖损坏了造成的机油消耗,并不是因为发动机的问题引起的。 涡轮电磁阀现在就是我用灯看直了这个位置,把它拆出来一换就完了。这个故障就是一个涡轮电磁阀损坏, 查一下备件是哪一个,我已经提前找完了,涡轮电磁阀十五这个东 就这玩意坏了, 那我看看背景号,九八三零二一零五八零, 换上就完了。很简单,两个管啊,三个管,一个插头,这玩意也好换啊。东西也找出来了,故障点确定了,现在用风扇正在吹, 给发动机做冷却,以为 c 五的元宝量比较大,不容易下手,一会吹凉了就换上,预计五分钟了,下一集更新怎么换呀?经验告诉我,有可能电磁阀没坏, 上次维修时这根管没接,咱们小了,故障接上试一下,车 好多故障,必须得反复上去,确定好了是哪的事啊,不能盲目,咱们就换,发现了这些问题,都把它排除掉了,如果没有问题了还报故障,再换变革阀。如果说排除了故障, 就是那个拐坏废弃、循环出了问题,咱们现在去试试,车清完故障了,咱们试一刹车看看怎么样, 有种感觉啊,这个故障电磁阀没坏,从刚才找车,我踩油门。


然后最后倒计时规定是会一直 nice, 呃,现在我来展示一下我们这个 c 四炸弹代码的功能。 呃,首先输入一个七位的数字是它的密码,那么我先输一个错误的试一下,然后按确认键,它会自动清空,嗯,再输入正确的, 然后我还有一个做了一个消除,比如按这个键,然后输入错,你如果输错了,然后你可以清空重新输,那么输一下正确的炸弹密码,然后确认。开始三十秒的倒计时, 然后前二十秒蜂鸣器是一秒响一次,等十秒以内,三到十秒是零点五秒响一次,然后三秒之内是零点二秒响一次, 然后这个 led 的 闪烁周期和蜂鸣器是同周期的。 然后最后倒计时规定是会一直持续响, ok, 然后下一步我们展示一下四个独立按键的功能,那么输入正确的密码。首先 k 一 键长按三秒是,呃拆除炸弹, ok, 然后数码管就不显示了,然后 k 二键和 k 三键都是加速引爆,然后它们实现的方式不一样, k 二键是 直接加速倒计时,比如说按一下它倒计时就会加快,嗯,比如说我再按一下它会更快。 ok, 然后 k 三是直接把这个倒计时时间减半,如果按一下减半,然后再按一下, 嗯,然后最后一个 k 四, k 四的功能就是直接引爆,嗯,按一下 k 四直接归零引爆,然后这就是我们所有的功能。

哈喽,大家好,我是雨妮,欢迎来到咱们今天的分享啊,我知道在现在的这个时间段啊,尤其是对于即将毕业的同学们来说, 就业是当下的一个最大的焦虑对不对?尤其是在什么互联网行业缩招的这种大环境之下,很多人他会感觉到迷茫啊,那么今天啊,我就想跟大家去聊一个哎,稳中求进的一个方向啊,也是切入式, 其实我干休是干了很多年了,有的时候总是感觉自己还是那个刚毕业的大学生啊,总是带着一腔热血,和那种哎不撞南墙心不死那种态度进入到这行业行业内的啊, 告诉自己一定要在这个行业要混出个名堂,随着时间的一个推移,也是随着自己经验的一个积累啊,日夜也会相应的提升,我自己也确实是在这行站稳了脚跟, 但是你说让我看着一批又一批大学生门头往里去冲,说实话,我真的是有点于心不忍,因为我自己当年是这么过来的,说实话吃了不少亏啊,也踩了很多坑, 所以说我还是想着能够去出一点点微薄之力去帮一下即将步入社会的金融,是大学生们啊,也是帮一下当年自己嘛。啊, 最近这段时间他不是毕业季嘛,所以找我问就业的同学也是比较多的,都说什么现在大环境不好对吧,互联网校招,书招, 哎,考研考公挤破头,不知道自己该选什么方向了,那甚至还有很多已经选了青物色方向的同学,他越学越慌啊,他说什么啊,我 c 语言看过了,单片机点过灯了, leix 也装过了,感觉怎么还是找不到工作?到底要学到什么样的程度才能拿到 offer? 这都是抛给我的问题, ok? 那 么为什么说当下切勿士啊?呃,是最近少有的稳中求进的方向啊?那么咱们来一步步去解析它。其实在现在的就业环境里面,切勿士真的是少有的既不卷又有那种长期成长空间的方向。 我看了一下今年最新的行业数据啊,在二五年,切勿士岗位的需求它是增长了百分之三十七左右, 头部企业的校操规模也扩大了百分之二十五。但是你反过去看一些 java 呀,前端呀这些通用开发岗位,他的招聘量相比下来,他是下滑了百分之二十三。那更关键的是什么呢?就是整个行业的人才缺口,他达到了百分之四十六点七, 这就说什么,哎,两个岗位里面他就有一个招不到合适的人。哎,为什么会这样呢?一方面啊,他是风口的一个推动啊,像是什么新能源汽车 联网、工业自动化、 ai 边缘计算,对吧?现在这些最火的领域,它的核心其实都是千兆式,哎,再看什么?再去看比亚迪的电池管理系统对吧?大疆的飞控,海康的工业视觉 背后全部是千兆式,工程师是在撑着的啊,尤其是现在又在说什么这个国产代替加速,对吧?那个 r s c 杠五的生态也做起来了,大量的这种国产芯片,对吧?智能硬件公司,它都在抢着 那么这波红利啊。呃,我们可以去推算,至少是可以吃十年左右的。那么另一方面啊,就是千五市这行的壁垒, 他确定了,他不会是像那种纯互联网行业那样啊,一阵风过去了,他就去裁员啊,那种裁员潮就来了, 咱们是什么?这七要素是它是软硬结合的对吧?你积累的调试经验,对于硬件的稳定性理解,踩过的那些坑啊,这些你都是没有办法去速成的,它不像是纯软件,你新人培训个三个月你就能去上手了,对吧? 介入式的经验他是什么?他是越老越吃香的,他不会存在什么所谓的什么三十五岁危机啊,像是我身边啊,四十多岁人在一线写代码的介入式工程师一抓一大把啊。所以说你看,不是说介入式他没机会,而是说很多同学他没找对方法, 像是什么学的太攒呐,明明有这么多岗位在那里啊,你却不够看啊。介入式他不需要你很全能,但是他的核心模块是必须要有强度这个东西的。 很多同学他最大的问题就是什么,就是什么都学了一点,但是他什么都不深啊, c 语言看过,单面击点过,灯, leux 装过,环境 r d y s 也听过几个概念,结果一到面试啊,面试官往细节里面一问,他答不稳,你知道吧?啊, 其实我跟所有的应届生我都说过,千物事岗位他并不要求你毕业前你什么都会,但是你的核心模块一定要有强度,你不能只是建立在一个了解过的这个程度之上, 你可以有短板,但你不能每一块都是停留在我只知道有这个东西的这个层次上 啊。那么我们把它来详细去猜一下,像是最开始对吧?你的根子在哪里?在 c 语言啊。 c 语言是什么?它是你吃饭的工具啊,它不再是基础课了。你别跟我说什么你 c 语言考试考了九十分就是你的 c 语言,它是要用来去写稳定的工业级代码的,它不是用来做一些课后题的,对吧? 那么就意味着你至少要把纸真、数组、结构体、函数、纸真红定义、未操作内存管理这些内容你得去吃透。那 面试官问你,纸真他不是想听你去定义啊,是想看你能不能去写出那种稳定的不会崩的代码。哎,像是自复创处理啊,链表啊,状态机啊这些基础代码,你最好是能够去手写出来, 这是你写任何清务式程序的一个基本功。还有像是那种高频的那种关键字和问题啊, static const 啊, warlight 啊,结构体对齐, 大小端,内存越界也只针对这些东西。你不能只停留在会背概念,而是说你得知道它们在清务式场景里它为什么重要,比如说 warlight, 对 吧?那你必须得去讲清楚啊,它为什么常用于计算变量和多任务共享变量?哎,它不会出现什么样的问题, 这些它不再是一个单纯的八股文了,是你真正每天写代码的时候你要去用到的东西。其次啊,就是单片机, 单片机你别只停留在库函数去点灯。我见过很多的简历啊,写着什么精通 s t m 三二,结果一问 g p i o 之外的一些外设,它只会说我用库函数调过,哎, 说实话,只会撂库函数点灯,那叫会用开发版,它不叫会单片机。两者的概念是不一样的,区别也是很大的, 像是 g p i o 串口 s p i f c 定时器中断啊, p w m a d c, 那 么这些外设它是什么?它是单面击方向的基本盘,对吧?你并不需要去把所有的寄存器全部都背下来,但是你必须得知道每个外设它能够去解决什么样的问题,最基本的配置流程是什么, 对吧?最常见的坑在哪里?就比如说是窗口通信,对吧?你至少得去知道波特率啊,数据库这些参数吧,你还能你还得去了解到,哎,它的这个收发中断和 dma 的 一个区别 对不对?什么时候用 dma 能够去解决丢包问题对不对?还有什么?还有像是 iphone c e s b i 呀,对吧?你要能够去讲清楚时序啊,通信时序, 为什么 iphone 四要上拉电阻,对吧?为什么?定时器要懂输入补货输出比较,哎,还有什么中断要知道什么?要知道它的优先级怎么去配,零件区怎么去保护,对不对? 单片机是否学到位的一个标志。它不是说你能够去跑通官方给的那些历程,而是说你能够根据你自己的需求去把这些外设去组合起来,哎,去做成一个稳定的功能。 比如说啊,你用 a d c 采出去,用 d m a 传啊,用创口发出去,这个流程你都得去自己去搭出来,如果说出了问题,那么你可以第一时间去定位到到底是哪一步错了, ok? 那 么接下来什么就是操作系统啊, 千万不要把这个 r t o s 只当做一个简历上的加分项。 r t o s 是 我见过硬件生踩坑踩得最多的一个地方,很多同学觉得我学了 for r t o s 对 吧?简历上多写一行我就能去加分啊,结果呢?你面试官一问,你瞬间露馅, 你要是写的 for r 六 s, 那 你就不能只知道,比如说像什么呃, x take create 或者是这个啊, we take delete 这两个函数对吧?一个任务创建啊,一个任务删除嘛,对不对?那么还有什么呢?像是任务调度,优先级时间片啊,任务切换状态,临界区,信号量,护士所,消息队列,事件组,哎, 软件定时器,内存管理这些核心机制你也必须得是去理解的啊。更加重要的是什么?是你得能说出他们的使用场景,比如说啊,什么时候用信号量,什么时候用消息队列,对吧? 固执所和二值信号量他有什么样的区别?哎,为什么会出现优先级反转?怎么去用优先级继承解决? 或者什么多任务访问啊?一个外设的时候你怎么保护资源不被破坏对不对?还有什么像是这个 r t y s 的 强度对不对?从来不是说你备了多少的 a p i, 而是说你能不能用它把一个完整的 复杂的系统去拆成几个职责清晰的任务,哎,让任务之间的通信去清除,资源访问安全,实时可控,这才是你去使用 r t o s。 的 一个意义啊。其不是说你为了在简历上去多写那么一行,那其次是什么? linux, 先去把你的应用层先去打捞,你不要一上来就给我吹什么 linux 驱动,那很多同学学学 linux, 一 上来就奔着驱动开发去的,简历上面直接写精通 linux 驱动开发,那 结果面试官一问,连最基本的进程现成你都搞不清楚?其实对于硬件生来说啊,对于硬件毕业生来说, leinux 首先就是把应用层的基础先去打牢,这才是你吃饭的家伙。比如说你这些常用的质量, web 啊, g c c 啊, g d b 啊, make a few 啊, show 脚本啊,对不对?这些是基本功,你要做到熟练去使用,那然后再去搞什么?再去搞什么文件, i o, 进程,线程, 信号量管道,哎,这个消息队列,共享内存, socket, select po, 对 不对?这些都是面试的高频考点, 那么你至少得去做到在 linux 环境之下去独立编辑运行,调试一个程序啊,能够去知道源码到可执行文件,它这中间到底都经历了些什么东西? 驱动这部分不需要去吹的太大,如果说你没有去做过实际的驱动项目,你千万不要去乱写,至少得去懂一些字母。设备驱动的基本框架,像是设备号 啊, fill up, action 啊, read, write, open 这些接口吧,对不对?像是应用层和内核层,它是怎么去交互的?你得有一个基本概念其实就够了啊,你不懂的东西,你千万不要去往简历上去写,面试官他一追问你答不上来,这反而会给你去减分,哎。其次是什么? 其次是项目,这是决定你最后能不能去拿 offer 的, 而是你能不能去讲透你自己做的事情的技术。你学的再好,你没有项目的支撑,面试官他也不知道你会不会用。 毕业前你至少要准备两个能讲透的项目,一个是偏单面机的,另外一个你可以是偏 r t o s 或者说是 leix 的 这个项目呢?不怕小,他是真的不怕他项目过小,像是什么温湿度采集,像是这个环境监测,像是智能门锁、多任务数据采集、 socket 文件传输,简单的字幕设备驱动实验,其实这些你都可以往上去写,但是你必须得把它们去讲明白。 你要能说清楚这个项目的整体架构是什么,模块是怎么划分的,模块之间用什么通信关, 关键的技术点是什么?你遇到过什么问题,你怎么去解决的?面试官他最关心的,他不是说你用了什么高级的模块,而是说你这些东西是不是真正的调过、错过、改过,就说是我吧。 我面试的时候我最喜欢问的就是你的这个项目里面最难的部分是什么?你踩过什么坑啊?这时候很多同学他都蒙了,说没什么坑啊,一次就跑通了,那我一看我就知道,对吧?这个项目你要么是抄的,要么你就是跟着教程去做的,你自己没有去考虑过你的这个项目,你没有自己动过脑子 对不对?其次最后一点什么,就是你能不能去把这个技术讲明白,那也就是我们的表达,对吧?这个玩意他决定了,面试官他信不信你的这个问题啊?很多同学他忽略了, 金融是面试,不是说你只看你会不会做,还要看你能不能把它讲明白。比如说一个技术点,你不能只说我会,你要能从 是什么讲到为什么,再讲到我在项目里面怎么去用的,就比如说问你串口,那你不能只说串口通信啊,我用过,那你要能去讲我是怎么去配置波特率和椒盐味的,那接收的时候我用的是中段还是 dma, 为什么要用 d m a 啊?之前有没有遇到过丢包的问题,怎么去定位,怎么去解决的啊?再比如说问你一些 r t o s 消息队列,你不能只是说啊,用来做任务间通信的。你要能讲我项目里为什么用队列,为什么不用全区变量 啊?队列里怎么帮我解决了多任务同步问题?你要得把这些东西能够去讲明白,面试官才会真正的觉得,哦,这个人是真的做过,是真的懂他不是背的八股文, ok? 技术表达稳了,那么你的 offer 啊,其实就已经稳了一半了。最后啊,也是给应届生的一些小建议啊。说了这么多,总结起来它就是一句话,毕业前你想拿青木斯 offer, 就 不需要把自己去包装成那种 全能工程师,你去把 c 语言、单片机、 r u s linux 对 吧?向表达这几块核心的内容你去打扎实, 你可以有短板,比如说你做单片接方向的 linux 驱动,不懂没关系啊,哎,你说 linux 方向的,那么你 stm 三二的外侧不熟悉其实也没关系,但是你选的方向里的核心内容,你不能只停留在了解的这个层次上。 金融社这行,他看中的,他永永远不是你收藏了多少资料,你看过多少的教程,而是说你能不能把代码去写出来,把外设去调通,把系统去跑稳,把项目去讲清楚。我这几年也整理过一套比较适合应届生入门和冲刺的学习路线, 你们把 c 语言的高频考点单面及外侧梳理 for 阿拉斯核心知识 linux 应用开发的基础我都整理好了,还有一些常见的面试题和项目追问点。 刚开始准备的同学,我真的不建议你去到处找那种零散的资料啊,只能说是越找越乱。先去按照我这条路线,把主干先搭起来,再去结合面试题,查漏补缺,效率会高很多。 需要的同学可以在下面,也就是咱们的评论区留下,需要拿去对照着补。重点从来不是你的资料到底有多厚,而是说你能不能把里面的知识点去真实的吃透,去写出来,去讲明白啊。 毕业前这段时间啊,去把方向先去选对,再去把强度拉满, ok? 那 么陷入式的 offer, 它真的没有你想的那么远啊。我是宇宁啊。那么咱们下期再见喽,拜拜!

嗨,大家好,我是云一,欢迎来到云一课堂。今天我给大家分享的是单片机 c 五幺语言的特殊功能继承器及未变量的定义。首先我们来看一下特殊功能继承器的 c 五幺定义。 c 五幺议员允许通过使用关键字 sf r sb 的。 我直接引用烟仪器提供的投文件来对特殊功能寄存器 s 矮花进行访问。 我们先来看第一种方法,使用关键字来定义特殊功能寄存器,他的格式是这样子的,首先是关键字 sfr, 接下来是特殊功能寄存器的名字,我们一般使用的是大。 然后等于接下来写的是特殊功能寄存器在片内 ram 八零 h 到 ffh 之间的地址。举个例子来看一下 s f r, 那表明接下来我们要进行特殊功能计算器的定义, i e 是特殊功能寄存器的名字等于,然后是它在片内 rem 高一百二十八字节当中的地址零 x a 八,那这个 a 呢?大写小写都可以,后边是分号。 那再看一个例子,我们来定义 tcon, 用 sfr, tcon 等于接来 地址零 x 八八零 x 表示的是在 c 五幺语言当中十六进制 还可以建议其他的特殊功能计算器。第二种方法是通过头文件来访问特殊功能计算器 各种衍生型的八零五幺单面机,他的特殊功能寄存器的数量和种类是不相同的。对特殊功能寄存器的访问可以通过头文件来进行。 那为了用户处理的方便, c 五幺呢?把八零五幺或者是八零五二单面机常用的特殊功能寄存器和其中的可寻指位进行了定义,将 将这些定义呢放在了一个头文件里边,这个头文件的名称是 r e g 五幺点 h, 那如果是八零五二单片机是 r e g 五二点 h 当中, 那我们需要用到投文件当中定义的特殊功能计算器,只需要在使用之前用一条预处理命令就可以了,那我们用的是这个包含 井号英格鲁的,然后是 r e g 五幺点 h, 那这个用这个符号把它包起来, 那这样就把头文件包含到了程序当中,在程序里边就可以使用特殊功能寄存器的名和其中的可寻指位的名称了, 当然我们也可以自己来对头文件进行增减。 接下来我们看一个例子,头文件它的引用举例, 首先我们是通过一个音库路的包含指令,将五幺单面机的寄存器投文件包含进来,然后是主函数,那接下来我们看在主函数当中,我们用到了一些特殊功能寄存器, t l 零 t h 零,那我们就可以直接使用了,对它可以进行直接复职,而 t r 零在二 e g 五幺点 h 当中也进行了定义,因此我们是可以啊 直接使用的。需要注意的是,在二一 g 五幺点 h 这个投文件当中,对 p, 比如说 p 零点零,对 p 零点零呢,他没有进行一个 定义,因此我们在使用的时候,我们得需要用 sbit 对 p 零点零呢,我们再进行一个定义,那我们可以用这个来表示,那后边是 p 零,那这个位置是这样, 那我们就需要知道在投文件当中,哪些量是进行的定义,哪些未是没有进行定义的,接下来我们看一下特殊功能寄存器当中的未定义。对特殊功能寄存器的可寻止未的访问, 要使用关键字来定义一些可寻指的位,一共有三种方法,对于 at 八九 s 五幺单片机来说,他一共有二十六个特殊功能计算器, 其中有十一个是可以进行未寻指的,那么能够进行未寻指的就可以通过我们接下来介绍这种方法 对其位进行访问。那第一种方法也是我们使用最多的一种方法,关键字 st beat, 然后是为名,接下来是一个等号,然后特殊功能寄存器的名称 位置,那我们这个位置用了这样一个,这个符号就是在键盘上数字六上面那个符号,那我们来看一下。 我们首先来定义一个特殊功能寄存器, sfr psw, 接下来是他的地址,零 x d 零,那这个 d 呢?可以大写也可以小写。 接下来我们定义这其中的一位,用 sbt 来表示,然后是 cy, 那 cy 是 psw 当中的最高位,那最低位是零,最高位就是七,因此我们可以写成 psw, 然后是一个 加号,然后是七,后边有一个分号,不要忘了这是第一种方法,那我们看一下。第二种方法是用 sbeat, 然后是为名,接下来是字节地址, 我们用四节地址来代替了特殊功能寄存器的名称,那我们知道 psw, 他的四节地址是零 xd 零,那我们直接换成零 xd 零就可以了。 第三种方法用的是斯比特位名,然后是位地址,由于每一个可寻指的位都给他分配了位地址,那我们也可以直接这样来写,斯比特 c y, 然后零 x 第七,那我们这样来定义的时候,你就需要知道他的 胃地址是多少,那一般呢,这个胃地址也不太容易记,所以我们最常用的还是啊第一种方法,使用特殊功能寄存器的名称,然后加他的位置来表示,那接下来我们看 看一个举例,这里边呢需要说明一下,在头文件 r e g 五幺点 h 当中,没有对 p 零到 p 二寄存器当中的未单元进行死必特的定义,因此我们在使用的时候得需要先进行定义 t 三口,由于每一位都具有第二功能, t 三口,每一位都具有第二功能。在计算器头文件当中对第二功能的位进行了定义,那我们使用的时候是可以直接来使用的,我们来看第一个用的是头文件井号 英可路的,然后是把头文件包含进来。接下来我们对 p 一点零进行了一个定义,用的是 sb 的,因为这是特殊功能寄存器的位, 那这个名称,接下来这个名称 p 一杠零是我们用户自己起的,他等于谁呢?他就等于 p 一的第零位,也就是我们说的 p 点零。然后是主函数,那接下来 在主函数当中我们是怎么来操作的?那这里边需要特别注意的是, sbit 来定义的这一位,他一定是全局变量,也就是写在所有函数的前边,如果你把这条写在了主函数里边,那我们在编意的时候,他就会提示你有错误。 那接下来我们看一下这边这个例子是对 at 八九 s 五幺单面机片内批依靠 口的各寻指位进行了一个定义,那我们首先呢用 sfr 对 p 一进行一个定义,这里边没有使用头文件, 那 p 一的地址是零 x 九零。然后接下来用 sb 特殊功能寄存器的未定义,然后分别写出来就可以了。定义的时候呢,我们需要用分号来结束。好了,那今天的内容我们就分享到这,再见。


大家好,这节我们以这个单片机控制 led 灯这个彩灯闪烁为例来讲解一下用 c 五幺这种程序来编写这个艳色函数, 就是各种的控制设备指示当中,经常需要对指示灯进行闪烁控制,或者让这个动作机构按设定的时间重复动作。 那么我们这一节就以这个 led 灯,因为这个比较简单啊,我们也好控制,但是,嗯,也好呃, 直观显示啊,我们就以这个 led 灯为控制对象,用单片机来实现对 led 灯的彩灯按照这个 一照赫兹的这个频率闪烁,即让 led 灯重复点亮零点五秒,熄灭零点五秒,或者是然后是点亮零点五秒,再熄灭零点五秒,就这样的呢循环下去。这个任务呢说是很简单,但是实际上呢,这就涉及到这个 这个单片机开发当中的这个用戏缘语言,这个这个编写一个小的这个控制软件 控制程序,这个程序呢其实就是我们上集也讲过了,就是这个延时控制电路,就是机器计算机的这个我们是用的这个机器叫延时函数, 还有机器周期和指令周期这东西我们要了解,这也体现出了这个单片 机都有的这个这个震荡电路就是精震。上节我们讲了他的基本的这个概念,就是机器机器指令和这个机器周期和这个指令周期啊, 要完成这个任务呢,实际上也说简单,但是实际上如果对初学者来说,我们还是要通过这来了解一下这个单片机这个工作的一个原理, 根据这个控制要求呢,就是要在这个单片机的硬件电路中,我们要能保证 led 灯的点亮和熄灭,点亮和熄灭的上一个任务我们已经提过了,就是单片机控制这个 led 灯的话,我们用的是低电瓶控制,这样 反而更有更有,这个更合理,前面已经讲过这个不重复了, 在这节我们是要关键是要上一节呢,只要是把单片的是输入零,通过循环语就是一直让他死循环,他就可以一直点亮他,但这是要让他闪烁, 就要使单片机控制 led 按一赫兹的频率闪烁,这个我们就要需要了解这需要让什么样。单片机的引脚是要重复的,执行就是输出高电瓶后等待零点五秒,再输出低电瓶后再等待零点零点五秒, 所以说这里边就有一个等待延时的问题,换句话说,我们用 c 五幺这个程序结构就是要 编一个这个子函数,要调用这个子函数,这个子函数其实就是要延时函数, 所以我们首先这要讲这个延时函数,我们要先了解一下,从这节讲一下这个 k 五幺啊, c 五幺这种程序的一般结构, c 五幺函数的定义和调用啊,这里是函数, c 五幺程序的函数是 c 五幺程序的基本模块,通过对函数 模块的调用来实现特定的功能,这也是 c 五幺,也是 c 语言,也是这样的一个特点啊,用户可以把自己这个算法编成一个个相对独立的函数模块,然后 调用的方法来使用函数,因为任何一个 c 五幺都有它一个主函数,主函数可以调用这个其他的函数,就是大家注意在其中一个函数的定义当中,不可能重复使用定义两个函数, 这是 c 语言所不允许的。但是 c 这个主函数可以调用各个子函数, 可以说 c 五幺的程序全部工作都是由各式各样的函数完成, 这里边还有叫库函数,库函数就是有些算法或有些这个程序应用的。这个程序啊,它是由这个 c 五幺本身这个带自带的,你可以直接调用它。 在我们初学者呢,有些函数我们肯定要练习一下,自己去编写一些子函数,然后来对它进行调用。 由于采用了这个函数模块的结构, c 五幺这个语言易于实现结构化程序设计,使程序的层次结构 清洗,这样也便于程序的编写、阅读和调试啊,这又犯毛病了。 这里网络上一个就是与标准系语言相比, 以标准的细五元与细元相同,就 k 五幺的程序是由一个或多个函数构成,其中至少有包含一个闷函数,就是主函数。 程序的结构呢,一般是这样,预处理命令,这个前面我们讲过了,用于这个包含头文件全局变量的说明,就是对全局变量可被本程用的所有的函数调用,就是本程序的所有的函数所引用。 功能函数说明就是说明自定义的函数可以以便调用,那就是加的是主函数,然后这是一个大括号,再加这 一个大括号,然后这里边就是有局部变量说明,然后是执行语句函数调用,这是在魅函数当中的一个特点,就这样一个基本结构啊,说明一下,就是说 这个函数啊,一个是函数的定义,函数定义的一般格式,这个里写的不是太全啊,一般的形式是函数要给他一个函数,先定义函数类型,我们看这有没有啊, 其实这就是一个,我们这就是一个指函数,先拿这个看啊,这就是一个指函数,我看他这里给的这是调用头文件,其实这里边函数的这这个是给这个 led 灯的这个指定管角啊,指定这个,第一个就我们这个,这个它是指定 指定义 led 单边机的引角为 p 二口的 p 点二点零这个端口,这是定义管角啊,这个其实就是一个它的一个子函数,我们这里转的主要是这个是子函数,是这个就是说延时函数, 电子函数。我们从这里看就是函数的定义,一般具有下面的格式,首先是函数的类型, y 的就是函数的类型,下来是给函数起的名 delay numbers, 这就是厌食的意思啊,厌食。然后后面是有形式参数表,第一个他给的是, 这里就给了形式跨个括号,这里边给的是形式参数,是 n, n, 它的是用的这个是 int, 是指是整数型, 整数型啊,定义是整数型,就是型山为 n v, 无符号整型,它的范围是零到六万五千五百三十五, 这就是一个对一个函数来说,首先要给函数的这个类型做出说明, 就是这个类型,函数类型就说明了什么呢?说明函数返回值的类型,这个里面其实 why 呢?你写了 why 呢?实际上就是他不需要喊反位置了,空代表空正常。还有这个 返回 retain, 后面这个语句儿要加 retain, 加返回值,返回表达式,然后下面是函数名,函数名下来就形式参数, 如果是函数没有返回值,这类型定位就 wide v o i d。 函数的返回值就是函数体中的 retain 语句中的表达式的值。 retain 语句 一般放在函数的最后的位置,用于终止函数的资金,并控制程序返回调用该函数所处的位置。 第二,函数名是用户为自己所定义的函数取的名字,以便调用时函数时使用。函数的命名必须符合标志符所定义的规定,我们前面讲过。 第三,就关于这个定义。函数的定义里边还要注意什么,就是形式参数,这个形式参数表就这里这个括号里 用于列出主调函数与被调函数之间进行数,这个数据传递的这个形式参数,每个参数都必须有类型说明, 如果没有形式参数,则该处为 wide, 也可以省略, 但小括号这个小括号是不能省的,就这后面这个小括号形成,它是不能省略的。第四,函数内部的定义。函数内部定义的这个变量默认为范围仅在就是内部这个函数的内部当中定义的这个变量啊,它 定的变量仅在这个函数的内部有效,且每次进入函数时会自动分配,要保留变量, 每次进入这个函数时都会自动分配,要保留变量的值,则需要采用 stick, stick 的这个说明。 第五,函数体是由一系列的,这个函数体是由一系列的。这里边提到函数体就是执行语句,它是由一系一系列的 c 五幺语句构成。在 c 五幺中,所有可执行的语句必须放在函数体内, 这就是函数的定义啊。第二,我们讲一下函数的调用,函数调用的一般形式就是函数名 加实参列表,其实这个就是我们看旁边这个,这个就是主函数啊,主函数这里边调用直接就是很简单,就是在这里函数名加这里面的主参数, 很简单啊,对于有参数的函数调用,若时餐列表包含多个时产,则每个在各个时产之间要用逗号隔开,这我们就有一个时产,就是五百 就不用了,若十三数要多,要直接用动号隔开。第二,按照函数调用在主函数中出现的位置,这个函数调呢方式有以下三种,一个是函数语句,就是被调用的函数作为主调 掉函数的一个语句,其实这个词的从某讲,这个调用也是他的一个语句啊,这个调用的函数就是他的一个语句,这是属于一种形式函数语句。第二个是函数表达式,就是函数被放在一个表达式中,你调用我这个函数,只是在主函数当中,我这个例子不是啊,咱这个作为这个例子是作为 这个 led 闪烁控制这个延时函数的,说他控制只是单灯,也是比较简单,所以他没有表达式。有的情况下就是我们调用这个函数,他只是放在一个表达式当中,就是以一个运算对象的方式出现,这时被调用的函数要求 带有返回语句,以返回一个明确的数值,参加表达式的运算。还有一种就是函数参数, 就是被调用的函数作为另一个函数的参数,应该指出的是在 c 五幺中所有的函数的定义,包括主函数就是 mean 在内 都是平行的,也就是说在一个函数的函数体内,在一个函数的函数体内啊, 不能再定义另一个函数,即不能欠套定义。但是函数之间是允许相互调用, 也允许欠套调用。习惯上把调用者称为主调函数,函数还可以自己调用自己,也称为地规调用。命函数是主 函数,它可以调用其他函数,而不允许其他函数调用。因此 c 五幺程序的执行总是从魅函数开始,完成对其他函数调用后,再返回到魅函数,最后由魅函数结束整个程序。 一个七五幺程序必须也只有只能有一个主函数命好, 下面我们就看一下这个要编写的,这个以 led 单控制,单控一个 led 灯闪烁啊。这个燕子函数的编写, 这个电路肯定很简单,就是一个单片机,我们以一个端口,我们已经定义了,就是 p 二零的一个端口来控制这个,以低 电瓶来控制这个低电瓶,点亮这个就是我们编写这是个简单正常复杂的程序,也是这样,就是你先有一个算法,或者是这就是一个闪烁 led 灯的这个程序流程对应的这个程序代码什么意思?他是用一个程序流程流程图, 这个是我们写程序代码或者是设计算法的时候,一个 数表格数字化,这个怎么说?图形化,这个表达把我们的思路更清晰,实际上这是开始。然后是以首先这个成语是定义最低电瓶来点亮 led, 对应的就是这个,这个是用一个循环语句,一, 这就是只要是一,他就一直循环啊,循环下面一直在用什么呢? led 是零电瓶点亮, 然后等待零点五秒, led 灯再点亮,这个时候对应的是调用的是那个延时函数,就是零点五秒 led 灯再亮, 然后是输出高电瓶 led 将它灭点够零点五秒之后这个就灭灭,制完之后再调用这个,再等待零点五秒, 然后再循环到上面,如果说还是一,那就一直这么循环,是这样一个形式, 也就是说这个任务分析是什么意思?就是指示灯的闪烁,就是不断的让他指示灯重复点亮,然后是厌食熄灭,然后再厌食,这一过程 自动的点亮或熄灭,通过让这个单片机这个引角输出零或一来实现。嗯,延时在单片机中是通过不断执行指令来实现时间的消耗,学员们,我们讲过了这个单片这个 机器,这个叫机器程序,机器周期和这个指令周期,包括我们前面指到了这个延时 是用这种方式来实行的,在这个本业务当中,也就是这些消耗时间的指令,不需要再修改其他任何变量的值,也不需要修改任何端口输出状态, 所以采用不断的执行,就是空循环、空操作等方式来实现。在边 写了有参数的延时函数后,可以调用延时函数给出的不同的参数值,让延时函数实现不同的延时,本任务仅需要延时零点五秒,所以说我们就是这么执行的。 下面我们看一下这个语句,这个就是一个子函数,我们设定的一个子函数,这是这个色函数,一个头文件,一个是包含头文件声明这个端口等特殊功能的计算器。 这 a t 八九 s 五幺 h s b i t speed, 这个是定义端口,这个定义端口输出端口是 p 二口的 p 二点零端,然后定义了一个 行参 n 位无符号的整形,然后这个杠就表示这个大块,表示这个函数体的开始,然后下面这个语句就是定义局部变量 i 和 k, 然后用的是循环语句 why, 就如果 n 不为零,则直行一毫秒延时,并将 n 减一, n 为零时,则结束。循环, 这是一个循环语,然后这个是循环的 n n 的这个循环体的开始,然后用了一个 for 语句,就是这个 for 是循 i 等于二,什么意思?要循环两次, 每次执行零点五秒的验时,循环更耗,共耗时是一毫秒,这个雨值要他执行第一个 循环 k 等于二百五二百五十次,就是循环二百五十次正好,他的耗时呢?就是两微秒乘以二百五正好等于零点五毫秒, 然后下面是这个表示什么呢? i 的循环体结束,就是 i 的这个表示 i 的循环体为空,什么也不做,仅执行循环的耗时, 因为 k 等于二百五十,从这二百五十开始执行,就是 k 大于零,只要这个条件 k 大于零,它就 k 一次往下减,减到最后变成了 k 小等于零或 k 小,这个就这个循环体这样就结束,这样就是这一个循环体就达到了一个二百五十八,那就是两位秒乘二百五十零点五毫秒, 然后是 i 循环题,到这个是 i 循环题结束,这个表示这每一个括号都对应的,对应的这个是 n 循环题的结束,最后到这是函数结束,这个括号表函数结束,这是一个子函数,也就是燕子函数的编写, 然后这个是这个最终执行,还要有个主函数,主函数定义的就是,这就是定义,主函数是主函数,每个系统就必须要有主函数。这个 man 的这个表示 man 的主函数的开始,然后这个 y 等于一,表示的是死循环,它表示什么意思呢?让单片你在这里不断的执行,然后这个 y 等于 这个,这个就是从开始外循环体的开始。 led 等于零,输入零,这就表示十 p 二点零,输出端为低电频,就是点亮 led 灯。 第二个语句就是调用,这个就属于这种语句函数调是以语句形式调用我们前面编的这个得类 number, 这个这个函数,这个子函数,他这时差参数就是为五百,这五百个循环的, 然后下面执行这个执行完之后就调完,这个就是执行 l, e, d 等于一, l 等于一,就是 p 二点零输出高电瓶, led 灯不亮,然后主函数再执行,再调用这个函数,这个延时函数延时五百毫秒, 然后这个是 why, why 的这个循环语句结束,到后面最后是 men 循环语句结束,这就是我们这个以控制 led 灯不停地闪烁,以这个 零点五毫秒,其实就这一毫秒在不停的这种闪烁,停止闪烁这样一个过程。好,今天就讲到这里。

粉丝说学校只教五幺单面机,他大三才自学的 tm 三二,感觉有点难,我的评论说,你基本上是废了啊,信誓太闭塞了。 那么关于这个话题,我们今天聊一聊,就是说很多同学呢,学校连三二单面机都不教,而且他学了五幺之后,觉得三二好难呀,都放弃了。其实三二其实挺简单,不用学五幺单面机,你忘掉五幺单面机那东西是非常简单的,是吧? 那么最大的问题是什么呢?你有了五幺弹片寄存器,你放在脑里,你怎么想? stm 三二这种开发了,你更不要说嵌式 linux 这种很顶层的开发了,是不是你就根本学不会了, 是吧?但是第一第二呢?为什么我说它基本上废了,信息带闭塞了?因为它即使大三才学 stm 三二,它不知道你要学电机控制器这个电子、半导体、通信、医疗、 bms, 你 要学这些方向, 你的薪资才会比较高,你就照着 tm 三二学吧,你即使学会了,他也是个牛马岗位。所以呢,大家一定要 我们看一看这个上面,你要照着这个高薪的岗位来学。为什么说他信息比较闭塞,是因为他到现在呢,还不知道这些方向,那只能说什么呢? 他后面即使学,他也学不到 s t n 电机控制这种高新岗位方向,比如这个高新岗位方向,他要学习 ma, lab, c, m l 和仿真,这东西他怎么接触到呢? 基本上废掉了。好吧,所以大家要学呢,不仅要看播放量最高的内容,你还要针对于高新岗位学习,是吧?比如说汽车电子,他要求什么,你就好好学 b m s 的 核心专业要求能力要求是什么呢?你也好好学,比如说 soc, soc 啊, made up simlink 看总线对吧? uds 仿真,这也是重点啊。好,那么那我们做一个结论,基本上这个同学基本上废掉了,大四毕业很难找到好工作,信息太闭塞了。好,谢谢大家。

大家好,我们在这一小节里呢,介绍一下键盘输入接口电路及键盘 c 五幺,用 c 五幺这个语言进行编程。首先呢对键盘的工作原理进行下学习, 然后对键盘的工作方式了解键盘的工作方式,最后键盘的接口啊,接口链路及 save 样编程。 我们先看一下键盘的工作原理,键盘是由若干个按键,这个按键开关组成,这个键的多少根据单片机应用系统的用途而定。 键盘是由许多键组成,每个键相当于一个机械开关触点,当键按下的时候触点闭合,当键松开的时候触点断开, 单片机接收到按键的触点,接收到这按键,按键的触点信号后,会做相应的功能处理。 这个键盘我们大家见的比较多啊,任何一个现在的仪器表啊,上面,比如袭击 啊,电视机,他都有一个,就是像遥控器上他都有按键啊,每一个按键是每一个功能啊,那我们今天所讲 那个你先得了解这个按键的工作原理。键盘的结构呢,一般有两大类,一类呢叫做独立式按键,另一类呢叫做矩阵式按键。 我们看这个图,这个图呢,这个一二三四,这是四个按键和单片机的 c 五幺的 p 一口的第四位, p 点零, p 点一, p 点二, p 点三连接啊,就按键一和 p 点零连接, 按键二和 p 点一连接,按键三和 p 点二连接,按键四和 p 点三连接,这种连接的方法我们把它叫 做独立式按键,还有一种叫矩阵式,像我们看这个,那这个呢是四行啊,四行 x 零 x 一, s 二, s 三,这个叫做行,还有列 啊,四列外零、外一、外二、外三,这个四行四列构成的这种情况呢,我们把叫做矩阵式案件 键盘的特点,如果是机械啊,像我们按的那个按键,机械是由于他触点的这个特性呢,一般的情况下,你按一下按键以后呢,他抖有有这个抖动啊,抖动,一般的抖 抖动的时间是五到十毫秒,那么我们要保证这个按键是准确的按,所以说按键稳定闭合时间的长短 就是我按下这个键啊,保证这个键是准,就是准确的呢。按下来这个按键,他这个按键的时间的长短,一般是在零点几秒到几秒的这个时间,也就是说稳定的闭合时间是这个时间, 那 cpu 要确定一次按键的动作啊,他不是重复的,但也不能遗漏,那就必须得消除抖动的影响,就是说我们在进行键处理的时候,一定要一个去抖的这个,这个就是 是按键得去除抖动啊。去除抖动,那这就是抖动的问题,就是我按你看这个是就看这图,我按下键以后,我释就释放了,这时候有一个稳定的闭合期 啊,看这图,这是稳定的闭合器,但是在你按键的这个稳定闭合器的前面 还有一个抖动,那我们把这个抖动叫前沿抖动,而在稳定闭合区的后边啊,你释放稳定了以后,后边也有一个抖动,那这个抖动呢?我们叫做后沿抖动。 因此在计算机处理这这情况的时候,键盘的时候一定要消除抖动啊。那么消除抖动的方法呢?有分为两种, 一种是软件销售方法,另外一种呢是硬件销售方法,软件销售方法比较简单啊,就是编一段延时程序啊,然后编延时程序的时候, 呃,一般的这个延时程序约二十毫秒啊,就是用软件像素抖动。首先调用一段延时程序,这个延时程序延时一般是二十毫秒啊。 然后呢,再判断这个按键的电瓶是否应保持在闭合的状态啊, 如果是,那这个就是确认有键按下,如果不是,那就是没有键按下啊,所以说这是软件通过延时的方法去除键抖动。我们在编程 的时候,基本上是用的软件啊延迟的方法去除键抖动也有硬件的方法,这是硬件的方法。硬件的方法呢,是采用一个 r s 触发器, 用这个 r s 触发器来去除抖动啊,这个就是在这还有有弹有弹跳的,然后通过这个 r s 触发器啊,让他确实 剪出来一个这个无弹跳的这个波形,这是用硬件来去抖动,那我们在呃,我们在进行处理的时候,基本上是用软件去除抖动啊。 键盘的工作方式键盘的工作方式呢?第一种就是用程序 扫描这种方式程序扫描这种方式呢,就是键盘扫描,此程序一般具有以下功能,第一步,先判断键盘上有无有没有键按下。 第二步就是去除键的抖动啊,通过延时程序去键抖动。第三步, 确定确实有键按下啊,扫描键盘得到按下键的键号就求键值,因为我们一个键盘你不可能是一个键啊, 如果你是四乘四这个的情况,那就是十六个键啊。然后第四步,判断闭合键是否按下,这是通过 啊程序扫描方式来进行,还有一种方式呢,就是中断扫描方式,这个中断扫描方式呢,我们看这个图, 按键直接与单片机,这里头看,我们这个 p 点零, p 一点一, p 一点二, p 一点三,这四个是航线啊,这四个是航线,然后 p 一点 四,皮点五,皮点六,皮点七,这四条线接的是键盘的裂线,也就是说按键直接与单片机的这个 p 口相连, 然后这这样有没有键按下,我们看这这个点皮点零的一点皮点一,皮点二,这有 几个点?那这个是通过货门,这个货门通过现货的这个电路啊,连接到外部中断 mt 一,这个呢是以中断的方式来判断是否有键按下, 如果有键按下,这上头啊,任一个有键按下,这时候就触发了这个中断啊, 触发了中断以后,在这个中断服务程序中对你按下的这个键进行识别啊。 好,我们看一下单个按键开关啊,单个按键这个按 按键,这个开关,他的输信号啊,键按下以后,这个稳定期。前面这个我们刚才已经说了,是一个前沿的抖动,后边这个是一个后沿的抖动,抖动啊, 那么编程的时候呢?开始啊,程序开始输入键状态,然后问有键按下吗?如果没有就 结束了,如果有键按下,延时去抖动啊,消抖动,然后再输入键的状态,还问有键按下吗?没有,那就结束了。如果有键按下,进行键处理,这个 进行键处理呢,就是要确定键值啊,然后再输入键的状态啊,看这个,这个键抬起了吗?啊,如果抬起了, 没有抬起,接着输入这键状态,如果抬起了,那就消延时啊,消除键抖动结束,那这就是按键的这个程序编程序的步骤, 下面看一个例子,这个例子呢,是一个按钮开关在这了啊, s e 的按钮开关,这个开关接的是 n t 零,那就是外部中断零啊,然后编程实现,我这个 s e 这个开关按下了 啊,那就使得这个劈口劈点零,劈点一,劈点二、劈点三、劈点四,劈点五,劈点六,劈点七,这劈口接了八个灯啊,接了八个灯,就是这个。第一个例子就是我这个按键一按下以后,我让这八个灯, 四个灯一组啊,就是四个灯一组一组亮,一组灭啊,那我们就可以知道,以前我们在讲过那个呃口啊,就是这个, 这个其实也是口的操作啊,那这四个灯呢?我们这个按键,你看这是接地的,当他为接地了以后,这是低电瓶以后,这给的这 p 零口, p 口就给他零, f 或者是 f 零都 行啊,反正是他四个灯一组亮,一组灭啊。如果是零,正好是,这是接的 vcc, 如果正好这个对于这个灯来说,这边皮点,比如说这个第七个这个灯 啊,这个最高,这个灯亮的话,那你这个要这边给的是零,他就亮,你要给的一,他就灭啊,那这就是知道这个道理,所以我们看一下编程, 编程呢,我们理解了那个那个刚才的那原理,知道了啊,这前头这四条指令呢,其实是初始花先得把这个 i g 五幺的这个头文件包含进来,这里头定义了一个这个, 呃,这个字符型啊,无符号的字符型啊,然后定义的这个 u i n t u i n t 定义的它是一个整形啊,定义的是一个整形。 那么看这个程序啊,下面这是个延时程序啊,延时程序呢?嗯,他的这个行餐 uint 啊,然后后边这个是给的一个定时时间啊,后边这个给的是定时时间,然后这是个在前头已经定义他是整形了, t 一 t 二,这是整形, 整形呢,然后我们看一下他定义的这两个 t 一 t 二,一,开始负循环 语句否,循环语句呢?给的是这个是初始条件,是零,然后 t 一小于这个给的这个定时时间,那么 t 加加啊,他就定时,比如说你定时十秒,那这个 t 小于十秒的时候,他这个这个 t 就加加,那就是定时吧,定时时间到他就结束了啊,这是 第一个 fore 句,第二个是第二个 t r 啊, t r 是 初始条件,是零,然后 t 二小于幺幺零,然后 t 二加加,这也是给的一个,这就是一个定时时间啊,定时时间,这也是一个循环语句啊,循环语句,好,下面我们看一下主函数 啊, m a i n, 这是组函数,组函数以后,我们刚才看那个图,我们知道了,这个,把这个零零零幺幺幺啊,这个送到这个 p 口, 我们看零零零,就是 p 点零, p 点一, p 点二, p 点三,这四位是零零零,那零零零,那就是这四位限量啊, 一一一就是,呃,批点四,批点五,批点六,批点七,那这四位是幺幺的话,他就灭的啊,他这四组第低四位,这个啊,先亮高,四位先灭啊, 好,我们知道这个了啊,这个把这个零零零幺幺幺,就是零 f 所 送到 p 口,然后这是个 vivo 循环语句,他就等待,因为你这个是中断吗?啊,呃,就是这个 sbit。 这哈这定义的是 p 三点二,就是安 t 零那个啊 s 一 啊,为幺的时候啊, s 一为为幺的时候,然后如果他为零啊,如果他为零 特别零的时候,就是这个调用的是定时时间啊,调用的是定时时间,那定时时间给的多少?正好就正好给的是 xm, 给的是十啊,给的是十。他调用的延时,就执行这个 啊延时程序,延时时间到了以后再判一下啊,是不是确切的啊?再判一下是不是确切的 他那个呃闭合了,所以说又调了一调,用了一次延时间啊,延时间,确切的是闭合了啊,呃,下面这个就是,呃, 已经亮完一次了啊,亮完一次了,那就把这个 p e 上面有一个这个符号的表示取反,那这样表示取反了以后呢?就是这个零零零四个零啊,零零零 幺幺幺,这零 f 就取反了啊, 这个啊骑反了,骑反以后就是他的一组灯,灯亮这个闪烁嘛,然后 后啊取反以后又变成这个高思维灭啊,低思维量啊,取反了,取反以后,如果这个还是按下了,又按下了这个,呃,这个 s 一 v 零,就是这个,那个 p 三点二啊 n t 零,按下以后,那再调用这个延时啊,调用延时,这个延时给的这个时间是十啊,是十。 所以说这就是我们刚才那个题目的要求啊,让这个以中断的方式啊,以中断的方式叫这个皮口接了八个灯,叫这八个灯四个一组,然后他是,嗯, 不同的时间在闪亮啊,不同的是在闪烁。这是我们讲的这个题啊, 接口还是刚才那个图啊?现在呢?第二第二个题是要求开始是所有的灯都亮啊,所有的灯都亮,然后按一下 se, 就是有那个中端 灯变为五百毫秒的闪烁,按一次是五百毫秒闪烁,如果再按一次就变为全亮啊,变为全亮。 那我们分析一下啊,这个呢,就相当于那个 it 零啊,那 s 那个按键是一个控制开关,这个用这个控制开关控制的这 这个灯的亮啊,全亮和灭的闪烁。这个要求和刚才那个例子不一样,不一样在哪呢?我们在解决这个问题的时候,要定义一个未单元啊,定一个未单元, 如果按键每动作一次啊,让这个位啊,让这个位单元取反, 那该单元就这位单元位,单元就有一个零,有个幺的状态,如果他是零的状态的时候, 灯全亮啊,如果这个未单元是一的时候,那灯闪烁啊,这个就让这个未单元控制这个灯全亮啊,未单 单元为一的时候啊,这个灯闪烁啊。好,那我们看一下编程怎么进行, 我们看上面这个啊, include i e g 五幺点儿头,这是头文件,然后 define u c h r, 就把这个 u c h r 定义的是这个无符号的这个字符形,然后定了一个 u i n t, 这个定义的是,呃,无符号的整形。在这里定义了一个 v 啊,就是 si se, 这是那个开关,这定义定义了一个 v, 这个 v 就是 p 三 二,就是安体零那个那个角。那除了这个以后呢,还定义的一个位啊,定义了一个位,这个位呢是 k e y, 也就是说这个位为零的时候啊, 就是定义了一个 v 啊,存储案件的动作啊,刚才我们说了, 那么下面这一块程序呢,就是延时程序,我们大家都已经会了啊,刚才那道题已经已经跟这是一样的啊,这是一个延时程序 啊,在下面这个程序啊,这个呢,就是这个键检索啊,键检索,那这个键检索呢?就是这个定义这个位啊,这个位 在这里头,呃, s 一 s 一是那个 s, 一是那个氨 t 零啊,氨 t 零 为幺啊,如果 s t 零是零,这时候就调研右键按一下啊,延时啊,如果 s s 一啊为零,然后再延时啊,这个呢?然后键取反,那这就是闪烁 啊,闪烁。然后呢?在 will 看这个 s 一等于零的情况下啊,是零情况下,这是在这闪烁。好,下面我们看这个组程序 主程序,这个呢,就是,呃, 把这个全亮,这个是啊,这个零 x 零零送到 p 口,这个是全亮啊, 看组程序啊,一开始是,呃零 x 零零送到这个 p 口啊,送到 p 口,那零 x 这零零呢?它就是把这个零送到这个呃 p 口,那我们刚才看那个图, 我们看这个图,这个图,这是 p 口啊,零零零零八个零 送到这个 p e 口,那就让这个所有的灯,因为这还是高电瓶,它是低电瓶的时候,这灯才亮,所以是零零送 p e 口,就是让这八个灯全亮, 然后这 will 循环语句,这个一就是说等待那个呃 万中的零,安提零,等待他按下,如果有键按下了以后,然后调用这个键检索啊,调用刚才这黄的这个程序,调那前检索以后呢?看这个键是零 啊,就是设这个,这号设一个键啊,这号 bit, 这号设一个这个按键,那这号键如果是零的话,就把这个零让他全亮啊,这是调这个这个程序全亮,否则的话 啊,否则的话,那就是这个键就不是零,是幺是幺的情况下呢?调上这 di xms 延时程序啊,调上这个延时程序 就掉上面这个绿的这个啊,延时程序,延时程序这里给的这是啊,延时时间给了五百啊,五百,然后在这个 p 一取返,再送到 p 一, p 取返送到 p 一,那这个呢就是闪烁啊, 他设了一个按键,这键是零的时候,全亮,是一的时候,那就是闪烁啊,那这个呢,就是我们啊,键盘的啊中就是这个键盘的这个第二个例子啊, 好在这一小节里呢,我们呃把键盘输入接口的电路啊,键盘的工作原理啊,键盘的工作方式 和键盘的简单的接口啊,这这个接口光介绍了这个皮啊,皮口接那个,呃, 咱们这个例子比较简单啊,广式啊,介绍了是用一个氨 t 零啊,不要氨 t 零,通过皮衣口 啊来,呃, i n t 零啊,就是中断的方式, i n t 零,通过一 p 口接的这个,呃, led 显示,呃,然后呢这个 c 五幺进行一个编程啊,那我们呃这一讲的内容就到这儿。

新建文件家用于放置工程,打开 tl, 新建工程,存储工程到新建的文件家, 选择芯片类型为 c 五幺类,选择芯片为 at 八九。 c 五二。新建主函数并保存在工程目录下, 在主函数内写入程序, 点击魔法棒,选择 outpot, 勾选 hacks 文件一栏,升成 编译程序 x 文件。打开单片机程序下载, 再选择刚生成的 x 文件下载程序。
