yupoi 发表于 2023-12-25 16:02:02

神农鼎 发表于 2023-12-24 18:34
建议提前送实验箱,提高学习效率

谢谢!
实验箱已经在路上啦!
{:4_213:}{:4_213:}{:4_213:}

yupoi 发表于 2023-12-25 21:08:54

本帖最后由 yupoi 于 2023-12-25 21:22 编辑

番外篇笔记

感谢STC赠送的实验箱。虽然它还在路上,但是我前几天买的STC8H8K64U打狗棒到了{:4_255:}
今天又翻着文档看了下,成功实现了USB-HID不断电下载。

最近期末周,比较忙。这可能是我2023年最后的一篇笔记了。

实现过程:
1. 获取头文件和LIB文件
从官网下载打狗棒的demo代码后,我找到了"11-通过USB-HID协议打印数据信息-可用于调试"这个文件夹
其中的src目录有我们需要的头文件和LIB文件
需要的文件如下:
|--stc.h
|--usb.h
|--stc_usb_hid_8h.LIB

2.编写代码
由于我手头就一块打狗棒开发板,所以我自作主张的把stc.h改名成了stc8.h(这样在keil右键就可以直接引入这个头文件了)
并且stc.h也引用了stc8h.h,所以成功偷懒(
#include <STC8.H>
#include <USB.H>
主函数添加以下内容
void main(){
    sys_init();
    usb_init();
    IE2 |= 0x80;
    EA = 1;
    while(1){
      函数体;
    }
}然后是 sys_init 函数
void sys_init(){
    P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
   
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));//等待时钟稳定
}

3.修改STC-ISP软件配置
1)勾选"当目标文件变化时自动装载并发送下载命令"
2)菜单"收到用户命令后复位到ISP程序监控区"中,选择USB(HID)模式
3)勾选下方的下次使用STC-HID接口进行ISP下载和每次下载前都先发送自定义命令

4.最后刷入固件
最后一次手动刷入固件,接下来每一次更新代码,开发板都可以自动下载编译的固件了


hualuo1987 发表于 2023-12-26 22:44:58

感谢分享 已解决

yupoi 发表于 2023-12-27 21:05:05

做作业的效率出乎意外的高,我又回来更新啦!!!
今天的笔记是第10、11个视频
第七章·按键点灯
1.按键的原理

有的是按下之后两个引脚导通;
有的是按键之后两个引脚断开。
根据电路图分析,SW17弹起,P3.2联通VCC,属于高电平。SW17按下,P3.2接地,属于低电平。

机械开关的抖动:


2.如何按键消抖
思路:
按键按下后,存在5-10ms的抖动,我们只需要在这个时间之后在进行一次检测,就可以实现消抖的效果。
代码实现:
while (1)
        {
                if (按键 == 0)
                {
                        //按键消抖
                        delay(20);
                        while (按键 == 0);
                        delay(20);
                }
        }
(代码和冲哥演示的有不同,因为是打狗棒)

3.1按键按下LED点亮,松开熄灭
if (P31 == 1)
                {
                        //按键消抖
                        delay(20);
                        while (P31 == 1){
                                delay(20);
                                P20 = 1;
                        }
                }
                else
                {
                        P20 = 0;
                }
3.2按键按下LED熄灭,松开点亮
if (P32 == 1) //按下状态
                {
                        //按键消抖
                        delay(20);
                        while (P32 == 1){
                                delay(20);
                                P20 = 0;
                        }
                }
                else
                {
                        P20 = 1;
                }

3.3按键按下一次,LED状态改变一次
if (P32 == 0)
                {
                        //按键消抖
                        delay(20);
                        while (P32 == 0);
                        delay(20);
                        P20 = ~P20; //取反改变状态
                }

3.4按键按下一次,LED往左边走一个。

u8 LED_Data = 0xFE;

void main()
{

        // 初始化
        sys_init();
        usb_init();
        P2 = LED_Data;

        // 主循环
        while (1)
        {               
                if (P32 == 0)
                {
                        //按键消抖
                        delay(20);
                        while (P32 == 0);
                        delay(20);
                        /*
                        思路:
                        通过位操作代码移动0位亮灯。由于默认补0,所以在完成后+1进行补1的操作。
                        通过while循环来判断是否达到1111 1111 也就是 0xFF
                        当达到,重置为0xFE
                        */
                        LED_Data = ((LED_Data <<1 ) +1 );
                        while( LED_Data == 0xFF ){
                                LED_Data=0xFE;
                        }
                        P2 = LED_Data;
                }
        }
}4.数组的使用
定义一个数组,把所有亮灯的方式按顺序写进去
u8 num = 0;
u8 LED_DateTab = {0xFE,0xFD,0xFB,0xF7,0xEF,0xBF,0xDF,0x7F}
点灯实现:
P2 = LED_DateTab;
delay(500);
num++;
while(num>7){
    num=0;
}


yupoi 发表于 2024-1-5 17:26:24

前几天出去旅游了,比较累。明天开始更新{:4_266:}

yupoi 发表于 2024-1-8 20:17:39

第八章,蜂鸣器的使用

