当前位置: 首页 > news >正文

入门51单片机(1)-----点灯大师梦开始的地方

前言

这一次的博客主要是要记录一下学习的记录的,方便以后去复习一下的,当然这篇博客还是针于零基础的伙伴萌,看完这篇博客,大家就可以学会点灯了。

安装软件

方法一下一下来教!!萌新宝贝萌可以学会的!帮大家省省时间呗!

1.官网下载

Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families.

这里点击后,就进入了网页了。 

 

点击后,要填写信息,之后可以下载,这里呢,官网下载可以下载可以最新的版本!!

 2.百度网盘下载安装包、

这里推荐去b站的江科大,那里直接下载,好吧!我们直接把江科大的链接发一发。

资料下载

这样就有安装包了,事实上,keil5的安装很简单,不需要额外的操作,只是注意一下安装路径

自己可以改一改安装路径。当然这里的所有步骤都可以去江科大那边看看。

我这里直接提出就是安装过程中可能会遇到的问题,来节省大家的时间,大家提前留一个心眼。

在解压破解软件的安装包,或是下载软件的时候,一定要关闭杀毒软件,特别是破解软件的时候,这一步很容易有问题

 如果是windos11系统的话可以在这里恢复被删除的文件。

下载软件就这里最恶心,其他地方都很简单的,没什么难度。

建立项目

这一步也不难,非常简单,快速的来一遍。

第一步:点击project,点击New uvision project

 第二步:.新建一个文件夹。

第三步:点击进去,给项目取名,一般取project,点击保存。

第四步:选择芯片,这里要根据你买的芯片来选择,这里我们买的是江科大的芯片。

选择Atmel这一个选项下的AT8952,这里不要选错了。

然后选择否,不要它的启动文件。

然后就是这个样子。

第五步:新建一个c文件

这里取名一般去main,表示c语言中的主函数。

这样就可以开始我们的点灯了!!!!!

 这里已经非常详细了。就是还没有说到破解软件的操作,其实也简单。这里就不说了。因为视频效率更高!!

实验

1.点亮一个led灯

右键插入头文件,也就是库。这里有单片的一些引脚,外设之类的,可以直接调用的。

然后我们要看原理图才可以点灯!!

 

这里不必说完全看懂电路图,只要知道一些东西就可以了。左边是共阳极也就是说左边是高电平,然后右边是引脚,io口。

在单片机中有很多寄存器,我们可以通过寄存器来控制各个引脚的高低电平,寄存器的值可以通过代码来改。只要p20~p27其中一个引脚变成低电平,那么对应的led灯就会点亮!!

那么看看代码如何实现:

先看看头文件,有没有。

跳转后这里有P2的类型了。 

这是一个8位寄存器:p2_0,p2_1,p2_2........分别代表的是它的第0位,第一位,第二位等等一共8位。

只要改变其中一位就可以改变灯泡的亮灭了。

OK,直接,举例吧!!

#include <REGX52.H>void main()
{while(1)P2_0=0;
}

先点第一个,再点第二个。

第一次使用要,点击这个锤子,然后勾选ouput,再然后选择creat HEX File这里是创建目标文件,下载程序时要使用。

这里的型号要选择正确,根据自己的单片机型号来选择。

然后要选择文件

最后可以下载,但是下载之前,先关闭电源,再下载,再打开就完成了点灯了。

这里就完成了点灯l,非常简单的。

因为语句是执行一次的,把它置零了,那么他就一定是低电平。

如果是p2_0->D1,p2_1->2,不同的单片机点灯都各不同,这里还有另外一个点灯的方法。

同样是以点亮d1为例。注意呀P是大写!!!!!!

    P2=0xFE;

因为p2是一个8位寄存器,那么d1对应最后一位所以只要这一位是电平即可:1111 1110 =0xFE这里是16进制写法。

这样的只是写法不同而已。

2.循环点灯实验

这里我认为呢?可以使用c语言的位运算来做的。

直接看代码:如果不会c语言的可以看看之前写的c语言博客。位运算不难的!

