Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我用 Vue3+Ts+Vite2 写了一个美女小黄站

我用 Vue3+Ts+Vite2 写了一个美女小黄站

作者头像
公众号---人生代码
发布于 2021-04-22 03:24:32
发布于 2021-04-22 03:24:32
4.6K219
代码可运行
举报
文章被收录于专栏:人生代码人生代码
运行总次数:19
代码可运行

首先使用以下命令创建项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn create @vitejs/app vue3-ts-vite2 --template vue-ts

vite.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  base: './', // 打包路径
  resolve: { // 解析
    alias: { // 重命名路劲
      '@': path.resolve(__dirname, './src')
    }
  },
  server: {
    port: 4000, // 服务端口
    open: true, // 是否自动打开浏览器
    host: 'localhost', // 主机名字
    proxy: { // 代理
      '/api': {
        target: '/api',
        changeOrigin: true,
        ws: false,
        rewrite: path => path.replace(/^\/api/, '')
      }
    },
    cors: true
  }
})

tsconfig.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "lib": ["esnext", "dom"],
    "types": ["vite/client"]
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

postcss.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
    "plugins": {
        "postcss-pxtorem": {
            rootValue: 37.5,
            // Vant 官方根字体大小是 37.5
            propList: ['*'],
            selectorBlackList: ['.norem']
            // 过滤掉.norem-开头的class,不进行rem转换
        }
    }
}

package.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "name": "vue3-vite2-ts",
  "version": "0.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "serve": "vite preview"
  },
  "dependencies": {
    "@types/node": "^14.14.37",
    "axios": "^0.21.1",
    "jsonwebtoken": "^8.5.1",
    "mockjs": "^1.1.0",
    "vant": "^3.0.11",
    "vue": "^3.0.10",
    "vue-router": "4",
    "vuex": "^4.0.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^1.1.5",
    "@vue/compiler-sfc": "^3.0.5",
    "postcss-pxtorem": "^6.0.0",
    "sass": "^1.32.8",
    "typescript": "^4.1.3",
    "vite": "^2.1.3",
    "vue-tsc": "^0.0.8"
  }
}

index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="icon"
        href="/favicon.ico" />
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, user-scalable=no" />
  <title>Vite App</title>
</head>

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.ts"></script>
</body>

</html>

src/api/request.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import axios from 'axios'

const service = axios.create({ // 创建服务
    baseURL: '/api/',
    timeout: 5000
})

service.interceptors.request.use(config => { // 请求拦截处理
    const token = window.localStorage.getItem("accessToken")
    if (token) {
        config.headers.common.Authorization = token
    }
    return config
}, error => {
    return Promise.reject(error)
})

service.interceptors.response.use(response => { // 响应拦截处理
    const res = response.data
    if (response.status !== 200) {
        return Promise.reject(new Error(res.message || 'Error'))
    } else {
        return res
    }
}, error => {
    return Promise.reject(error)
})

export default service

src/api/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import type { AxiosPromise } from 'axios'
import request from './request'

// 获取首页banner新闻数据
export const getBannerList = (): AxiosPromise => {
    return request({
        url: '/bannerList'
    })
}

//  获取首页newsList数据
export const getNewsList = (): AxiosPromise => {
    return request({
        url: '/newsList'
    })
}

//获取newsDetail数据
export const getNewsDetail = (id: any): AxiosPromise => {
    return request.post('/detailList', {
        id
    })
}

// 登录验证
export const toLogin = (data: Object): AxiosPromise => {
    return request.post('/login', data)
}

export default {
    getBannerList,
    getNewsList,
    getNewsDetail,
    toLogin
}

src/api/mock.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Mock from 'mockjs'
interface Data {
    id?: string | number,
    title?: string,
    images?: string | Array<string>,
    author?: string,
    token?: string
}

