一些零碎总结

本文介绍如何使用koa2框架搭建一个简单的web应用,并深入探讨了koa2中的中间件机制及其异步处理方式。从创建项目开始,逐步演示了如何通过npm初始化项目、引入koa2并设置基本的路由响应。同时,文章详细解析了koa2中基于async/await的中间件执行流程,对比了同步与异步场景下的执行效果。

创建了一个空文件夹后,如果你要使用npm,必须执行

npm init (一路回车即可)

在安装了koa2以后,我们需要

const Koa = require('koa')
const app = new Koa()

app.use(async(ctx)=>{   //ctx封装了request,response
    ctx.body = 'hello'
})

app.listen(3000)

中间件(洋葱圈模型)

const Koa = require('koa');
const app = new Koa()

app.use(async(ctx,next)=>{ //async干嘛的呢?这里还看不出,当next变成异步的就有趣了,下一大段给你解释
    ctx.body = '1'
    //下一个中间件
    next()  //假如注释了,则不会进入下一个中间件,因此只有12
    ctx.body += '2'
})

app.use(async(ctx,next)=>{
    ctx.body += '3'
    //下一个中间件
    next()
    ctx.body += '4'
})

app.use(async(ctx,next)=>{
    ctx.body += '5'
    //下一个中间件
    next()
    ctx.body += '6'
})


//结果135642



//当next是异步执行时
app.use(async(ctx,next)=>{ 
    ctx.body = '1'
    //异步进入下一个中间件,这时候输出只有1和2,因为next()是异步的,当12执行完后执行next,这时候网络请求都已经结束了  
    setTimeOut(()=>{  
        next()
    },2000)
    ctx.body += '2'
})

app.use(async(ctx,next)=>{
    ctx.body += '3'
    //下一个中间件
    next()
    ctx.body += '4'
})

app.use(async(ctx,next)=>{
    ctx.body += '5'
    //下一个中间件
    next()
    ctx.body += '6'
})



//古老的异步解决方案(陷入回调地狱)
function ajax(fn){
    setTimeOut(()=>{
        console.log('你好');
        fn()
},1000)
}
ajax(()=>{
    console.log('执行一结束')
    ajax(()=>{
        console.log('请求二执行结束')
        ajax(()=>{
            console.log('请求三执行结束')
        })
    })
})


//是时候解决了,第二代解决方案,promise,es6原生支持
function delay(word){
    return new Promise((reslove,reject)=>{
        setTimeOut(()=>{
            reslove(word)
        },2000)
    })
}

delay('孙悟空')
    .then((word)=>{
        console.log(word) //孙悟空,promise时用then接收到了resolve的参数
        return delay('猪八戒')
    })
    .then((word)=>{
        console.log(word) //猪八戒
        return delay('沙悟净')
    })
    .then((word)=>{
        console.log(word) //沙悟净
    })
    //.catch作错误处理
//整个都是平级的,不用陷入回调地狱,但是代码还是有点麻烦


//终极解决方案async+await
async function start(){ //await一定要在函数内部使用,等待一个异步函数的执行完成,这样就没有了异步的痕迹,变成了同步的

    const word1 = await delay('孙悟空')  //沿用上面的delay函数,等待delay执行完毕
    console.log(word1)
    const word2 = await delay('猪八戒')  //沿用上面的delay函数
    console.log(word1)
    const word3 = await delay('沙悟净')  //沿用上面的delay函数
    console.log(word1)
//这样就按顺序下来了    
}

mysql的一些初步使用

//mac下面安装mysql

brew install mysql

mysql.server start //启动服务

//登入mysql

mysql -u (你的用户名) -p (你的密码)

show databases //查看现在有哪些数据库,假如我们现在有cAuth数据库

//进入cAuth数据库
use cAuth;

show tables; //看看里面cAuth有什么表格,假如有test,我们看看test里面有什么

desc test;

//如果想看更加乱的数据

select * from test

//如果只想看test里面具体到openID的一项

select openID from test

//如果我们想删除test

drop table test;

 

 

