【已送实验箱】LED点灯学习
本帖最后由 国学芯用 于 2024-1-10 11:58 编辑stc官方视频讲的真好,跟着冲哥视频学习,很轻松。
第四集 建立工程点亮第一颗灯
1、IO操作
批量操作 PO是一组GPIO口, P0=0X00;
P0.0是一组的其中一个GPIO口, P01=P0^1;
2、相关寄存器定义
SFRP4 =0XC0;
SFR P4M1 = 0XB3;
SFR P4M0 = 0XB4;
3、设置IO工作模式
P4M1=0X00;
P4M0=0X00;
设置P4口全为准双向口。
4、typedefunsignedcharbyte给unsigned char 取别名,用到他的地方可以用BYTE代替。
第5讲 C语言运算符和进制之间转换
转义字符
\n :换行符
\r :回车
及其他字符。
printf("当前温度:%3.3f\n\r",11.2) //输出当前温度:11.200.
printf("%c",53) // 显示字符5. 53对应字符是5.
二进制
逢2进1 ,例如:数字2写成10,3写成11。
十六制
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11-19,1A等。
c语言运算符号
printf("%u %u",100/99,100%99) //输出为1,1.
printf(u"%\r\n",2<<1)//输出为2.
printf(u"%\r\n",0x11&0x10)//输出为0x10.
.
记得当年入门单片机,用的是AT89C51,没有P4口,所以不用自己自定义P4口寄存器。点个灯,简单得很。 第六集视频
1、Delay延时函数
1秒=1000毫秒=1000000微妙
延时函数
#defineMAIN_FOSC 24000000UL //主时钟
voiddelay_ms (u16ms)
{
u16 i;
do{
i=MAIN_FOSC/6000 ;
while(--i); }while(--ms);
}
2、while 和do while用法
while:先判断,再执行内部语句。
dowhile:先执行内部语句,再进行while判断。
3、使用模块化编程。
XXX.h格式
#ifndef_xxx_H
#define_xxx_H
调用头文件
函数申明........
#endif
XXX.C 格式
#include"xxx.h "
函数定义
第六集视频
1、Delay延时函数
1秒=1000毫秒=1000000微妙
延时函数
#defineMAIN_FOSC 24000000UL //主时钟
voiddelay_ms (u16ms)
{
u16 i;
do{
i=MAIN_FOSC/6000 ;
while(--i); }while(--ms);
}
2、while 和do while用法
while:先判断,再执行内部语句。
dowhile:先执行内部语句,再进行while判断。
3、使用模块化编程。
XXX.h格式
#ifndef_xxx_H
#define_xxx_H
调用头文件
函数申明........
#endif
XXX.C 格式
#include"xxx.h "
函数定义
回帖仅作者可见,小心判定你灌水封号 rengran 发表于 2023-12-26 19:11
回帖仅作者可见,小心判定你灌水封号
明白了,马上改,非常感谢! 17141200320 发表于 2023-12-29 12:00
明白了,马上改,非常感谢!
请教下怎么改 第7集按键点灯
1、按键原理
对于机械开关,当机械触电断开、闭合时,由于机械触点的弹性动作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。单片机引脚检测按键信号,一般都需要对按键动作信号进行延时消抖,一般时间大约5-10mS.
按键的代码举例说明:
if(KEY==0)
{
Delay_ms(10);
if(KEY==0)
{
执行功能
}
}
2、按键的应用
2.1、 按键按下 LED点灯,松手熄灭。
举例
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
printf("按键P33已按下\r\n") ;
P67=0;
}
}
else
{
P67=1;
}
2.2、 按键按下LED熄灭,松松点灯。
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
printf("按键P33已按下\r\n") ;
P67=1;
}
}
else
{
P67=0;
}
2.3、按键按下一次,LED灯状态改变一次。
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
while(KEY2==0)//松手检测
{
};
printf("按键P33已按下,LED取反一次\r\n") ;
P67=!P67;
}
}
2.4按键按下一次,LED往左边走一个。
led灯点亮位
11111110//0XFE
11111101//左移一位,后面的位自动补0,需要在此位加1.
11111011//0XFB
11110111//0xF7
11101111//0XEF
11011111//0XDF
10111111//0XBF
01111111//0X7F
举例
viodmain()
{
u8 LED_Data=0xFE;
P6=LED_Data;
while(1)
{
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
LED_Data=((LED_Data<<1)+1);
if(LED_Data=0xff)
{
LED_Data=0xfe;
}
printf("按键P33已按下,LED取反一次\r\n") ;
P6=LED_Data;
while(KEY2==0)
{
}
}
}
}
}
数组的使用
数组使用分为两步
1、、定义
类型名称[长度]={数值};
2、使用
赋值名称[ 索引]=数值
举例
led灯点亮位
11111110//0XFE
11111101//0XFD
11111011//0XFB
11110111//0xF7
11101111//0XEF
11011111//0XDF
10111111//0XBF
01111111//0X7F
举例
viodmain()
{
u8 num=0;
u8 LED_Data=0xFE;
u8 LED_DataTab={0XFE,0XFD,0XFB,0XF7 ,0XEF,0XDF,0XBF,0X7F };
P6=LED_Data;
while(1)
{
P6=LED_DataTab;
delay_ms(500);
num++;
if(num>7)
{
num=0;
LED_DataTab=0xFE;//改变数组第1个元素值由0XFD变成0XFE。
}
}
}
第八集蜂鸣器的应用
1、蜂鸣器分有源蜂鸣器和无源蜂鸣器。有源蜂鸣器内部有自带震荡源,通电会叫。无源蜂鸣器内部无震荡源,直接通电不会叫。有源蜂鸣器价格比无源蜂鸣器价格贵。
2、蜂鸣器实战应用
例题 2.1、按键1按下,蜂鸣10ms,LED1-8全部点亮200ms在熄灭,表示开机。
2.2、 开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。
2.3、开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。
/*********2.1,2.2,2.3题目部分程序*******
bit RUN_NOW;//执行动作变量
bitRUN_Flag;//此变量值只有0和1
RUN_Flag=0; //开关机变量
u8RUN_mode;//模式1-8
voidTest(void)
{
if(KEY1==0)
{
Delay_ms (10);
if(KEY1==0)
{
RUN_Flag=1;//开机变量变1
BEEP=0;
Delay_ms(10);
BEEP=1;
P40=0;
P6=0X00;
Delay_ms(200);
P6=0XFF;
}
else
{
RUN_Flag=0;//关机复位
BEEP=0;
Delay_ms(10);
BEEP=1;
P6=0XFF;
RUN_mode=0;
RUN_NOW=0;
}
}
}
if(KEY2==0)
{
Delay_ms (10);
if(KEY2==0)
{
BEEP=0;
Delay_ms(10);
BEEP=1;
RUN_mode++; //模式选择
if(RUN_mode>8) //如果模式大于8
RUN_mode=1; //回到模式1
P6=~(<<(RUN_mode-1));
Delay_ms(200);
P6=0XFF;
}
}
if(KEY3==0)
{
Delay_ms (10);
if(KEY3==0)
{
BEEP=0;
Delay_ms(10);
BEEP=1;
if(RUN_mode>0)//已选择模式
{
BEEP=0;
Delay_ms(10);
BEEP=1;
RUN_NOW=!RUN_NOW;//运行与停止之间切换
}
}
}
if(RUN_NOW==1)//正在运行
{
P6=0XFF; //全部熄灭
Delay_ms(200);
P6=~(1<<(RUN_mode-1)); //点亮这个灯
Delay_ms(200);
}
else //停止运行
{
P6=~(1<<(RUN_mode-1));
}