Crystalline
发表于 2023-12-28 12:37:59
rengran 发表于 2023-12-28 10:54
图1
谢谢大佬{:lol:}
Crystalline
发表于 2023-12-28 13:05:38
今天才学会怎么发图片,补充一下准双向口模式和推挽输出模式下IO驱动LED的亮度
Crystalline
发表于 2023-12-28 14:11:43
本帖最后由 Crystalline 于 2023-12-28 16:01 编辑
第六集
LED闪烁和花式点灯
基本单位的换算
1s = 1000ms=1000000us
按照视频里的方法我发现LED闪烁的时间不是500ms,差不多1s
我开始怀疑是运行频率不对,
我看到stc-isp软件上的提示,去数据手册查了一下WTST寄存器才知道
下面把WTST寄存器清零就好了!
sfr P0 = 0x80;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr WTST=0xE9;
sbit P00 = P0^0;
#define MAIN_Fosc 24000000UL
void delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
void main()
{
WTST = 0x00;
P0M0 = 0xff;
P0M1 = 0x00;
while(1)
{
//P0= 0x01; //0000 0001 P00口为高电平
P00 = 1;
delay_ms(500);
P00 = 0;
delay_ms(500);
}
}
rengran
发表于 2023-12-28 14:24:39
Crystalline 发表于 2023-12-28 13:05
今天才学会怎么发图片,补充一下准双向口模式和推挽输出模式下IO驱动LED的亮度
...
你这是高电平输出还是低电平输出?如果是低电平输出,两者亮度应该差不多吧
Crystalline
发表于 2023-12-28 14:26:21
rengran 发表于 2023-12-28 14:24
你这是高电平输出还是低电平输出?如果是低电平输出,两者亮度应该差不多吧 ...
高电平输出
Crystalline
发表于 2023-12-28 15:45:44
本帖最后由 Crystalline 于 2023-12-28 18:22 编辑
第七集
按键点灯
由于没有外接的按键,我也不好实践,我想了一个办法模拟按键,用一根杜邦线的一端接按键的GPIO口,另一端接地或VCC(接地时模拟按键被按下,接VCC时模拟按键悬空)
把按键的GPIO设置为高阻输入模式
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr WTST=0xE9;
sbit LED= P0^0;
sbit KEY = P0^1;
#define MAIN_Fosc 24000000UL
void delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
void main()
{
WTST = 0x00;
P0M0 = 0xfd; P0M1 = 0x02;
LED = 0;
while(1)
{
if(KEY == 0)
{
delay_ms(10);
if(KEY ==0)
LED = 1;
}
//else 如果要按住点亮,松开熄灭的话,需要加上这段代码
//LED = 0;
}
}
没有多个LED灯,就只能试一试按键点亮LED了
{:4_183:}如果能收到实验箱的话,我再把这部分内容更新一下
rengran
发表于 2023-12-28 18:01:45
Crystalline 发表于 2023-12-28 14:26
高电平输出
如果是高电平输出的话,因为准双向口是属于弱上拉强下拉,所以亮度会暗。推挽模式属于强上拉和强下拉,所以亮度比准双向口亮。你用准双向口输出低电平和推挽输出低电平点亮同一个LED试试,亮度应该差不多。
rengran
发表于 2023-12-28 18:04:15
Crystalline 发表于 2023-12-28 15:45
第七集
按键点灯
由于没有外接的按键,我也不好实践,我想了一个办法模拟按键,用一根杜邦线的一端接按键的 ...
你这个程序按住点亮,松开应该不会熄灭。
Crystalline
发表于 2023-12-28 18:19:54
本帖最后由 Crystalline 于 2023-12-28 18:23 编辑
rengran 发表于 2023-12-28 18:04
你这个程序按住点亮,松开应该不会熄灭。
else位置写错了{:4_167:}
Crystalline
发表于 2023-12-28 19:20:55
本帖最后由 Crystalline 于 2023-12-28 19:34 编辑
第八集
蜂鸣器的应用
有源蜂鸣器和无源蜂鸣器的区别:
有源蜂鸣器内部含震荡源,通电就会叫
无源蜂鸣器内部无震荡源,要给一定频率的方波信号才会叫
驱动有源蜂鸣器其实和驱动LED差不多,都是IO口输出高低电平来控制
可以类比LED灯的程序
本讲主要讲的是蜂鸣器的应用:电磁炉
既结合了之前的LED,又结合了本讲的蜂鸣器
结合冲哥讲的内容,我自己写了一套代码(没有试验箱,确定不了代码是不是正确的,各位可以帮我看看)
//假设LED是高电平点亮,BEEP是低电平叫,按键接了上拉电阻
sfr P0 = 0x80;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1 = 0x90;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr WTST=0xE9;
#define MAIN_Fosc 24000000UL
#define LED P0; //把八个LED接在P0口
sbit KEY1 = P1^0;
sbit KEY2 = P1^2;
sbit KEY3 = P1^3;
sbit BEEP = P1^4;
unsigned char Mode =0 ;
bit flag = 0;//定义开关机状态,初始化关机
bit Working = 0; //定义启动状态,初始化未启动
void delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
void System_Init()
{
WTST = 0x00;
P0M0 = 0xff;
P0M1 = 0x00; //配置P0口为推挽输出
P1M0 = 0x00;
P1M1 = 0xff;//配置P1口为高阻输入
LED = 0x00; //初始化LED熄灭
}
unsigned char Key_handler()
{
if(KEY1 == 0)
{
delay_ms(10);
while(KEY1 ==0);
return 1;
}
else if(KEY2 == 0)
{
delay_ms(10);
while(KEY2 == 0);
return 2;
}
else if(KEY3 == 0)
{
delay_ms(10);
while(KEY3==0);
return 3;
}
return 0;
}
void main()
{
unsigned char Key_num;
System_Init();
while(1)
{
Key_num = Key_handler();
switch(Key_num)
{
case 1:
if(flag == 1)
{
flag = 0;
BEEP = 0;delay_ms(10);BEEP = 1;
LED = 0x00;
}
flag = 1; //开机
BEEP = 0;delay_ms(10);BEEP = 1;
LED = 0xff;delay_ms(200);LED = 0x00;
break;
case 2:
if(flag == 1)
{
Mode++;
if(Mode == 9)Mode =1;
BEEP = 0;delay_ms(10);BEEP = 1;
LED = 0x01<<Mode-1;
}
break;
case 3:
if(Working == 0)
{
Working =1;
}
break;
}
}
if(Working == 1 && Mode!=0)
{
LED = 0x01<<Mode-1;
delay_ms(200);
LED = 0x00;
delay_ms(200);
}
else
LED = 0x01<<Mode-1;
}