const bannerData: Array<Data> = [
    {
        "id": "1",
        "images": "./2021-02-27/1.jpg",
        "title": "翘屁美女"
    },
    {
        "id": "2",
        "images": "./2021-02-27/2.jpg",
        "title": "青春美女"
    },
    {
        "id": "3",
        "title": "翘屁美女",
        "images": "./2021-02-27/3.jpg",
    },
    {
        "id": "4",
        "title": "性感美女",
        "images": "./2021-02-27/4.jpg",
    },
    {
        "id": "5",
        "title": "哈哈美女",
        "images": "./2021-02-27/5.jpg",
    },
    {
        "id": "6",
        "title": "性感美女",
        "images": "./2021-02-27/6.jpg",
    },
    {
        "id": "7",
        "title": "爱笑美女",
        "images": "./2021-02-27/7.jpg",
    },
    {
        "id": "8",
        "title": "哈哈美女",
        "images": "./2021-02-27/8.jpg",
    },
    {
        "id": "9",
        "title": "爱笑美女",
        "images": "./2021-02-27/9.jpg",
    },
    {
        "id": "10",
        "title": "爱笑美女",
        "images": "./2021-02-27/10.jpg",
    },
    {
        "id": "11",
        "title": "爱笑美女",
        "images": "./2021-02-27/11.jpg",
    },
    {
        "id": "12",
        "title": "爱笑美女",
        "images": "./2021-02-27/12.jpg",
    },
    {
        "id": "13",
        "title": "爱笑美女",
        "images": "./2021-02-27/13.jpg",
    },
    {
        "id": "14",
        "title": "爱笑美女",
        "images": "./2021-02-27/14.jpg",
    },
    {
        "id": "15",
        "title": "爱笑美女",
        "images": "./2021-02-27/15.jpg",
    },
]

const newsData: Array<Data> = [
    {
        "id": "1",
        "images": ["../assets/logo.png"],
        "title": "金发碧眼为什么很少在白人以外的种族出现?",
        "author": "作者 / biokiwi"
    },
    {
        "id": "2",
        "title": "《哈利波特》原著中与电影中人物有哪些差别?",
        "author": "作者 / kalinnn",
        "images": ["../assets/logo.png"]
    },
    {
        "id": "3",
        "title": "有哪些适合情侣两个人一起玩的桌游?",
        "author": "作者 / 北邙",
        "images": ["../assets/logo.png"]
    }
]

const loginData: Data = {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOjEsImlhdCI6MTU5NDI2MjQ5NSwiZXhwIjoxNTk0MzQ4ODk1fQ.1MJ_MAFgpBjOjpggj69Xz8F_evBcMAenRK_7a8fdVrc"
}

Mock.mock('/api/bannerList', 'get', {
    "data": bannerData
})

Mock.mock('/api/newsList', 'get', {
    "data": newsData
})


Mock.mock('/api/login', 'post', {
    "data": loginData
})

src/api/token.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jwt from 'jsonwebtoken'
const jwtScrect: string = "accessToken"
const genToken = (username: string, password: string): string => {
    const token: string = jwt.sign({ username, password }, jwtScrect, { expiresIn: '24h' })

    return token
}

export default {
    genToken
}

src/components/Banner/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="swipe-content">
    <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white" lazy-render>
      <van-swipe-item v-for="item in bannerData" :key="item.id">
        <img :src="item.images" class="img" :alt="item.title" @click="toDetail(item)" />
      </van-swipe-item>
    </van-swipe>
  </div>
</template>
<script>
import { useRouter } from "vue-router";
export default {
  name: "Banner",
  props: {
    bannerData: {
      type: Array
    }
  },
  setup(props) {
    const router = useRouter();
    const toDetail = item => {
      router.push({
        name: "Detail",
        params: {
          id: item.id,
          item: JSON.stringify(item)
        }
      });
    };

    return {
      toDetail
    };
  }
};
</script>
<style lang="scss" scoped>
.img {
  width: 100%;
  height: 100%;
}
.my-swipe {
  width: 100%;
}
.my-swipe .van-swipe-item {
  width: 100%;
  //   color: #fff;
  font-size: 1rem;
  //   line-height: 6rem;
  text-align: center;
  background-color: #fff;
}
</style>

