第六集(下):
总结
define格式:define 名称 需要定义的内容
一、函数的使用
三个步骤:定义——声明——调用
在模块化编程里,函数使用分为如下三步:
1:函数定义
返回值 函数名称(入口参数)
{
函数要执行的功能
}
@返回值: 没有返回值就是void
@函数名称:避开关键词,不重复,非特殊字符随便取
@入口参数:类型+名称,多个参数“,”分开,空就写void
2.函数声明
返回值 函数名称( 入口参数 );
3.函数调用
函数名称(入口参数 ):
函数一般写在后面,然后再主函数前面声明一下
二、新建文件、使用模块化编程
模块化编程使程序整体更加清晰
新建xxx.c和xxx.h文件,代表一个功能块
xxx.h格式:
#ifndef__XXX_H
#define__XXX_H
调用头文件
函数声明...
#endif
xxx.c格式
#include “xxx.h”
函数定义
添加文件一定要记得引用路径和添加到工程里
步骤:
新建一个.c文件和一个.h文件,取名避开关键词,文件后缀名不要输错,推荐一个.c文件跟着一个.h文件
在.h文件内输入格式
#ifndef__MATH_H //如果没有定义
#define__MATH_H
int Add(int parm1,int parm); //函数声明
#endif
.c文件内输入调用格式
#include “math.h”
int Add(int parm1,int parm) //函数定义
{
return parm1+parm2;
}
然后主程序顶部引用math.h
#include"math.h"
引用路径:在Options for Target中点击C251标签,然后点击include paths 引用一下.c和.h所在的文件夹
添加到工程里:双极左侧的Source Group 1,然后把math.c添加到工程里
模块化编程好处:
主函数看起来非常清晰,一目了然
在做一个大型项目时,可以只编写自己的这一部分,如果中间需要什么算法可以让同事写,写完之后调用就行了
小结:
熟悉while的循环过程
学会函数的使用(定义——声明——调用)
学会新建文件,添加文件路径和添加到工程
本帖最后由 1872978045 于 2023-6-1 15:40 编辑
第七集(上):
总结
一、按键的原理
按键原理非常简单,本质上就是两个脚或者四个脚、但是两个脚之间一定是有一个开关一样的元件,有的是按下之后两个脚导通,有的是按下之后断开
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下断开,所以在开关闭合及断开的瞬间会伴随抖动
二、按键的代码实现过程
if(KEY == 0) //判断是否按下
{
Delay_ms(10); //延时
if(KEY == 0) //再次判断是否按下
{
执行功能
}
}
另一种形式
if(KEY == 0) //判断是否按下
{
Delay_ms(10); //延时
while( KEY==0)
执行功能
}
三、按键的应用
1、按键按下LED灯点亮,松开熄灭
核心程序
if(KEY == 0) //判断是否按下
{
Delay_ms(10); //延时
if(KEY == 0) //再次判断是否按下
{
P60 = 0;
}
}
esle
{
P60 = 1;
}
2、按键按下LED灯点熄灭,松开点亮
if(KEY1 == 0) //判断是否按下
{
Delay_ms(10); //延时
if(KEY1 == 0) //再次判断是否按下
{
P67 = 1;
}
}
esle
{
P67 = 0;
}
3、按键按下一次,LED状态改变一次
if(KEY2 == 0) //判断是否按下
{
Delay_ms(500); //延时
if(KEY2 == 0) //再次判断是否按下
{
P67 = !P67;
Delay_ms(500);
while(KEY2 == 0)
{
}
}
}
4、按键按下并松开之后,LED状态改变一次
if(KEY2 == 0) //判断是否按下
{
Delay_ms(500); //延时
if(KEY2 == 0) //再次判断是否按下
{
while(KEY2 == 0)
{
}
P67 = !P67;
Delay_ms(500);
}
}
按下一次状态取反可以用!
疑问:
按键开关要消抖,拨码开关要消抖吗?
本帖最后由 1872978045 于 2023-6-1 15:59 编辑
第七集(下):
总结
三、按键的应用
5、按键按下一次,LED往左边走一个
P6 = 0xfe;
if(KEY2 == 0) //判断是否按下
{
Delay_ms(500); //延时
if(KEY2 == 0) //再次判断是否按下
{
P6 = ((P6<<1)+1); //每次左移一位,并且最低位加一
if (P6 =0Xff) //如果一次循环结束,则给P6重新赋值0XFE
P6 =0Xfe;
Delay_ms(500);
while(KEY2 == 0);
}
}
6、按键按下一次,LED往右边走一个
P6 = 0x7f;
if(KEY2 == 0) //判断是否按下
{
Delay_ms(500); //延时
if(KEY2 == 0) //再次判断是否按下
{
P6 = ((P6>>1)+256); //每次左移一位,并且最高位加一
if (P6 =0Xff) //如果一次循环结束,则给P6重新赋值0X7F
P6 =0X7f;
Delay_ms(500);
while(KEY2 == 0);
}
}
四、数组的使用
数组使用分为如下两步:
1.定义: 类型 名称 [长度] = {数值};
2.使用: 赋值: 名称[索引] = 数值
使用数组实现流水灯核心函数:
u8led_data ={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
u8 num = 0;
P6 = led_data;
delay_ms(500);
num++;
if(num>7)
num = 0;
数组从0开始并且使用过程中千万要保证数组不要越界
本帖最后由 1872978045 于 2023-6-1 16:33 编辑
第八集
总结:
一、认识蜂鸣器
区别
1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫,而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。
2、价格不同,有源蜂鸣器要比无源蜂鸣器贵,贵在里面多了震荡源
二、控制原理
P54引脚给高电平关闭
P54引脚给低电平打开
核心程序:
#define BEEP P53
if(KEY == 0) //判断是否按下
{
Delay_ms(10); //延时
if(KEY == 0) //再次判断是否按下
{
while( KEY == 0)
BEEP =!BEEP;
}
}
三、蜂鸣器实战应用
test.c文件内容:
#include“test.h”
bit Run_Flag =0;
u8 Run_Mode = 0;
void Test(void)
{
if( KEY1 == 0 )
delay_ms(10);
if( KEY1 == 0)
{
while( KEY1 == 0 );
if( Run Flag==0)
{
Run_Flag = 1;
BEEP = 0;
delay_ms(10);
BEEP = 1;
P40= 0;
P6 = 0X00;
delay_ms(200);
P6 = 0XFF;
}
else
{
Run_flag =1;
BEEP = 0;
Delay_ms(10);
BEEP = 1;
p6 = 0XFF;
}
}
}
if (KEY2==0)
{
delay_ms(10);
if (KEY2==0);
{
while(KEY2 == 0);
BEEP = 0;
Delay_ms(10);
BEEP = 1;
Run_Mode++;
if(Run_Mode>8)
Run_Mode =1;
P6=~(1<<(Run_Mode-1));
}
}
void delay_ms(ul6 ms)
{
u16 i;
do
{
i = MAIN Fosc/6000;
}while(--i);
while(--ms);
}
1、了解蜂鸣器怎么使用
2、尝试去使用蜂鸣器
疑问
Run_Mode左移一位用1<<Run_Mode和 Run_Mode<<1都行吗
本帖最后由 1872978045 于 2023-6-1 16:48 编辑
第八集作业
核心程序:
#include“test.h”
bit Run_Flag =0;
u8 Run_Mode = 0;
bit Run_now = 0;
void Test(void)
{
if( KEY1 == 0 )
delay_ms(10);
if( KEY1 == 0)
{
if( Run Flag==0)
{
Run_Flag = 1;
BEEP = 0;
delay_ms(10);
BEEP = 1;
P40= 0;
P6 = 0X00;
delay_ms(200);
P6 = 0XFF;
}
else
{
Run_flag =1;
BEEP = 0;
Delay_ms(10);
BEEP = 1;
Run_now = 0;
p6 = 0XFF;
}
while( KEY1 == 0 );
}
}
if (KEY2==0)
{
delay_ms(10);
if (KEY2==0);
{
if(Run_now==0)
{
BEEP = 0;
Delay_ms(10);
BEEP = 1;
Run_Mode++;
if(Run_Mode>8)
Run_Mode =1;
P6=~(1<<(Run_Mode-1));
}
}
while(KEY2 == 0);
}
if (KEY2==0)
{
delay_ms(10);
if (KEY2==0);
{
if(Run_Mode>0)
{
BEEP = 0;
Delay_ms(10);
BEEP = 1;
Run_now=!Run_now;
}
while(KEY2 == 0);
}
if(Run_Mode == 1);
{
P6 = 0XFF;
delay_ms(500);
P6=~(1<<(Run_Mode-1));
delay_ms(500);
}
else
{
P6=~(1<<(Run_Mode-1));
}
}
void delay_ms(ul6 ms)
{
u16 i;
do
{
i = MAIN Fosc/6000;
}while(--i);
while(--ms);
}
bit类型变量只有0和1
定义——声明——调用
定义按键,理清逻辑,边测试代码边修改
第九集:
总结
数码管由多个发光二极管组成,理论可以显示任意的字符或者图案
数码管分为共阳极连法和共阴极连法,尾缀A为共阳,K为共阴,写程序之前要先辨别是共阴还是共阳
第十集
总结:
动态刷新延时不能太短,实际上是4个数码管循环点亮熄灭
显示的段码可以构建一个数组,方便调用
疑问
视频里用define定义延时变量,可以用u4 吗 1872978045 发表于 2023-5-29 20:18
第十集
总结:
动态刷新延时不能太短,实际上是4个数码管循环点亮熄灭
楼主学习精神可嘉,可至冲哥32位8051视频教程疑问解答贴 - 开源广场及教学视频交流 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)发表提问,有专业大佬来授业解惑 第十一集
总结
定时器是定时器和计数器的统称
设置为定时器时,可以实现硬件计时
可以代替长时间的delay,提高cpu的运行效率和处理速度
C/T位为1时计数,为0是定时
设置步骤:先设置功能为定时器或者计数器——然后如果再定时器模式下,设置不分频和12分频(默认12分频)——设置定时器工作模式——定时器设置——打开中断
定时时间计算
定义中断函数后面要加上interrupt+中断号
中断函数可以直接通过ISP软件生成
中断频率越低越好 stc_usb_hid.lib文件没有啊,只有stc_usb_hid_32g.lib文件。
页:
1
[2]