找回密码
 立即注册
楼主: yupoi

冲哥32位51单片机学习笔记 | 实验箱已收到,感谢STC!!!

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2023-12-25 16:02:02 | 显示全部楼层
神*** 发表于 2023-12-24 18:34
建议提前送实验箱,提高学习效率

谢谢!
实验箱已经在路上啦!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2023-12-25 21:08:54 | 显示全部楼层
本帖最后由 yupoi 于 2023-12-25 21:22 编辑

番外篇笔记

感谢STC赠送的实验箱。虽然它还在路上,但是我前几天买的STC8H8K64U打狗棒到了
今天又翻着文档看了下,成功实现了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,所以成功偷懒(
  1. #include <STC8.H>
  2. #include <USB.H>
复制代码
截图202312252122305225.jpg
主函数添加以下内容
  1. void main(){
  2.     sys_init();
  3.     usb_init();
  4.     IE2 |= 0x80;
  5.     EA = 1;
  6.     while(1){
  7.         函数体;
  8.     }
  9. }
复制代码
然后是 sys_init 函数
  1. void sys_init(){
  2.     P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
  3.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  4.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  5.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  6.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  7.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  8.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  9.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  10.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  11.    
  12.     P3M0 &= ~0x03;
  13.     P3M1 |= 0x03;
  14.     //设置USB使用的时钟源
  15.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  16.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  17. }
复制代码


3.修改STC-ISP软件配置

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

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


回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2024-02-12 10:15:24

2

主题

41

回帖

157

积分

注册会员

积分
157
发表于 2023-12-26 22:44:58 来自手机 | 显示全部楼层
感谢分享 已解决
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2023-12-27 21:05:05 | 显示全部楼层
做作业的效率出乎意外的高,我又回来更新啦!!!
今天的笔记是第10、11个视频
第七章·按键点灯
1.按键的原理

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

机械开关的抖动:
截图202312271925063901.jpg

2.如何按键消抖
思路:
按键按下后,存在5-10ms的抖动,我们只需要在这个时间之后在进行一次检测,就可以实现消抖的效果。
代码实现:
  1. while (1)
  2.         {
  3.                 if (按键 == 0)
  4.                 {
  5.                         //按键消抖
  6.                         delay(20);
  7.                         while (按键 == 0);
  8.                         delay(20);
  9.                 }
  10.         }
复制代码

(代码和冲哥演示的有不同,因为是打狗棒)

3.1按键按下LED点亮,松开熄灭
  1.   if (P31 == 1)
  2.                 {
  3.                         //按键消抖
  4.                         delay(20);
  5.                         while (P31 == 1){
  6.                                 delay(20);
  7.                                 P20 = 1;
  8.                         }
  9.                 }
  10.                 else
  11.                 {
  12.                         P20 = 0;
  13.                 }
复制代码

3.2按键按下LED熄灭,松开点亮
  1.   if (P32 == 1) //按下状态
  2.                 {
  3.                         //按键消抖
  4.                         delay(20);
  5.                         while (P32 == 1){
  6.                                 delay(20);
  7.                                 P20 = 0;
  8.                         }
  9.                 }
  10.                 else
  11.                 {
  12.                         P20 = 1;
  13.                 }
复制代码


3.3按键按下一次,LED状态改变一次
  1.   if (P32 == 0)
  2.                 {
  3.                         //按键消抖
  4.                         delay(20);
  5.                         while (P32 == 0);
  6.                         delay(20);
  7.                         P20 = ~P20; //取反改变状态
  8.                 }
复制代码


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

  1. u8 LED_Data = 0xFE;
  2. void main()
  3. {
  4.         // 初始化
  5.         sys_init();
  6.         usb_init();
  7.         P2 = LED_Data;
  8.         // 主循环
  9.         while (1)
  10.         {               
  11.                 if (P32 == 0)
  12.                 {
  13.                         //按键消抖
  14.                         delay(20);
  15.                         while (P32 == 0);
  16.                         delay(20);
  17.                         /*
  18.                         思路:
  19.                         通过位操作代码移动0位亮灯。由于默认补0,所以在完成后+1进行补1的操作。
  20.                         通过while循环来判断是否达到1111 1111 也就是 0xFF
  21.                         当达到,重置为0xFE
  22.                         */
  23.                         LED_Data = ((LED_Data <<1 ) +1 );
  24.                         while( LED_Data == 0xFF ){
  25.                                 LED_Data=0xFE;
  26.                         }
  27.                         P2 = LED_Data;
  28.                 }
  29.         }
  30. }
复制代码
4.数组的使用
定义一个数组,把所有亮灯的方式按顺序写进去
u8 num = 0;
u8 LED_DateTab[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xBF,0xDF,0x7F}
点灯实现:
P2 = LED_DateTab[num];
delay(500);
num++;
while(num>7){
    num=0;
}


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2024-1-5 17:26:24 | 显示全部楼层
前几天出去旅游了,比较累。明天开始更新
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2024-1-8 20:17:39 | 显示全部楼层
第八章,蜂鸣器的使用

首先是试验性的代码——按下蜂鸣器启动,再按一下关闭
  1. void main()
  2. {
  3.         sys_init();               
  4.         while(1)
  5.         {
  6.                 delay_ms(1);
  7.                 if(KEY1==0)
  8.                 {
  9.                         delay_ms(20);
  10.                         while(KEY1==0);
  11.                         delay_ms(20);
  12.                         BEEP=~BEEP;
  13.                 }
  14.         }
  15. }
复制代码
省略了部分过程,但是能达成目的。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2024-1-13 21:01:05 | 显示全部楼层
这几天期末考试完成,目前回到家里了

继续更新继续更新!!!


第八集:蜂鸣器的应用

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

需求分析
按键*2,LED*8,蜂鸣器*1
1、按键1按下,蜂鸣10ms,
LED1-8全部点亮200ms在熄灭,表示开机。
2.开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。
3.开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。
代码:
  1. void Test(void)                //电磁炉的功能
  2. {
  3.         if( KEY1 == 0  )                //开关机键
  4.         {
  5.                 delay_ms(10);
  6.                 if(  KEY1 == 0 )
  7.                 {
  8.                         while(  KEY1 == 0 );                //按钮按下,并等待按钮松开
  9.                        
  10. //----------------------还没有开机的时候,执行这个开机功能---------------------                       
  11.                         if( Run_Flag==0 )                        //还没有开机
  12.                         {
  13.                                 Run_Flag = 1;                        //开机变量改为1,表示已经开机了
  14.                                 BEEP = 0;                                //打开蜂鸣
  15.                                 delay_ms(10);                        //延时10ms
  16.                                 BEEP = 1;                                //关闭蜂鸣
  17.                                 P40 = 0;                                //打开led的总电源
  18.                                 P6 = 0X00;                                //点亮全部LED
  19.                                 delay_ms(200);                        //延时200ms
  20.                                 P6 = 0XFF;                                //熄灭全部LED
  21.                         }
  22. //----------------------已经开机的时候,执行这个关机功能---------------------                               
  23.                         else
  24.                         {
  25.                                 Run_Flag = 0;
  26.                                 BEEP = 0;                                //打开蜂鸣
  27.                                 delay_ms(10);                        //延时10ms
  28.                                 BEEP = 1;                                //关闭蜂鸣       
  29.                                 P6 = 0XFF;                                //熄灭全部LED       
  30.                                 Run_Mode = 0;                        //模式清0                               
  31.                         }
  32.                 }
  33.         }
  34.        
  35.         if( KEY2 == 0 )
  36.         {
  37.                 delay_ms( 10 );
  38.                 if( KEY2 == 0 )
  39.                 {
  40.                         while( KEY2 == 0);                //等待松开执行了
  41.                         BEEP = 0;                                //打开蜂鸣
  42.                         delay_ms(10);                        //延时10ms
  43.                         BEEP = 1;                                //关闭蜂鸣                       
  44.                         Run_Mode ++;                        //模式选择
  45.                         if( Run_Mode>8 )                //如果模式>8
  46.                                 Run_Mode = 1;                //回到模式1
  47.                        
  48.                         P6 = ~(1<< (Run_Mode-1));                //1<<1      0000 0001 -> 1111 1110  
  49.                        
  50.                 }
  51.         }
  52. }
复制代码




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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2024-1-22 15:20:26 | 显示全部楼层
这几天🐏了,好难受
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2024-1-26 21:47:03 | 显示全部楼层
39度烧了四天。终于恢复了,,,我学到哪了来着
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

积分
131
发表于 2024-1-28 16:17:07 | 显示全部楼层
蜂鸣器作业
主函数功能实现
应该没啥问题

  1. void Diancilu(void)                //电磁炉的功能
  2. {
  3.         if( KEY1 == 0  )                //开关机键
  4.         {
  5.                 delay_ms(10);
  6.                 if(  KEY1 == 0 )
  7.                 {
  8. //----------------------还没有开机的时候,执行这个开机功能---------------------                       
  9.                         if( Run_Flag==0 )                        //还没有开机
  10.                         {
  11.                                 Run_Flag = 1;                        //开机变量改为1,表示已经开机了
  12.                                 BEEP = 0;                                //打开蜂鸣
  13.                                 delay_ms(10);                        //延时10ms
  14.                                 BEEP = 1;                                //关闭蜂鸣
  15.                                 P40 = 0;                                //打开led的总电源
  16.                                 P6 = 0X00;                                //点亮全部LED
  17.                                 delay_ms(200);                        //延时200ms
  18.                                 P6 = 0XFF;                                //熄灭全部LED
  19.                         }
  20. //----------------------已经开机的时候,执行这个关机功能---------------------                               
  21.                         else
  22.                         {
  23.                                 Run_Flag = 0;
  24.                                 BEEP = 0;                                //打开蜂鸣
  25.                                 delay_ms(10);                        //延时10ms
  26.                                 BEEP = 1;                                //关闭蜂鸣       
  27.                                 P6 = 0XFF;                                //熄灭全部LED       
  28.                                 Run_Mode = 0;                        //模式清0
  29.                                 Run_Now         = 0;                        //运行的模式改成停止                       
  30.                         }
  31.                         while(  KEY1 == 0 );                //按钮按下,并等待按钮松开
  32.                 }
  33.         }
  34.        
  35.         if( KEY2 == 0 )                                        //切换模式
  36.         {
  37.                 delay_ms( 10 );
  38.                 if( KEY2 == 0 )
  39.                 {
  40.                        
  41.                         if( Run_Now==0 )                //如果没在工作
  42.                         {
  43.                                 BEEP = 0;                                //打开蜂鸣
  44.                                 delay_ms(10);                        //延时10ms
  45.                                 BEEP = 1;                                //关闭蜂鸣                       
  46.                                 Run_Mode ++;                        //模式选择
  47.                                 if( Run_Mode>8 )                //如果模式>8
  48.                                         Run_Mode = 1;                //回到模式1
  49.                                
  50.                                 P6 = ~(1<< (Run_Mode-1));                //1<<1      0000 0001 -> 1111 1110  
  51.                        
  52.                         }
  53.                         while( KEY2 == 0);                //等待松开执行了
  54.                        
  55.                 }
  56.         }
  57.        
  58.         if( KEY3 == 0 )                //按键按下才会执行里面得大括号
  59.         {
  60.                 delay_ms( 10 );
  61.                 if( KEY3 == 0 )
  62.                 {
  63.                         if( Run_Mode>0 )                //已经选择了模式
  64.                         {
  65.                                 BEEP = 0;                                //打开蜂鸣
  66.                                 delay_ms(10);                        //延时10ms
  67.                                 BEEP = 1;                                //关闭蜂鸣                               
  68.                                 Run_Now = !Run_Now;                //运行和停止之间的切换
  69.                         }
  70.                         while( KEY3 == 0);                //等待松开执行了
  71.                 }
  72.         }
  73.         if( Run_Now == 1 )                //正在运行
  74.         {
  75.                 P6 = 0XFF;                                        //全部熄灭
  76.                 delay_ms(200);
  77.                 P6 = ~(1<< (Run_Mode-1));        //点亮这个灯
  78.                 delay_ms(200);
  79.         }
  80.         else                                        //停止运行
  81.         {
  82.                 P6 = ~(1<< (Run_Mode-1));
  83.         }
  84. }
复制代码



回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-6 22:07 , Processed in 0.151361 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表