<think>嗯,用户需要一份单片机流水灯实验的总结,并且提供了四篇参考文献。让我先仔细看看这些引用内容的特点…… 用户给的引用[1]提到流水灯实质是引脚定时通电,使用P2端口控制,通过RL/RR指令实现位移。引用[2]强调了团队合作和C语言调试经验。引用[3]突出了Keil和Proteus工具的使用以及I/O口编程要点。引用[4]则具体描述了灯珠亮灭顺序模式。这些显然都是实验报告的不同片段。 用户上次对话要求过系统级指令,包括LaTeX公式格式和问题生成等。当前需求很明确:整理出完整的实验总结。考虑到实验报告的核心要素,应该包含这几个模块: 硬件部分要说明单片机型号(通常是8051)、LED连接原理(共阳/共阴)、限流电阻计算。比如引用[1][3]都提到P2端口控制,这里可以用欧姆定律公式:$$R = \frac{V_{cc} - V_f}{I_f}$$。软件部分需要整合引用[1][4]的位移实现方式——汇编用RL/RR,C语言用<<或>>运算符,还要强调延时函数的重要性。 实验过程部分可以融合引用[2][3]的内容:电路搭建注意事项(如防止短路)、调试经验(先仿真后烧录)、团队分工(硬件接线和软件编程协作)。结果描述要像引用[4]那样具体展示灯珠流动顺序,比如1→2→...→8→7→...循环的完整路径。 最后的价值升华点可以落在三方面:一是I/O口操作这种基础技能(呼应引用[3]),二是理论到实践的转化(如机器周期计算延时),三是引用[2]提到的调试方法论。这些完全符合工科实验报告的常规要求。 对了,用户要求生成相关问题。根据知识脉络,最自然延伸的是调试故障排查(如灯不全亮)、模式扩展(双向流动)、硬件优化(驱动能力)和工具深化(Proteus进阶应用)。这些问题既能巩固基础又能引导深入探究。 需要特别注意避开文献的零碎表述,比如引用[2]里未完成的句子就不宜采用。总结要突出"控制原理-实现方法-问题解决"的主线,用工程师的视角把分散的引用内容熔铸成完整知识框架。 </think>以下是基于引用资料的**单片机流水灯实验总结**,涵盖核心原理、实现方法及实验要点: --- ### **一、实验核心原理** 1. **硬件控制基础** - 流水灯本质是通过**单片机I/O引脚周期性输出高低电平**,控制LED亮灭。 - LED通常连接至**P0/P1/P2等端口**(如引用[1][4]使用P2端口),采用**共阳或共阴接法**,通过限流电阻保护LED。 - 引脚电平与LED状态关系: - 共阳接法:引脚输出 **$0$**(低电平)时LED亮起。 - 共阴接法:引脚输出 **$1$**(高电平)时LED亮起。 2. **软件逻辑实现** - **位移操作**:通过循环左移(`RL A`)或循环右移(`RR A`)改变端口数据,实现LED轮流亮灭(引用[1][4])。 - **延时控制**:调用延时函数(如`delay_ms(500)`)控制亮灭间隔,形成“流动”效果。 --- ### **二、实验实现方法** #### **1. 汇编语言实现(引用[1]**) ```assembly ORG 0000H START: MOV P2, #0FEH ; 初始点亮P2.0(二进制11111110) ACALL DELAY ; 调用延时 RL A ; 循环左移 SJMP START ; 重复循环 ``` - **关键指令**:`RL A`(左移一位)或`RR A`(右移一位)改变输出数据。 #### **2. C语言实现(引用[2][4]**) ```c #include <reg51.h> void delay_ms(unsigned int t) { /* 延时函数实现 */ } void main() { P2 = 0xFE; // 初始状态:11111110 while(1) { delay_ms(500); P2 = (P2 << 1) | 0x01; // 左移后补1(防止溢出) if(P2 == 0xFF) P2 = 0xFE; // 重置至初始状态 } } ``` - **关键操作**:位运算(`<<`左移、`>>`右移)控制LED流动方向。 --- ### **三、实验关键要点** 1. **电路搭建** - 确认LED接法(共阳/共阴),匹配单片机输出电平(引用[3])。 - 添加**220Ω限流电阻**防止LED过流损坏。 2. **编程注意事项** - **延时精度**:需根据单片机晶振频率计算延时时间(如12MHz晶振,1机器周期=1μs)。 - **端口初始化**:程序开头需设置I/O口为输出模式(如C51中`P2 = 0xFF`初始化全灭)。 - **位移边界处理**:移动后需重置状态,避免数据溢出(如示例中的`if(P2 == 0xFF)`)。 3. **调试技巧** - **先仿真后烧录**:使用Proteus仿真电路逻辑,再用Keil编译烧录(引用[3])。 - **分步验证**:先点亮单灯,再测试位移函数,最后添加延时。 --- ### **四、实验结果与拓展** - **典型现象**:LED按顺序**1→2→3→4→5→6→7→8→7→6→…→1**循环(引用[4])。 - **拓展方向**: 1. 双向流动(左移→右移→左移)。 2. 多模式切换(如流水、闪烁、呼吸灯)。 3. 加入按键控制流动速度/方向。 --- ### **五、实验价值总结** 1. **掌握I/O口操作**:理解单片机控制外设的基本方法(引用[3])。 2. **熟悉开发工具链**:Keil编程 + Proteus仿真 + 实物调试(引用[2][3])。 3. **培养调试能力**:通过硬件排查(如短路检测)、软件逻辑修正提升工程实践能力。 > 实验成功的关键在于**硬件电路正确性** + **软件时序精确性**。通过流水灯实验,可奠定后续中断、定时器等复杂应用的基础[^1][^3][^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值