src/router/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'

const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        name: 'Home',
        meta: {
            title: "首页",
            keepAlive: true,
            requireAuth: true
        },
        component: () => import("../views/Home/index.vue")
    },
    {
        path: '/select',
        name: 'Select',
        meta: {
            title: "选项",
            keepAlive: true,
            requireAuth: true
        },
        component: () => import("../views/Select/index.vue")
    },
    {
        path: '/detail/:id/:item',
        name: 'Detail',
        meta: {
            title: "选项",
            keepAlive: true,
            requireAuth: true
        },
        component: () => import("../views/Detail/index.vue")
    },
    {
        path: '/login',
        name: 'Login',
        meta: {
            title: "登录",
            keepAlive: true
        },
        component: () => import("../views/Login/index.vue")
    }
]

const router = createRouter({
    history: createWebHashHistory(),
    routes
})

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {  // 判断该路由是否需要登录权限
        if (window.localStorage.getItem('accessToken')) {  // 通过vuex state获取当前的token是否存在
            next();
        }
        else {
            next({
                path: '/login',
                query: { redirect: to.fullPath }  // 将跳转的路由path作为参数,登录成功后跳转到该路由
            })
            window.localStorage.clear()
        }
    }
    else {
        next();
    }
})

export default router

src/store/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createStore } from 'vuex'
export default createStore({
    state: {
        listData: { 1: 10 },
        num: 10
    },
    mutations: {
        setData(state, value) {
            state.listData = value
        },
        addNum(state) {
            state.num = state.num + 10
        }
    },
    actions: {
        setData(context, value) {
            context.commit('setData', value)
        }
    },
    modules: {}
})

src/utils/rem.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { stringifyQuery } from "vue-router"

const baseSize: number = 37.5

function setRem() {
    const scale: number = document.documentElement.clientWidth / 375
    document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
}

setRem()

window.onresize = function () {
    setRem()
}

src/views/Detail/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="detail-wrap">
    <p class="title">{{item.title}}</p>
    <div class="img" v-for="(img, index) in item.imgs" :key="index">
      <img :src="img" class="img" />
    </div>
  </div>
</template>

<script lang="ts">
import { useRoute } from "vue-router";
import { reactive, toRefs, computed } from "vue";
export default {
  name: "Detail",
  setup(props) {
    interface Data {
      id?: string | Array<string>;
      item?: Object;
    }
    let data: Data = {
      id: "",
      item: Object
    };
    const state = reactive(data);

    const route = useRoute();
    const item = computed(() => route.params.item).value;
    state.id = computed(() => route.params.id).value;
    state.item = JSON.parse(item);

    return {
      ...toRefs(state)
    };
  }
};
</script>

<style lang="scss" scoped>
.detail-wrap {
  width: 100%;
  .title {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    color: #cccc;
    font-size: 20px;
    margin-block-start: 0;
    margin-block-end: 0;
    background-color: #2c323c;
  }
  .img {
    width: 100%;
    height: 100%;
  }
}
</style>

src/views/Select/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="select-wrap">
    <van-radio-group
      v-model="state.checked"
      direction="horizontal"
      :icon-size="30"
      @change="change"
    >
      <van-radio name="1"></van-radio>
      <van-radio name="2"></van-radio>
    </van-radio-group>
  </div>
</template>