首先是试验性的代码——按下蜂鸣器启动,再按一下关闭
void main()
{
        sys_init();               
        while(1)
        {
                delay_ms(1);
                if(KEY1==0)
                {
                        delay_ms(20);
                        while(KEY1==0);
                        delay_ms(20);
                        BEEP=~BEEP;
                }
        }
}省略了部分过程,但是能达成目的。

yupoi 发表于 2024-1-13 21:01:05

这几天期末考试完成,目前回到家里了

继续更新继续更新!!!


第八集:蜂鸣器的应用

控制原理:
P54引脚给高电平关闭、P54引脚给低电平打开蜂鸣器
蜂鸣器实战应用:

需求分析
按键*2,LED*8,蜂鸣器*1
1、按键1按下,蜂鸣10ms,
LED1-8全部点亮200ms在熄灭,表示开机。
2.开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。
3.开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。
代码:
void Test(void)                //电磁炉的功能
{
        if( KEY1 == 0)                //开关机键
        {
                delay_ms(10);
                if(KEY1 == 0 )
                {
                        while(KEY1 == 0 );                //按钮按下,并等待按钮松开
                       
//----------------------还没有开机的时候,执行这个开机功能---------------------                       
                        if( Run_Flag==0 )                        //还没有开机
                        {
                                Run_Flag = 1;                        //开机变量改为1,表示已经开机了
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣
                                P40 = 0;                                //打开led的总电源
                                P6 = 0X00;                                //点亮全部LED
                                delay_ms(200);                        //延时200ms
                                P6 = 0XFF;                                //熄灭全部LED
                        }
//----------------------已经开机的时候,执行这个关机功能---------------------                               
                        else
                        {
                                Run_Flag = 0;
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣       
                                P6 = 0XFF;                                //熄灭全部LED       
                                Run_Mode = 0;                        //模式清0                               
                        }
                }
        }
       
        if( KEY2 == 0 )
        {
                delay_ms( 10 );
                if( KEY2 == 0 )
                {
                        while( KEY2 == 0);                //等待松开执行了
                        BEEP = 0;                                //打开蜂鸣
                        delay_ms(10);                        //延时10ms
                        BEEP = 1;                                //关闭蜂鸣                       
                        Run_Mode ++;                        //模式选择
                        if( Run_Mode>8 )                //如果模式>8
                                Run_Mode = 1;                //回到模式1


                       
                        P6 = ~(1<< (Run_Mode-1));                //1<<1      0000 0001 -> 1111 1110
                       
                }
        }
}




课后作业:
阿巴阿巴
让我想想

yupoi 发表于 2024-1-22 15:20:26

这几天🐏了,好难受{:4_260:}

yupoi 发表于 2024-1-26 21:47:03

39度烧了四天。终于恢复了,,,我学到哪了来着{:4_260:}

yupoi 发表于 2024-1-28 16:17:07

蜂鸣器作业
主函数功能实现
应该没啥问题

void Diancilu(void)                //电磁炉的功能
{
        if( KEY1 == 0)                //开关机键
        {
                delay_ms(10);
                if(KEY1 == 0 )
                {
//----------------------还没有开机的时候,执行这个开机功能---------------------                       
                        if( Run_Flag==0 )                        //还没有开机
                        {
                                Run_Flag = 1;                        //开机变量改为1,表示已经开机了
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣
                                P40 = 0;                                //打开led的总电源
                                P6 = 0X00;                                //点亮全部LED
                                delay_ms(200);                        //延时200ms
                                P6 = 0XFF;                                //熄灭全部LED
                        }
//----------------------已经开机的时候,执行这个关机功能---------------------                               
                        else
                        {
                                Run_Flag = 0;
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣       
                                P6 = 0XFF;                                //熄灭全部LED       
                                Run_Mode = 0;                        //模式清0
                                Run_Now       = 0;                        //运行的模式改成停止                       
                        }
                        while(KEY1 == 0 );                //按钮按下,并等待按钮松开
                }
        }
       
        if( KEY2 == 0 )                                        //切换模式
        {
                delay_ms( 10 );
                if( KEY2 == 0 )
                {
                       
                        if( Run_Now==0 )                //如果没在工作
                        {
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣                       
                                Run_Mode ++;                        //模式选择
                                if( Run_Mode>8 )                //如果模式>8
                                        Run_Mode = 1;                //回到模式1
                               
                                P6 = ~(1<< (Run_Mode-1));                //1<<1      0000 0001 -> 1111 1110
                       
                        }
                        while( KEY2 == 0);                //等待松开执行了
                       
                }
        }
       
        if( KEY3 == 0 )                //按键按下才会执行里面得大括号
        {
                delay_ms( 10 );
                if( KEY3 == 0 )
                {
                        if( Run_Mode>0 )                //已经选择了模式
                        {
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣                               
                                Run_Now = !Run_Now;                //运行和停止之间的切换
                        }
                        while( KEY3 == 0);                //等待松开执行了
                }
        }
        if( Run_Now == 1 )                //正在运行
        {
                P6 = 0XFF;                                        //全部熄灭
                delay_ms(200);
                P6 = ~(1<< (Run_Mode-1));        //点亮这个灯
                delay_ms(200);
        }
        else                                        //停止运行
        {
                P6 = ~(1<< (Run_Mode-1));
        }

}



页: 1 [2]
查看完整版本: 冲哥32位51单片机学习笔记 | 实验箱已收到,感谢STC!!!