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;
}



页: 1 [2] 3 4
查看完整版本: STC32单片机学习记录 | 建议立即 【免费+包邮送】实验箱,提高学习效率