<script lang="ts" setup="props">
import { ref, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
const state = ref({
  checked: ""
});
const { ctx } = getCurrentInstance();

const change = (e: string) => {
  const num = parseInt(e);
  switch (num) {
    case 1:
      console.log("男");
      ctx.$toast({
        type: "text",
        message: "暂无帅哥"
      });
      break;
    case 2:
      console.log("女");
      setTimeout(() => {
        router.push("/");
      }, 1000);
      break;
    default:
  }
};
</script>

<style lang="scss" scoped>
.select-wrap {
  width: 100%;
  height: 100%;
  background-color: #ebfff0;
  display: flex;
  justify-content: center;
  flex-direction: row;
  align-items: center;
  ::v-deep .van-radio__label {
    font-size: 30px;
  }
}
</style>

src/views/Home/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="home">
    <p class="text">美女图片预览</p>
    <banner :bannerData="state.bannerData"></banner>
    <van-loading color="#1989fa" v-if="state.loading" />
  </div>
</template>
<script lang="ts" setup="props">
import { reactive, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { useStore } from "vuex";
import { getBannerList } from "../../api/index";

const router = useRouter();
const store = useStore();

// 获取上下文对象
const { ctx } = getCurrentInstance();

// 定义响应式数据
const state = reactive({
  color: "#ccc",
  bannerData: [],
  loading: false
});

const initFN = () => {
  ctx.$toast({
    type: "fail",
    message: "请求失败"
  });
  state.loading = false;
};

// DOM 加载完成后更新数据
onMounted(() => {
  state.loading = true;
  getBannerList()
    .then(
      (res: any) => {
        state.loading = false;
        state.bannerData = res.data;
        ctx.$toast({
          type: "success",
          message: "请求成功"
        });
        console.log(res);
      },
      error => {
        initFN();
      }
    )
    .catch(error => {
      initFN();
    });
});
</script>
<style lang="scss" scoped>
.home {
  height: 100%;
}
.text {
  color: v-bind("state.color");
  font-size: 20px;
  margin-block-start: 0;
  margin-block-end: 0;
  background-color: #2c323c;
}
.login {
  width: 100%;
  height: 100px;
  line-height: 100px;
  background-color: pink;
}
</style>

src/views/Login/index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div class="login">
    <div class="passw-name-box">
      <div class="name">
        <i class="name-img"></i>
        <input v-model="state.userName" type="text" placeholder="请输入用户名" />
      </div>
      <div class="name">
        <i class="passw-img"></i>
        <input v-model="state.passWord" type="password" placeholder="请输入密码" />
      </div>
      <div>
        <van-button type="primary" @click="login">登录</van-button>
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup="props">
import { reactive, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { toLogin } from "../../api/index";
const router = useRouter();

const { ctx } = getCurrentInstance();

const state = reactive({
  userName: "",
  passWord: ""
});

const initError = () => {
  ctx.$toast({
    type: "fail",
    message: "登录失败"
  });
  window.localStorage.clear();
  router.push("/login");
};

const login = async () => {
  if (!state.userName) {
    ctx.$toast({
      type: "text",
      message: "请输入用户名"
    });
    return;
  }

  if (!state.passWord) {
    ctx.$toast({
      type: "text",
      message: "请输入密码"
    });
    return;
  }
  toLogin({ userName: state.userName, passWord: state.passWord })
    .then(
      res => {
        ctx.$toast({
          type: "success",
          message: "登录成功"
        });

        // 设置 token
        window.localStorage.setItem("accessToken", res.data.token);
        console.log("res===>", res);
        router.push("/select");
      },
      error => {
        initError();
      }
    )
    .catch(error => {
      initError();
    });
};
</script>

<style lang="scss" scoped>
.login {
  display: flex;
  flex-direction: column;
  justify-content: center;
  height: 100%;
  background: url("./login/bgimg.jpg") no-repeat;
  background-size: 100% 100%;
  background-position: 100% 100%;
  .passw-name-box {
    display: flex;
    flex-direction: column;
    justify-content: center;
    .name {
      display: flex;
      justify-content: center;
      padding: 5px 10px;
      input {
        width: 250px;
        height: 32px;
        outline: none;
        border: none;
        font-size: 16px;
        margin-left: 10px;
      }
      .name-img {
        display: block;
        width: 32px;
        height: 32px;
        background: url("./login/sno.png") no-repeat;
        background-size: 100% 100%;
      }
      .passw-img {
        display: block;
        width: 32px;
        height: 32px;
        background: url("./login/pasw.png") no-repeat;
        background-size: 100% 100%;
      }
    }
  }
}
</style>

src/App.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div style="height: 100%;">
    <router-view></router-view>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "App"
});
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  /* width: 100%; */
  height: 100%;
}
html,
body {
  height: 100%;
  /* width: 100%; */
  overflow-x: hidden;
}
</style>

