在 qc 五幺中流传着这样一种错误的函数写法,就是函数的行参列表写成类似变量声明的形式。这种写法屡见不鲜,在一些历程和网络视频中都能看到他们的身影。这并非想象中的简洁写法,而是利用了老式变音器。不指定类型则默认为 inter 型的特性。 对于小于等于 int 的类型来说,这通常不会造成什么问题,因为 int 型可以很好地表示他们只是可能会浪费一点空间。这也是这种写法可以流传的原因,看起来没问题,运行起来也对。 然而结果正确,只是在有限的条件下,对于大于 inter 的整形或浮点型问题就暴露出来了。我们一葫芦画瓢写一个浪板和 float 版来看看结果。遗憾的是, c 五幺对于这样错误的写法,连个警告都没有。如果这样用了而结果不对,就会浪费一定的时间去调试排错得不 不尝试 c 语言的函数有两种形式,旧风格的函数形式为型参列表,只包含参数名,在参数列表和函数题之间声明参数的类型。 如果参数为 int 型,则声明可以省略旧风格函数是标准化前使用的形式,存在一定缺陷,不应该在新代码中使用变异器,仅为兼容旧代码而支持这种写法。另一种形式就是目前标准所规定的形式,型餐列表中的每一个参数都必须标明数据类型, 而这种既非旧式风格也不是标准形式的函数无法考证其出处。除了 c 五幺支持这种写法外,几乎再也找不到支持这种写法的变异器,所以你会继续支持这种写法吗?
粉丝342获赞1640



机甲大师玩家直接狂喜手搓无接触触发射击机构全靠五幺摊面机精准控场,按下按键的瞬间,机械转动与代码逻辑完美呼 应,科技感直接拉满。这不仅是即刻专属的浪漫,更是你硬核硬件编程实力的最佳证明。千万别误以为五幺单片机是过时的老古董,他仍是理解嵌入式系统底层逻辑的最佳入口,更是低成本落地创意的绝佳平台 新概念。五幺单片机 c 语言教程,正是帮你打通硬件编程的秘钥,它绝非一本枯燥的计算机手册,而是彻底重塑单片机学习路径的实战宝典。以项目驱动加原理深挖的双螺旋结构,带你从零基础新手快速蜕变未能落地创意的硬件创口。 从点亮第一盏 led 的 基础操作,到亲手打造高精度时钟的进阶实战,有趣的项目贯穿学习全程,每一行代码都能直接落地实操。书中讲解定时器补或信号中断响应关键时间,从电路设计的细节考量,到代码调试的闭坑技巧 完整呈现,从想法到实物的全流程,让你知其然更知其所以然。无论你是电子、自动化、互联网等相关专业的学生,是学完基础电路与 c 远古想动手做出实物的技术爱好者, 备战智能车、机器人等赛事的竞赛选手,还是想从应用层转向底层开发的软件工程师,这本书都能精准匹配你的需求,成为你成长路上的得力伙伴。

主播是初学者,正在跟着江邪学习单片机,学习到定时器控制 led 灯的时候出现了大大的疑问,如视频所见,我感觉主播的代码逻辑非常的正确,但是为什么 led 灯亮的时候是四个一起亮的?抖音上的天才学者老师们能不能帮忙解答一下?

