建议提前送实验箱,提高学习效率
谢谢!
实验箱已经在路上啦!
{:4_213:}{:4_213:}{:4_213:} 本帖最后由 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.最后刷入固件
最后一次手动刷入固件,接下来每一次更新代码,开发板都可以自动下载编译的固件了
感谢分享 已解决 做作业的效率出乎意外的高,我又回来更新啦!!!
今天的笔记是第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;
}
前几天出去旅游了,比较累。明天开始更新{:4_266:} 第八章,蜂鸣器的使用
首先是试验性的代码——按下蜂鸣器启动,再按一下关闭
void main()
{
sys_init();
while(1)
{
delay_ms(1);
if(KEY1==0)
{
delay_ms(20);
while(KEY1==0);
delay_ms(20);
BEEP=~BEEP;
}
}
}省略了部分过程,但是能达成目的。
这几天期末考试完成,目前回到家里了
继续更新继续更新!!!
第八集:蜂鸣器的应用
控制原理:
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
}
}
}
课后作业:
阿巴阿巴
让我想想
这几天🐏了,好难受{:4_260:} 39度烧了四天。终于恢复了,,,我学到哪了来着{:4_260:} 蜂鸣器作业
主函数功能实现
应该没啥问题
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]