- 博客(17)
- 收藏
- 关注
原创 七、玩51单片机之串口
我们可以使用STC-ISP来配置波特率,这里我们配置的波特率为4800,我的单片机晶振为11.0592MHZ,UART要配置串口1,(有些高级单片机有更高级的串口),UART选择8位数据,波特率发生器选8位自动重载,定时器时钟选择12分频,波特率倍数记得打钩。接下来就是按照下表配置定时器1的寄存器,因为与定时器0无关,关于定时器0的都可以置为0。接下来我们需要配置定时器,我们配置波特率时需要用到定时器1,因为我们用8位自动重装,其他位学过上节定时器就知道怎么配置了,所以定时器1可以配置为0010。
2024-08-26 21:13:06
759
原创 六、玩51单片机之定时器
比如你在写作业,你老妈让你在10点钟解冻肉,这时候你就需要定个闹钟,闹钟到了时间后你就知道立刻得去解冻肉了,解完冻肉后你还是回来写作业,这就是定时器的功能。好了,接下来我们完成独立按键控制流水灯的流向即可,我再插一句,作者是现在主函数中写然后模块化,边写边测试,这样能方便你很快知道什么地方错了(如果有错误的话)传统的51单片机有T1和T0两个定时器,但随着发展,单片机的定时器增多,但是新一代的单片机都兼容老一代单片机的定时器。而我们的中断是从T0中断源开始,我们只需要配置下面红线经过的寄存器即可。
2024-08-25 11:02:19
888
原创 五、玩51单片机之矩阵按键
因为单片机内部线路连接的问题,我们的P1_5口又连接的步进电机(增大输出电流能力),步进电机另一端又连接了BZ口,而BZ口连接了蜂鸣器,当BZ口以一定频率高低变化,那我们的蜂鸣器就会响。如果我们像独立按键那种接法,一端连GND,另一端连接IO口,那么我们至少需要十六个IO口,但是如果我们如下图这种接法,那么我们只需要用八个IO口,减少了IO口的使用数量。但是但我们用矩阵的方式进行扫描,这时我们只需要1902+1080个IO口,尽管还需要乘以三,但我们只需要九百个IO口,与之前相比,大大减少了IO口的使用。
2024-05-17 21:48:46
900
原创 四、玩51单片机之模块化编程及LCD1602液晶屏
一个容易犯的小错误,当我们在.h 文件中声明未加分号时就在主函数中使用该函数,这时编译的时候主函数会在主函数的开头报错。6、接下来我们来模块化Delay函数,我们只需再创建一个.c 文件来编写Delay函数的代码,再创建一个.h 文件来进行对Delay函数的声明即可。2、3我们将所要完成函数的内容编写到一个新的点C文件中,我们还需要一个头文件来对该函数进行声明,主函数如果需要使用该函数只要进行调用即可,具体的也可以去看我的初识C语言部分。如果我们定义了AAA,那么这里就报错了,里面的代码就被编译了。
2024-05-14 22:10:01
917
2
原创 三、玩51单片机之静态数码管篇
如果我们通过一个芯片进行传输,这样我们的输入数据就作为一种微弱的信号,再通过芯片的电源驱动数码管显示,这样就能使我们数码管以较亮的方式显示。这时,我们也能发现我们无法使数码管同时显示多个数字,也就是说在同一时刻只有一个数码管能够被点亮,即使有多个数码管被点亮,他们显示的数字也是相同的。我们的共阴极(即3、8口)连接的是低电频,这个公共端我们也称他为位选。看下边图右上,这里只不过分成了4个单元,每个单元有一个公共端,下面连接着相同的断码,当我们想让其中某一个数码管显示数字,就将上面那个数码管的位选端置0;
2024-05-11 22:25:17
856
1
原创 二、玩51单片机之独立按键篇
接下来就编写我们的主程序了,其中用if 语句来判断我们的按键是否按下,因为我们想要达到的效果是松开手后,LED灯才会电亮。单片机上电时,所以io 口都默认为高电频,如果按键没有按下,这个io 口就保证是高电频,如果按下了,这个io 口就为低电频了,单片机上有寄存器,我们写一个值他就会送到io口上。在正式编写程序前,我们先来了解独立按键。可以看到每个独立按键与单片机的io 口都连接了,独立按键的按键io 口有点特殊,按键K4接的是P33口,K3接的是P32口,K2接的是P30口,K1接的是P31口。
2024-05-09 22:37:05
1266
1
原创 一、玩51单片机之LED灯篇
当然,你可以自己编写延迟函数,但STC—ISP提供给我们一种更加容易得到延迟函数的方法,如下: 要得到符合我们单片机型号相同的延迟代码,我们需要调节数据,系统频率(即晶振频率)每种单片机的晶振频率可能会不同,所以要调节到符合我们型号的晶振频率(我这里的晶振频率是12MHz)。这样我们的第一个程序就写好了,但是因为单片机一直在启动,所以程序一直从main函数在进去,再出来,P2口也一直在被改变,所以我们需要让程序停下来,不能让他一直跑,于是我们需要把他困起来,我们可以用一个循环来实现这种效果。
2024-05-08 13:52:27
738
1
原创 第三节、函数的声明和定义、函数的递归与迭代
让我们来想下是否能简化问题,我们需要求“abc” 的长度,当第一个字符不等于 ‘\0’,那我们可以将问题简化为 1 + my_strlen("bc") --> 1 + 1 + my_strlen("c") -->1 + 1 + 1 +my_strlen("") --> 1 + 1 + 1 + 0 ,最终,我们就可以实现求字符串的长度。print函数的作用就是将问题简化,我们的目的是打印1234的每一位,但我们发现4是比较容易打印出来的,所以我们可以先按顺序打印123,然后再打印4。
2024-04-30 19:28:26
340
原创 第三节、函数(二)、函数的练习、函数的嵌套
1、函数的参数可以是常量、变量、表达式、以及函数,只要实参所使的函数会返回一个符合我们调用函数的参数类型(用下面Add举例即返回一个int类型的值),那么我们也可以用函数来作为我们的函数参数。这里拿16来举例,16可以被分为2个因子相乘,那么我只需要试除sqrt(16)之前的数,看看是否有数能被16整除,这样我们就大大减少了试除的时间。函数中数组传参实际上传递的是数组首元素的地址,而不是整个数组,所以在函数内部计算一个函数的参数部分的数组的元素个数是不靠谱的。把一个函数的返回值作为另一个函数的参数。
2024-04-22 15:09:08
294
原创 第三节、goto 语句以及函数(一)
strlen()、strcmp()、printf()函数等等,每个人写的代码分格以及是否有bug,我们是未知的,所以为了更高效的写代码,于是就定义了一些库函数。原因在于函数传参出了问题,函数形参只是实参的一份临时拷贝,如果我们想要改变实参的值,我们需要用到指针。这里形参也有自己的一份空间,我们只不过是把实参的值传进去了,但对于形参的交换并没有改变实参,这里面函数执行的内容只是把形参的两个值进行交换了。1、使用goto语句,可随意跳转我们想去的位置,如下代码,会一直打印(hehe)以及(haha)
2024-04-20 22:17:02
263
1
原创 一、选择与循环语句的基本练习(一)
(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。猜数字游戏代码如下,其中用到了time()函数、rand()函数、srand() ,可通过查有关资料来了解函数的作用以及所需头文件。* n ,因此我们可以通过求前一个数字的阶乘后再乘以n ,然后再通过相加就得到了1~n阶乘的和。计算1~n 阶乘的和,我们可以先求出每一个数的阶乘,之后在逐个相加,也就是要加n次,所以外面还需要套一层循环。通过for 循环来求n的阶乘,while循环也是可以的,只不过初始化与调整会麻烦一点。
2024-04-19 22:12:47
199
1
原创 第二节-分支语句和循环语句(二)
在 for 循环中,continue 跳过本次循环后面的部分来到调整位置,而 while 循环跳过本次循环后面的部分来到判断位置。如上图,当数据的初始化、判断、调整在程序中隔的太远,当我们需要修改某一部分时,不方便修改,于是有更好用的循环——for 循环。再讲for 循环前我们来回顾下while 循环,打印从1到10的数字,主体可分为三个部分。while 循环和 for 循环中 continue 的对比。1、在 for 循环内随意的改变循环变量容易让循环失去控制。三、for 语句的循环控制变量。
2024-03-28 21:11:12
173
1
原创 初识C语言(四)
原因:如果我们存储一个 char 类型的变量,向内存申请1个字节的空间,那么用一个 bit 单元来表示一个地址,那么 char 类型的变量就占了8个地址,空间利用率不高。static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。一个函数本来是具有外部链接属性的,但是被static修饰的时候,外部链接属性就改变为内部链接属性,其他源文件(.c)就无法使用。当用static修饰局部变量时,局部变量的存储位置就在静态区,而不是在栈区。取地址a的地址为第一个字节空间的地址。
2024-03-20 22:29:55
270
原创 初识C语言(三)
操作符,使逻辑取反,即为假,不可进入if 语句,即打印不了“hehe”。除号两端都是整数的时候,执行的是整数除法,如果两端只要有一个浮点数就执行浮点数的除法。如上图,当表达式一为真,即执行表达式二,将表达式二的结果作为整个式子的结果。如上代码,只要a、b中有一个不为0时,屏幕上就可以打印“hehe”。当表达式一为假,即执行表达式三,将表达式三的结果作为整个式子的结果。如上代码,只有当a和b都不为0时,才能在屏幕上打印“hehe”。注意:取模操作符的两个操作符只能是整数。1、算数操作符中主要讲除法和取模。
2024-03-13 22:16:23
343
原创 初识C语言(二)
对 \130 的解释:\ 后的3个数字为八进制位数字,转化为十进制位为88,所打印出来的值为十进制位对应ASCII 编码的字符。为了打印单个引号或者单个双引号,我们也需要用 \ 来进行转义,防止打印的单个引号或双引号对另一对单引号或者双引号进行配对。在C语言中,const 修饰的a本质上是变量,但不能被直接修改,具有常量的属性。因为arr2数组中没有 \0,所以打印出来的字符串长度为随机值。所以,为了防止这种情况的出现,我们可以用 \ 进行转义。#define 可以定义不同的类型,且定义的值不能被改变。
2024-03-12 14:15:11
328
原创 初学C语言(一)
在我们日常生活中会用到整形,浮点型。例如我们买书花费了5元,买零食花费了30.56元。生活中的有些值是不变的(比如:血型、身份证号等),有些值是可变的(比如:年龄、身高等)注意:存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。main函数是程序的入口,一个程序只能有一个mian函数。但c语言中为何又出现短整型、长整型和双精度浮点型?变量的作用域:在哪里能够使用,哪里就是他的作用域。c语言中把不变的量称为常量,变化的量称为变量。接下来让我们看看不同类型所占空间的大小。4、变量的作用域和生命周期。
2024-03-09 11:08:26
399
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人