大家好,五幺单片机的出纸是怎么计算呢?如何计算它的出纸啊?假设我们用这个 g 一 点七口输出一个 p w 信号,然后频率是一千赫兹,占空比是百分之四十,让它点亮一颗 led 灯,用定时器零工作方式二来实现。 那么怎么做呢?用定时器,凡是用到定时器的话都要设一个初值吧,是不是 上个视频我们已经讲了这个呃周期和频率之间的关系是怎么算的?就这个公式, 周期等于频率的倒数,现在频率已经知道了,一千赫兹,我们直接带进去算一下啊,一千赫兹 啊,这里这里这个时间,这个单位是秒啊,秒,一千赫兹一二三个零,他的倒数,倒数就是 单位是秒啊,这个周期啊等于 t 单位是秒,把它化成这个为秒,后面乘以六个零嘛?是不是六个零,那就三个零抵消,是不是变成一千了? 一千为秒, 一千赫频率一千赫兹,然后我们这个呃周期就是一千为秒,一千为秒。这个怎么怎么分配呢? 哦,它这个 pwm 线的话,就是利用这个定时器中断中断的实现,然后这个让这个呃 io 口进行一个高低电频变化。那首先我们可以这样分配,一千赫兹一千微秒,让它两百微秒, 中断一次就溢出嘛,中断一次啊,中断一次, 然后五次是不是等于一千微秒?五,两百乘以五五次, 五次之后就是百分百占五秒。对,然后我们现在继续要算,呃,两百微秒溢出, 两百微秒溢出怎么算?他的出子,出子, 出子。我们用工作方式二,这个,这个有个优点,就是不需要去那个,每次都要付这个出子,中断溢出子就要付出子,用工作方式二的话呢,就不上每不需要每次都付出子,他会自动付出子的 工作方式的。是八位的,高八位啊,低低八位,低八位是呃 t t 就 定时器嘛, t l 零,它这个是装这个呃柱子用这个用来存储那个计时的, 然后高八位呢? d h 零是传出这个出子,它会自动传出在高八位,然后每次中单一出,它会自动赋给这个 d 八位。 八位的话就是二的八字方,二的八字方等于多少?是不是?二五六 二五六, 然后我们要两百微秒一除。 如果我们的金正是这个十二兆的话,那他的机器周期呢?就是一微秒,就是 啊,每计数一次用一微秒的时间。但是我们我们这个板子上面这个金正不是十二兆的,他是十一点零五九二兆,那么他的接收机就是一点零 八五零六九,比比一百一百秒大,那这个时候就不是二五六减两百了,那就是怎么算呢?那就是两百 除以一点零八五零六九等于多少呢?我们算一下,计算器,算一下, 算一下。嗯,两百除以两百除以一点零八五零六九等于 一百八十四,四舍五入,这个点三又不用不要了。一百八十四,一百八十四, 那么就是二五六减去一百八十四等于多少?算一下啊,二五六八位二进制就是二五六,二五六减去 幺八四等于七十二,这个是实进制啊,实进制 十进字写的有点多,十进字要把它转化成十六进字。 十六进字等于多少?有个快速的方法,就是用电脑自带的这个, 这个计算器上面有一个可以切换成这个程序员的这个计算方式,我们看一下啊,就这里我看一下, 看一下,现在是标准模式啊,把它切换成这个程序员模式。程序员我们刚才说的是多少啊? 七十二对不对?十进七,七十二,七十二,从上往下这个 x, 这个十六进字, 这个十进字,这个八进字,这二进字从上往下,这是递减的。十六,十八二,这个十进字,我们直接输入十进字,输入七十二, 七十二等于十,那么十六乘以,这就是四十八,对不对?四十八, 四十八, 最终我们得到的结果呢?就是,呃, t l 零等于四十八,这个是初值。 t h 零,这也是四十八, 就这么来的啊,初值就是这么来的,最终的结果是这个 频率已知,然后带入这个公式,带入这个公式得到我们的这个时间周期。 这里的话呢,当你用用这个一百微秒一除也行,一百微秒的话就是中断十次,十乘以一百等于一千也是一千,这个可以由自己分配,这个没有固定的,只要最终结果是一千微秒就可以了。 初值的话就这么计算的啊,就是我们要想多少秒一出先写出来,然后呢?然后呢?除以这个十一兆金证一点零八五零六九 等于这个,呃,就是溢出的那个值,然后二五六减去它得到这个数字是初值,这个初值是十进字,把它转换十六进字就是十八,最终就得到这个结果,就是这么来的, 就这么来的。最后我们可以验证一下我们这个对不对啊?其实我们说完这个,这个对不对?验证一下 验证。怎么验证呢?就是打开这个单片机,五幺单片机的烧录工具,打开这个烧录工具, 这里有个数值计算这个工具啊?定时器,看没有定时器,计算器, 十一点零五九二兆定子器零啊,工作方式是八位,八位自动成装,这里十二分频, 我刚才说是多少为秒,两百为秒,这里输入两百为秒,看看对不对?两百为秒生成代码对不对?那我们跟我们算的结果对不对? 低八位高八位,都是四十八,我们算出来的是不是?我们算出来这个结果是对的,就是这么来的,出纸就是这么来的计算的。