#include <REGX52.H>
#include <INTRINS.H>void Delayms(int ms)		//@11.0592MHz
{unsigned char i, j;while(ms--){	_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
void main()
{while(1){int i=0;for(;i<8;++i){	int a=0xFF;a-=(1<<i);P2=a;Delayms(100);P2=0xFF;Delayms(100);}}
}

讲解一下呗!好的兄弟!

这里如何的delay函数是可以生成的。

可以去看看自己单片机得到主频,这里可以看到,然后去STC-ISP中自动生成延时函数。

这里主频是根据自己的来,指令集选择STC-Y1,这里不懂为什么是这样的。

然后可以选择时间,我们可以选择1ms,然后传入一个参数代表时间,添加一个循环就可以实现任意时间的延时。

这里的延时函数就是这样生成的。延时在单片机的引用是很重要的。然后再来说一说代码的含义。

这里还要注意:变量的声明只能在前面,如果在后面会报错的!!!注意看是不是所有的变量声明全部都在其他语句的前面。

循环8次,移位的次数是0~7,分别代表d1~d7的点亮,这就是思路。

3.按键控制点灯实验

按键介绍:

解释一下

p3.1代表是k1  p3.0 k2   p3.2 k3   p3.3 k4这里就是独立按键的对应关系

这里的RXD TXD其实就是p3_1 p3_0,可以从最小系统上看到。当按下时电路导通,端口才是低电平。

按键会有一个按下和松开的一个时间

所以开始和结束都有延时,我们要主动添加延时!!

那么看代码吧!

这里要实现的功能是按下k1灯往右移,按下k2灯往左移。

void main()
{int count=0;P2=0XFE;while(1){	if(P3_1==0){Delayms(20);while(P3_1==0);Delayms(20);count++;if(count>=8)count=0;P2=~(1<<count);	}if(P3_0==0){Delayms(20);while(P3_0==0);Delayms(20);count--;if(count<=-1)count=7;P2=~(1<<count);	}}
}

很好解释的,也是位运算的结果,首先当按钮没有按下时,这个p3_0是高电平,当按下的瞬间,会有一个缓冲作用,所以要延时一下,然后使用while()目的是只有松开后才执行程序,然后再缓冲一定的时间,防止这段程序被执行多次,这样的话可以保证按一下执行一次,对吧!这是我的理解。

然后,让count++,1左移count位,代表想要点亮的灯,最后取反,因为是低电平才会点亮,所以取反。很简单的。可以试试。

4.数码管显示数字实验

这个有点复杂了呀!

但是也好说的!!

我们的目的是:实现对任意一个数码管,显示任意的数字。

原理解释:直接说,这里所有的数码管的负极是共阳极的,也就说只有一个数码管可以被点亮的。

共阳极是段选,COM是片选,是通过3-8译码器来片选的。

举例:000->Y0  001->Y1 010->Y2等等,这样通过二进制枚举。

选用的端口是p2_2 p2_3 p2_4这是片选

来看看段选

这是一个表格,对应不同的位,用到的主要端口是p0。好看代码吧!
这里还是要解释,

int Numarr[]={0x3f,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
void DigitalCube(int Position,int Num)
{switch(Position){case 1:P2_2=1;P2_3=1;P2_4=1;break;case 2:P2_2=0;P2_3=1;P2_4=1;break;case 3:P2_2=1;P2_3=0;P2_4=1;break;case 4:P2_2=0;P2_3=0;P2_4=1;break;case 5:P2_2=1;P2_3=1;P2_4=0;break;case 6:P2_2=0;P2_3=1;P2_4=0;break;case 7:P2_2=1;P2_3=0;P2_4=0;break;case 8:P2_2=0;P2_3=0;P2_4=0;break;	}P0=Numarr[Num];//片选 段选 片选 段选//在两个直接会有重叠,因为第一个段暄会和第二个片选和在一起,会重影//所以必须要清零,但是直接清零会偏暗Delayms(1);//所以要延时P0=0;
}

 片选 段选 片选 段选
 在两个直接会有重叠,因为第一个段暄会和第二个片选和在一起,会重影
 所以必须要清零,但是直接清零会偏暗
 所以要延时

这里已经很细致了。

5.实现一个点击按钮,使数码管递增的代码(从0~99999999)

int Numarr[]={0x3f,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
void Delayms(int ms)		//@11.0592MHz
{unsigned char i, j;while(ms--){	_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
void DigitalCube(int Position,int Num)
{switch(Position){case 1:P2_2=1;P2_3=1;P2_4=1;break;case 2:P2_2=0;P2_3=1;P2_4=1;break;case 3:P2_2=1;P2_3=0;P2_4=1;break;case 4:P2_2=0;P2_3=0;P2_4=1;break;case 5:P2_2=1;P2_3=1;P2_4=0;break;case 6:P2_2=0;P2_3=1;P2_4=0;break;case 7:P2_2=1;P2_3=0;P2_4=0;break;case 8:P2_2=0;P2_3=0;P2_4=0;break;	}P0=Numarr[Num];Delayms(1);//Á¢¼´ÇåÁã»áµ¼ÖÂÊýÂë¹ÜÆ«°µP0=0;
}
void main()
{int arr[8]={0};while(1){int i;if(P3_1==0){Delayms(20);while(P3_1==0);Delayms(20);for(i=0;i<8;++i){if(arr[i]<9){arr[i]++;break;}else {while(i<8&&arr[i]==9){i++;}if(i==8){memset(arr,0,sizeof(arr));break;}arr[i]++;i--;while(i>=0){arr[i]=0;i--;}break;}}	}i=7;for(;arr[i]<=0;){--i;}switch(i){case 0:{DigitalCube(1,arr[0]);break;}case 1:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);break;}case 2:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);break;}case 3:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);break;}case 4:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);break;}case 5:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);DigitalCube(6,arr[5]);break;}case 6:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);DigitalCube(6,arr[5]);DigitalCube(7,arr[6]);break;}case 7:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);DigitalCube(6,arr[5]);DigitalCube(7,arr[6]);DigitalCube(8,arr[7]);break;}}
}
}

