19-51单片机/STC15/IAP15(小蜜蜂&蓝桥杯全流程攻略学习)

环境搭建

STCMCUDATABASE的添加:https://jingyan.baidu.com/article/75ab0bcb9f7614d6864db2c9.html

过程:https://zhuanlan.zhihu.com/p/104196848

stc15f2k60s2单片机开发环境构建 - JavaShuo

stc15f2k60s2单片机开发环境构建_stc15f2k60s2程序下载方法-CSDN博客

error:can't open file也有可能是因为.c的命名不符合规则,所以不能读到路径。例如AD&DA.c

效果不出来可能是因为没仿真,建起了工程之后一定要点保存的按键。

MODULE CONTAINS DUPLICATE SEGMENT NAMES:模块包含重复的段名称

或者是BL51 BANKED LINKER/LOCATER V6.22.2.0 - SN: T1DZC-0FSRAC这种就是重复段名

所以可能是函数名出现了重复,比如void delay();和void Delay()其实还是一样的。所以有函数命名出问题,编译失败。看不到源程序。

烧录:如果一直烧录都是在检测单片机,那么极有可能是没有添加进仿真的型号进ISP。

Astartup.15的文件是紧跟着第一个文件夹的。

LED:

知识背景:

74HC138三八译码器:三个输入控制八路互斥的低有效输出。(如图看下面的Y5)

其中的G1、G2A、G2B是控制端,控制片选;C B A是输出,让他们等于什么就相当于控制Y几。

锁存器的原因:因为有些引脚和别的模块是共用的,比如P0口就可以同时控制LED和数码管、蜂鸣器。

74HC573锁存器:八路3态输出的非反转透明锁存器。(八路3态:指八个输入与输出是否导通连起来则是由LE端和OE端的三个高低电平的配合状态来mo决定的;非反转:不是左边输0右边就一定是1,也可能相同;透明:指输入输出在LE为高电平时是同步的)

工作原理:当锁存使能端LE为高电平,OE一直都是低电平时,这些器件的锁存输入和输出都是保持一致的,输入是0那么输出也是0;当锁存使能端LE为低电平时,符合建立时间和保存时间的数据就会被锁存。

case 4:P2=(P2&0x0f)|0x80;//前面括号的是保持前面四位为0,等后面的|去把值或上去 //P2和P0是一对,用这些基本控制的时候需要两个都启用

74HC02或非门:

工作过程:

若要控制LED的Q1-Q8能操作,需要:

(1)使控制端LE为高电平,那么就要让Y4C为0,再看右上角要让Y4C为0,根据或非门的准则需要左边的Y4和WR为0之后即可进行或非门取反使Y4C为1,因为WR一般为低电平,所以就需要关注Y4即左上角的图示,根据三八译码器的Y4需要C B A分别为1 0 0;

高电平灭,低电平亮。(原因:右边的VCC是高电平,只有左边是只有低电平,才有两边都通才能亮)

TIP:存在疑问:若灯一直没亮,可能是因为void Init_system()中不是先关灯的,而是把蜂鸣器和继电器先关了,这样可能有干扰,要注意一下。

void Init_system() { Select_HC573(5);//错误示范:Select_HC573(4) P0=0X00; // P0=0Xff; Select_HC573(4);// Select_HC573(5); P0=0Xff; // P0=0X00; }

TIP:

1.关于LED闪烁的问题:如果LED那写入0X00与0XFF的延时函数没有效,那么也可能只会一直亮着,而延时函数没有效,可能是把t的定义写成了char型,而char型最多就256个数罢了。Int型的有65535个数。这时候的延时才有效

2.

lightflag%2=0;语法错误

写成这样:ligheflag%=2;

数码管

1.原理图图示

数码管上的1-8是控制段选由Y7C控制,9-12是公共端由Y6C控制.然后可查阅138译码器上面的赋值去开启使能。

2.显示内容的计算(四位四位地算)。

十六位段码

SMGNo_Dot[16]=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X80,0XC6,0XC0,0X86,0X8E,0XBF,0X7F

带小数点的段码

SMGDot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x78,0x00,0x10}

unsigned int code SMG_duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

// 0 1 2 3 4 5 6 7 8 9

unsigned int code SMG_zhimu[8]={0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

// A B C D E F - .

共阴和共阳数码管的区别如下:

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。然后片选的com口就要输入高电平

共阳极数码管是指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制。共阴极数码管是指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制.

静态数码管代码编写思路:

首先定义数组(用code可以分配好区域,[[不会占用RAM的资源)

其次初始化HC138译码器的C B A来选择Y几:例如要用到Y6去控制片选,查阅真值表为110,那么就是要或上0XC0,而写成P2=(P2&0X1F)|0XCO,是为了定义高三位的值,而不影响低5位的值。之后再main()里面直接引用函数即可。

动态数码管代码编写思路:

HC573-写好可以直接选择的段位选函数,之后就直接在下一个新函数里面调用选择亮第几个数字。

3.

对于一组四位的数码管来说,静态和动态都能实现一样的效果,只是引用的IO口的区别:

静态显示需要的IO口引脚:4*8+4(com)=36;

动态显示需要的IO口引脚:1*8+4(com)=12;

4.如果加了delay还是很多重影,就证明可能是没有每个位置(每个位码都要)加上delay();漏了一个可能也有很多重影。无法实现动态。

5.数码管嵌套使用时,要记得分层,最外面一定是数码管的段码的函数引用。不然很可能也显示不了数字。

6.别总犯低级错误:是用锁存器的case 4,case 5,case 6,case 7;而不是1,2,3,4;

7.数码管中显示错误的数字没有按想象中的现象,有可能是extern unsigned char DIG[],SMGNoDot[],wema[];写成了下面这样:

因为这样它就没给几个段码留内存;

按键

tip:1.HC573要选择1是因为要点灯。

按键消抖加上while(k==0)的意义:因为程序运行得很快,如果按下了就会使单片机检测到很多次低电平,就不能实现按一次加一个值,但是如果加个(while(k==0))就能等按下了识别到是一个低电平之后松开了就为高电平了,就不会再使k=0了,而是k=1;故可精准消抖,让单片机读出一次按键程序来。

TIP:

1.不要把VCC和GND短接了,否则可能会特别烫;nop要添加什么文件:include

2.这个警告因为前面定义多的数码管显示的数字没有被用上。

3、switch case的格式要注意,之后有分括号

4.命名要规范:Display_dynamic();不能写成Display dynamic();这样程序会觉得有两个名字,其中一个没加;

5.要按照程序实习实现的顺序来,把Delay()放在最后面,main()前面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值