这节课我们来看一下使用函数的三要素和执行顺序。首先看一下函数的一般格式, 先了解一下函数名,就是给函数起一个名字,函数名的命名规则和变量名是一样的,都是 a、 b、 c。 下划线,一二三,也就是大小写字母和下划线可以开头,数字要放在后面, 这个函数的剩余部分都是和函数体有关的。那么什么是函数体?这里的语句一二三四、五就是函数体,也就是把实现某个功能的语句放在一起,我们叫做函数体。 所以说函数主要是用于实现功能的模块化,那么实现这个功能,如果需要外面的一些数据,就通过参数列表传进来, 同样实现这个功能,如果产生一些新的数据,就通过返回值类型告知新数据是一个什么样的类型。 我们再来举一个例子,说明什么是参数列表,什么是返回值类型。比如这里有几个函数函数名,分别是 weu, sum 和函数 e, 每一个函数都有它的参数列表和返回值类型。 we 一, 它的参数是 an、 s、 n、 l。 类型 sum, 它有两个参数,一个是 int a, 一个是 int b。 那 么我们想一下什么是参数列表? 参数列表就是你在函数内实现某一个功能,但是这个功能需要外面的一些数据,这个时候你就想把外面的数据传送到函数内部来使用,怎么传送呢?那么中间你需要定义一些变量, 定义这些变量来接收外面的数据,然后在函数内部来使用这个变量,就达到了将外部的数据传到函数内的目的。只是这个变量,我们将它定义在一个括号内,所以给他起了一个新的名字,叫做参数。 同样执行完函数,如果产生一些新的数据,也定一个类型,来告知要返回的数据是一个什么样的类型。 这个类型放在函数名的前面,所以说我们叫它返回值类型,比如这里的 some, 它的返回值类型是 int 类型的。 那有人说你这里的 void, void 它是什么意思呢? void 它英文是空的意思,就是没有的意思。 那么返回值类型空,参数列表空,也就是参数列表是空的,就没有什么数据需要传递到函数内部。返回值类型空,也就是函数内部也没有数据需要传出。 这节课我们主要了解的函数就是没有返回值类型和没有参数列表的函数。有返回值类型和有参数列表的函数我们后面再讲,现在理论介绍完了,我们来看一下我们熟悉的 main 函数, 这是一个 main 函数,也就是我们程序的入口,从这里开始执行。我们写的第一个程序,第一条语句就是将零复制给 a, 接着是 a 加加,那么 a 的 值就是一,接着是调用函数一, 接着是 a 加加,然后来到循环语句,哇,有一,它的判断条件是一,那么永远是真的,就一直在这里循环。 我们主要看一下函数的执行顺序,这是一个 main 函数,它正常是从上往下执行的,中间调用了一个函数一,那么如何调用这个函数一呢? 首先函数名会记住这个函数的地址,就是函数存储位置的一个地址,那么通过函数名就可以找到这个函数,然后执行这个函数。 执行完函数是不是要返回接着执行 main 下面的语句,如何返回呢?我们简单的理解一下, 也就是准备执行函数之前,会记录这个函数所在 main 当中的位置,准确的说是这个函数的下一条语句所在的位置。因为执行完这个函数之后,回来肯定是接着执行函数的下面一条语句。 简单来说就是准备执行函数之前,就会把这个函数的返回地址存储起来, 就好像你放学回家第二天又回到学校,那么你事先肯定会记住学校这个地址,这里也是事先就记录好了一个返回地址,那么执行完函数之后,就会回到事先保存好的位置,接着执行后面的语句, 如果听不懂也没有关系,简单一句话就是函数会返回,接着执行后面的语句,然后介绍几个名词, main 函数我们也叫做主函数或者是主程序,函数一,我们也叫做子函数或者是子程序, 我们看一下这个程序是不是缺少一点什么,也就是函数一是不是缺少一点什么?函数一,它是来实现某一个功能的,那么这些功能的语句放在哪里呢?我们没有看见,也就是我们需要, 也就是我们需要定义一个函数体,把实现功能的语句放在一起,当然这里的语句我们只有一个,也就是 a 加加这个函数一,它没有返回值,也没有传入参数,这就是函数的定义。 在 main 当中,它从上往下执行语句,遇到函数调用函数,接着执行函数里面的语句, 也就是执行 a 加加,执行完之后就返回去,接着执行焖后面的语句。 注意这里调用函数的时候,括号里什么都不写,因为定义的时候就是没有参数,所以说什么都不需要写。函数定义好了之后,我们是放在焖语句的前面,还是放在焖语句的后面,它是不一样的。 函数放在什么位置,主要是与编辑器有关,编辑器是从上到下依次编辑的, 假如调用一个函数 weu 五,编辑器从上到下编辑,第一次遇到 weu 五,那么它把五这个指按照什么类型来处理呢?按照 anson 的 恰类型, anson 的 insert 类型,还是 anson 的 long 类型来处理呢?编辑器是不知道的, 编辑器是不知道的,所以在调用之前要告诉编辑器一些重要的信息,一些关键的信息, 也就是说,在调用函数之前,必须要让编辑器明确的知道它的返回类型,函数名和参数列表,这三个信息缺一不可。回到我们的程序来看,函数一放在 main 的 前面, 那么编辑器从上到下编辑。首先来到函数一的定义部分,就了解了这个函数的三个关键信息,接着编辑到 main 里面,再次遇到函数一,那么一来二熟就会正确的分析使用了。 如果把函数一放在 main 的 后面,那么编辑器从上到下编辑,编辑到 main 里面,第一次遇到函数一,它是一点都不熟悉的,不知道怎么使用。 编辑器会问,函数一,你有传递的参数吗?你有几个传递参数?你的传递参数是什么类型?你有返回值吗?你的返回值是什么类型? 这些信息都没有人明确地告诉编辑器,编辑器就不知道怎么使用了。我们说要让编辑器正确的使用函数,必须告诉它三个信息。 如果函数一放在 main 的 后面,如何提前告知这三个信息呢?通过函数的声明就可以提供这三个信息, 也就是函数定义的时候,函数的第一行加一个分号就是一个函数声明。 理论上是把函数声明放在函数调用之前,提前让编辑器了解函数的关键信息就可以了。但是一般会把函数的声明放在文件的前面几行,那么保证后面的每一个函数都能够调用。 这节课我们简单的了解了一下函数,首先是函数的执行顺序,接着是函数的声明,知道为什么会有函数声明了吧。 接着是函数的调用,然后是函数的定义部分,就是把实现一个功能的所有语句都放在一起,封装成一个函数,使功能模块化。 最后我们想一下,执行完这个函数之后, a 的 值是多少? a 的 值是三,自己可以分析一下。好,这节课到此结束,拜拜。

