环境搭建
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()前面。