这个代码是自己想到的。

看图吧!

可以实现按键使得数码管递增。

这个思路有点麻烦,但是注意这里是后面位对应高位,前面是低位哦。 

这样就完成点灯大师的工作了。

简单说说思路:就是用一个8位数组,每次点击更新数组,然后使用数组的数据来更新数码管。这样就实现了这个功能了。

但是我这里反向的,是适合计算机的读取顺序,不适合人类的读取顺序的。可以反向遍历也可以得到结果这里就不改了。

相关文章:

  • 网络安全与信息安全的区别​及共通
  • CEPH OSD_SLOW_PING_TIME_FRONT/BACK 警告处理
  • MuJoCo(Multi-Joint Dynamics with Contact)机器人仿真器存在的问题
  • rook-ceph 慢盘导致的 OSD_SLOW_PING_TIME_[BACK/FRONT] 告警分析
  • Elasticvue-轻量级Elasticsearch可视化管理工具
  • 25软考新版系统分析师怎么备考?重点考哪些?(附新版备考资源)
  • G1 垃圾回收机制
  • Formality:Bug记录
  • 空格键会提交表单吗?HTML与JavaScript中的行为解析
  • Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
  • 神经网络如何表示数据
  • 每天五分钟深度学习PyTorch:RNN CELL模型原理以及搭建
  • 视频设备轨迹回放平台EasyCVR打造水库大坝智慧安防视频监控智能分析方案
  • bash的特性-bash中的引号
  • 网安知识“大乱炖“
  • vite前端项目在页面中引入根目录的json等文件
  • 意法半导体ST EDI 项目案例
  • 视频融合平台EasyCVR可视化AI+视频管理系统,打造轧钢厂智慧安全管理体系
  • JWT令牌:实现安全会话跟踪与登录认证的利器
  • 用react 写一个可左右滑动的柱状图
  • 普京与卢卡申科举行会晤,将扩大在飞机制造等领域合作
  • 五一假期上海地铁部分线路将延时运营,这些调整请查收
  • 四川省社科联期刊:不建议在读硕士、博士将导师挂名为第一作者
  • 宣称防老年痴呆的“原装进口”保健品McPee被指涉假,未获澳方销售批准
  • 银川市市长信箱被指已读乱回,官方回应
  • 六部门:进一步优化离境退税政策扩大入境消费