定位器买成品要一百多,自己做六十搞定。德州七八零一 g 开发版,支持北斗和 gps 双模卫星定位,四 g 全网通电话卡一插就是个防丢器,能在手机上看到它的行动轨迹。供电方法也多种多样,数据线供电、电池供电、太阳板供电都是可以的。 如果你也想轻松玩转这些电子设计新概念,五幺单片机 c 语言教程,帮你打通从入门到实战的最后一公里。从点亮 led 到自制定位器,用八十加实战案例教你写代码、搭电路,每个步骤都有详细图解,配套完整原码加 ko 软件操作视频 复制粘贴就能调试,遇到问题还有在线答疑,相当于工程师手把手带,从中断系统到传感器联动、串口通信,循序渐进搭建知识体系,学会就能复刻智能门禁、防盗报警、避障小车等实用项目。不管你是电子 diy 爱好者、学生做课程设计,还是想入门单片机的新手,这本书都能让你少走弯路。

啊,我们来介绍一下这个板子,这个板子呢是基于我要单片机的一个发动机转速电控系统的一个仿真啊啊,音降部分呢,我们先可以简单的一个介绍一下 啊,这边这个呢是我们的一个 st 幺零二显示,然后我们的 stc 八九 c 五二单片机这里啊也只有四个按键, 第一个按键呢主要是我们一个信号模拟输入,这个信号呢主要是我们用啊,是我们用按键模拟的,就是我们发动机在运行过程中呢,检测到这个信号中断了,他就会有发动机就会熄火,这个不接地极了,我们这里是还用按键啊下那个啊下之后就是持续的电瓶,就是我们一个发动机信号中断, 然后这些老脏干净了,是我们的预置的一个切换加减啊,这个就是发动机的一个信号中断的一个指示灯啊,这个呢就是我们的这个这不定点减的模拟啊,是我们节气门的一个,然后我们这个曲轴的一个转速检测,采用着瓦的变阻器啊,然后我们上电先试一下这个功率 啊,双击这个芯片加载我们的程序,程序在哪也可以找呢 啊,程序来我们这里呢有两个文件,就是我们这里有的话只有这几个文件啊,源代码和仿真图,我们在源代码里 把这个程序给加载,然后找到这个文件这个点 h e s 和这个文件,然后点击确认, 嗯,再点击这里运行,可以看到我们大显显示的一个速度啊,最低值和一个最高值比上限和下限,但我们的速度呢高于我们上限的时候呢,我们不停的减,去个震荡,看这个节奏美呢,有看震荡打一下, 当低于我们就下线的时候呢,它就这位,不仅仅呢就会反转,反转一段时间,就这个功能, 这个是节气门的一个用部件去模拟的,然后这边就是个装锁,我们装锁来,我们可以调一下这个滑动变阻器啊,这里两个箭头啊,我们点这个上或者下的箭头都可以啊,我们可以试一下,我现在点, 当然我们这个超过我们这个上下滤子的时候呢,都不一定呢,就会真钻啊啊,我们现在可以测试一下,比如说现在这个滤子是多少?我们先第一个按键,他现在是设置滤子这个光标闪烁,第三个就加了一个操作,嗯,第四个是减啊,这个是我们的滤子的一个设置, 这样一降呢,这个管表很多啊,都不会闪烁了。嗯,我们现在测试一下这个功能,我们调节我们这个撞树, 比如当我们这个撞树呢高于我们上下的时候呢,它会震断,震断一段时间,控制这个节奏没得开,打开了,然后再低于我们下下,我们低于我们最低一次的时候去闪摆二的时候呢,我们再调节一下, 低于我们上百二十手呢,我们的电源部件呢,就会仿撞一道,刚才可能你没看到 canada 的 啊,功能呢?就这等一个功能,还有一个信号输入的,就是说我们如果呢发动机,现在我们这个发动机呢有一个运行指令灯啊,就这个 他捏起来是代表着我们的发动机在运行,他三 d 就是 一个运行的状态,如果呢突然间有信号呢?中断了,对滑发动机呢就熄火,我们可以显示一下,我们把这尖按键一直按下,嗯,代表着模拟我们的信号一直是中断 信号,在中断过程中,我发动机的状态值应该已经熄灭掉了啊,这时候呢,我们再调教我们当前的这个啊,撞树人他其实都不会启动这个发动机啊,他原来的信号是中断的过程,你看我怎么调的,他都不会进行运行, 你把这个按键的正一档开关给再打上来之后,他这个信号呢就恢复了。这时候呢我们也可以点预选,我们点击上一点 真功能啊,就这样的一个功能。