src/main.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store/index'
import 'vant/lib/index.css'
import vant from 'vant'

import { Toast } from 'vant'
import "./utils/rem"
import './api/mock'
import Banner from "./components/Banner/index.vue"
const app = createApp(App)
app.component('banner', Banner).use(router).use(store).use(vant).mount('#app')
app.config.globalProperties = {
    "$toast": Toast,
}

src/shims-vue.d.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare module '*.vue' { // 定义 .vue 文件模块
  import { DefineComponent } from 'vue'
  const component: DefineComponent<{}, {}, any>
  export default component
}

declare module 'mockjs' // 定义 mockjs 模块
declare module 'jsonwebtoken' // 定义 jsonwebtoken 模块
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
工程购买连接有新的吗
工程购买连接有新的吗
回复回复点赞举报
工程购买链接怎么失效了
工程购买链接怎么失效了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现。关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用,不会发现,复杂使用就很容易踩到了。
Simon223
2018/09/04
1.2K0
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使用到定时采集。定时采样有如下三种方法:
wenzid
2021/03/04
9.6K0
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
开发者成长激励计划-基于TencentOS Tiny 的加热不燃烧烟具温度检测设备
此次开发和编译坏境是沁恒微的MounRiver Studio软件,此软件用熟了感觉你keil好用太多了,并且还是免费的开发软件。具体如何好,只有真正使用来开发的各位工程师能明白,在此就不多说了。界面如下图所示:
Torry
2022/08/08
3110
开发者成长激励计划-基于TencentOS Tiny 的加热不燃烧烟具温度检测设备
stm32f103波形发生器_示波器波形分析
摘要
全栈程序员站长
2022/11/04
1.9K2
STM32中AD采样的三种方法分析
在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式。三种方法按照处理复杂方法DMA模式处理模式效率最高,其次是中断处理模式,最差是查询模式,相信很多学者在学习AD采样程序时,很多例程采用DMA模式,在这里我针对三种程序进行分别分析。
用户6754675
2020/07/08
1.5K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但
杨奉武
2018/04/18
1.2K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
开发者成长激励计划-基于TencentOS Tiny 的物联网小车机械臂
随之物联网的发展,各类设备都能通过物联网进行控制,本次方案尝试了通过腾讯物联网平台实现设备控制设备的功能,使用了小型机械臂和小车进行测试,验证控制的物联网控制的实时性。机械臂由5个舵机实现5个自由度。小车由一个转向舵机和一个驱动电机组成。控制端采用WCH沁恒RISC-V TencentOS Tiny CH32V_EVB_AIoT RevB02开发套件负责读取电位器和姿态传感器数据并上传到云端,执行端由STM32L431RCT6控制器负责驱动电机和舵机。
海内天涯
2022/08/06
1.2K0
开发者成长激励计划-基于TencentOS Tiny 的物联网小车机械臂
STM8S——Analog/digital converter (ADC)
本文介绍了如何使用STM8S105F4单片机实现一个ADC1型的模拟数字转换器,通过硬件电路和软件程序的设计,实现电压信号的采集、处理和存储,并可通过指令控制ADC1的工作状态以及读取转换结果。
Christal_R
2017/12/25
1.9K0
STM32单片机-输入捕获、FFT测频
​本内容介绍基于STM32F103VET6的一个实际工程中添加采集A相电压信号或B相电流信号频率的功能,分别通过输入捕获与FFT实现,均测试可用。持续更新,原创不易!
爱上电路设计
2024/05/28
5560
STM32单片机-输入捕获、FFT测频
蓝桥杯嵌入式之光敏电阻、ADC*2讲解
Tr AO是光敏值的输出端,Tr DO是判断器LM393D的输出端,它是比较光敏电阻的电压和滑动变阻器电压的大小。
用户5935416
2019/08/01
1.4K0
蓝桥杯嵌入式之光敏电阻、ADC*2讲解
STM32 BMP280模块 获取气压温度高度传感器数据
BMP280是博世最新推出的数字气压传感器,具有卓越的性能和低廉的价格,相对精度为±0.12 hPa(相当于±1米),传感器功耗仅有2.7μA,包括压力和温度测量功能。
CoderEnd
2023/05/07
1.1K0
STM32 BMP280模块 获取气压温度高度传感器数据
2016TI杯——寻迹小车
B题:自动循迹小车 1.任务 设计制作一个自动循迹小车。小车采用一片 TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。
全栈程序员站长
2022/06/26
7020
2016TI杯——寻迹小车
M-Arch(5)第四个示例:ADC&DMA
本文我们将总结下ADC和DMA的基本使用方法,并给出示例,从中我们可以看到GD和STM在设计上的差别。
滚神大人
2021/10/08
6500
2016年四川省TI杯电子设计竞赛B题
B题:自动循迹小车 1.任务 设计制作一个自动循迹小车。小车采用一片 TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。
全栈程序员站长
2022/06/26
7560
2016年四川省TI杯电子设计竞赛B题
蓝桥杯嵌入式之扩展板数码管、ADC按键讲解
蓝桥杯嵌入式扩展板有三个共阴数码管,用3个74LS595来控制。74LS595是串/并转换,在时钟信号的作用下,将串口输入的8个高低电平锁存到芯片中并并行输出。如同单片机中的LED点阵。其电路图为
用户5935416
2019/08/01
1.1K0
蓝桥杯嵌入式之扩展板数码管、ADC按键讲解
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。**改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。**因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。 传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
全栈程序员站长
2022/08/23
10.5K2
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
开发者成长激励计划-基于TencentOS Tiny的植物土壤湿度监测机
本次有幸参与开放原子开源基金会举办的开发者成长激励计划,植物土壤湿度监测机基于TencentOS Tiny CH32V_EVB RISC-V开发套件(采用WCH的RISC-V CH32V307VCT6 MCU)开发套件,外接WiFi模组及土壤湿度传感器监测植物生长环境湿度数据上传至云端,支持本地自动水泵运行,也可以通过腾讯云IoT实现云端手动控制水泵。
不爱吃胡萝卜
2022/08/11
8010
开发者成长激励计划-基于TencentOS Tiny的植物土壤湿度监测机
(29)STM32——PWM DAC实验笔记
目录 学习目标 成果展示  介绍 简介 硬件 代码 总结  ---- 学习目标         本节内容讲解的是有关PWM转DAC的知识点,其实这种做法我们已经不陌生了,因为在学习51单片机的时候,DA也是通过PWM来实现的。51单片机——AD/DA转换,好了,接下来就让我们开始吧! 成果展示  https://live.csdn.net/v/embed/233690 PWM DAC 介绍 简介         PWM 本质上其实就是是一种周期一定,而高低电平占空比可调的方波。      
小点点
2022/12/12
1.3K0
(29)STM32——PWM DAC实验笔记
STM32(七)------- PWM输出
我们在日常的嵌入式开发中,PWM可以说是我们最常用的一个技术。我们在电机驱动、电压控制、从测量、通信到功率控制与变换的许多领域中,PWM有着无比重要的地位。
跋扈洋
2022/06/24
3.3K1
STM32(七)------- PWM输出
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
1.原理: 通过定时器每隔一段时间触发一次DAC转换,然后通过DMA发送正玄波码表值给DAC. 当需要改变频率HZ时,只需要修改定时器频率即可(最高只能达到20KHz) 当需要改变正玄波的正峰峰值/负峰峰值时,只需要修改正玄波码表即可 2.实现 代码如下所示(采用的是定时器2,DAC引脚是PA4) #define HZ(x) (u16)(72000000/sizeof(Sine12bit)*2/x) //计算Hz #define DAC_DHR12R1 0x40007408 //外设DAC通道1的
诺谦
2018/04/17
3K1
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
推荐阅读
相关推荐
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验