大家好, pwm 百分之百占空比分成一百份,现在我们换一种方式来实现,不用那个定时,不用中断, 还是还是 p 一 点七口频率还是一千赫兹, 然后用不用定时器,不用中断的实现,就用一类延时函数。那怎么实现呢?我们看一下啊,假设我要实现这个,比如说十五 十五丈公里,那怎么算呢?我们看一下啊,百分之十五,一千赫兹频率不变啊, 一千赫兹频率,那么周期就是,呃,一千微秒啊,前面也是已经说过一千微秒不变, 百分之百占空比一千微秒, 呃,百分之一占空比是多少?一千除以一百就是十微秒,对不对?十秒十五。如果我要百分之十五占空比,是不是乘以后面加一个零 啊?一百五十微秒, 那么这是低电瓶啊,低电瓶, 低电瓶,高电瓶,是不是变成了这个?一百减去十五就是八十五,对不对?八十五就是后面加个零,就是八百五十微秒,就是, 呃,百分之十五占空比就是一百五十倍秒。低电瓶,然后 led 灯亮,百分之八十五占空比,八百五十秒,高电瓶 led 灯灭,就能实现这个,呃, 频率与前二值,然后负占比百分之十五。我们试一下啊,直接用这个,用这个打片机烧录工具,上面有个这个延时计算器,这个延时计算器我们直接输入 十五微秒,十五生成代码了。谁代码复制代码直接复制啊,在这里复制复制十五微秒,对吧?十五微秒, 然后这是高电瓶,高电瓶,哎,不对,十五,不是十五,是一百五十微秒,对,搞错了,一百五十微秒复制代码,六啊,一百五十微秒, 战功比是十五,它这个延时是一百五十微秒,然后高电瓶就是八百五十。 八百五十,八百五十,复制代码,直接复制到这里, p 粘贴,一百五十微秒延时,八百五十微秒的延时, 这里是。呃,十五,这里是八百五十。八百五十,对, 低电瓶点亮,高电瓶熄灭,百分之十五占满米,我们翻译一下,翻译,然后烧录进去,烧录 好扫进去了,我看一下啊,看一下四部戏,这样它自动检测一下 频率。九百九十七,就是一 k 嘛,有三个赫兹的误差是正常的,频率,一 k 没问题,然后负占空比 多少?十五吧,没错吧?十五,十四,有个百分之一,这个误差测量出来有误差也是没问题的。十五,然后正占比就是高电平部分,百分之八十五,没错啊,可以实现了。 负占公比,我们再改一个数,改个,比如说二十三,那要怎么改呢?百分之二十三,你看一下啊,百分之二十三,比如说 百分之二十三,再乘以的话呢?二十三后面加个零吧,那就是二百三十微秒,这是低电平部分。低电平, 那高电平部分呢?高电平就是一百,减去二十三等于多少? 这不等于这个七十七,没错吧?七百七十, 这是微秒,搞错了,不是不是,百分比微秒,我们直接输入这个延时,两百三,七百七,直接带进去算。两百三, 两百三十,复制代码,这里啊,直接改,这里直接粘贴过来, 然后七百七,再改一个。七百七。七百七十,复制代码,对,把这个八百五改成七百七,这一段直接粘贴 好,下面这里也直接改。呃,两百三二三,对,然后这里七百七十,就是七七零,翻译一下, 然后输入进去 好看一下,战绩是变了,变成这个二十三了。二十三没错吧?二十三战绩有点波动, 二十三没错了,频率还是没变吧?一千赫兹好,通过这个低的延时的话我们就可以实现,就是实现这个我们想要的战功底。对,就这么来的。 好,就分享到这里吧。