第 37 章 - Go 语言 持续集成与持续部署

第37章 - 持续集成与持续部署 (CI/CD) 是软件开发流程中的重要组成部分,它帮助团队提高代码质量、加快发布速度并减少手动错误。接下来,我将概述 CI/CD 的基本概念,并通过 Jenkins 和 GitHub Actions 两个工具来讲解如何配置它们以支持 Go 语言项目。最后,我会提供一个简单的案例及相应的源代码。

CI/CD 基本概念

持续集成 (Continuous Integration, CI) 是一种实践,其中团队成员频繁地将他们的工作成果(通常是小的增量变更)合并到主分支中。每次合并后,都会通过自动化构建和测试来验证这些变更,从而尽早发现集成问题。

持续交付 (Continuous Delivery, CD) 是指在软件开发过程中,确保代码可以随时被可靠地发布到生产环境的能力。这通常涉及自动化部署过程,但实际的发布决策仍然是手动控制的。

持续部署 (Continuous Deployment) 则更进一步,不仅要求能够随时部署,而且是自动化的,即一旦代码通过了所有的测试,就直接部署到生产环境中。

Jenkins 配置

Jenkins 是一个开源自动化服务器,用于实现 CI/CD 流程。以下是如何为 Go 项目设置 Jenkins 的简单步骤:

  1. 安装 Jenkins:首先需要在你的服务器上安装 Jenkins。
  2. 创建新 Job:登录 Jenkins 后,在首页点击“新建任务”。
  3. 选择自由风格项目:选择这个选项,然后给你的项目命名。
  4. 源码管理:选择 Git 并输入你的仓库地址。
  5. 构建触发器:设定何时执行构建,例如当代码推送到特定分支时。
  6. 构建环境:根据需要配置环境变量等。
  7. 构建步骤:添加执行 shell 脚本或使用插件来编译 Go 代码。
  8. Post-build Actions:如果构建成功,可以定义一些后续操作,比如发送通知。

示例脚本可能如下:

# 安装依赖
go get -v -t -d ./...
# 编译
go build -o myapp
# 运行测试
go test -v ./...

GitHub Actions 结合 Go 语言

GitHub Actions 允许你在 GitHub 仓库中直接定义 CI/CD 工作流。对于 Go 项目,你可以创建一个 .github/workflows/ci.yml 文件来定义工作流。

这里是一个基础的 ci.yml 示例文件:

name: Go
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: '1.14'
    - name: Build
      run: go build -v ./...
    - name: Test
      run: go test -v ./...

这段 YAML 文件定义了一个工作流,该工作流会在每次推送代码到仓库时运行。它会检查代码,设置 Go 环境,然后执行构建和测试命令。

以上就是关于如何使用 Jenkins 和 GitHub Actions 来支持 Go 语言项目的 CI/CD 实践的基本介绍。

当然,我们可以在现有基础上进一步探讨如何在实际项目中更详细地配置 Jenkins 和 GitHub Actions 以支持 Go 语言的应用。这包括更加详细的步骤和最佳实践。

更详细的 Jenkins 配置

假设你已经安装了 Jenkins 并且可以访问它,接下来我们将深入到更具体的配置细节:

  1. 设置环境:确保你的 Jenkins 服务器上安装了 Go 环境。你可以通过全局工具配置来指定 Go 的安装路径。

  2. 创建流水线 Job:使用 Jenkins Pipeline 来定义 CI/CD 流程。Pipelines 是用 Groovy 脚本编写的,可以存储在 Jenkinsfile 中,并直接提交到源码仓库。

  3. Jenkinsfile 示例

    pipeline {
        agent any
        environment {
            GO_VERSION = '1.15'
        }
        stages {
            stage('Checkout') {
                steps {
                    git branch: 'main', url: 'https://github.com/yourusername/your-go-repo.git'
                }
            }
            stage('Setup') {
                steps {
                    sh 'go env -w GO111MODULE=on'
                    sh "curl -O https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz"
                    sh "sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz"
                    sh "export PATH=$PATH:/usr/local/go/bin"
                }
            }
            stage('Build') {
                steps {
                    sh 'go build -o myapp ./cmd/myapp'
                }
            }
            stage('Test') {
                steps {
                    sh 'go test -v ./...'
                }
            }
            stage('Deploy') {
                when {
                    branch 'main'
                }
                steps {
                    // 这里添加部署步骤
                    echo 'Deploying to production server...'
                }
            }
        }
    }
    
  4. 发布与部署:根据您的部署策略,您可能需要添加额外的步骤来将构建好的二进制文件部署到生产环境或测试环境。

GitHub Actions 的高级配置

对于 GitHub Actions,除了基本的构建和测试外,还可以加入缓存、依赖管理以及更复杂的部署流程。

  1. 缓存依赖:为了加快构建速度,可以通过缓存 Go 模块来避免每次运行时都下载相同的依赖。

  2. 示例 ci.yml 文件(含缓存)

    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: '1.15'
        - name: Cache Go modules
          uses: actions/cache@v2
          with:
            path: ~/go/pkg/mod
            key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
            restore-keys: |
              ${{ runner.os }}-go-
        - name: Build
          run: go build -v ./...
        - name: Test
          run: go test -v ./...
        - name: Run Linter
          run: go vet ./...
    
  3. 部署阶段:如果您想要在 GitHub Actions 中实现部署,可以利用特定的 Action 或者自定义脚本来完成。例如,可以使用 AWS CLI 或 Docker 来部署应用。

这些配置提供了更全面的 CI/CD 流水线示例,涵盖了从代码拉取、构建、测试直到部署的全过程。每个项目的具体需求可能会有所不同,因此请根据实际情况调整上述示例。

Jenkins 高级配置

环境变量管理
  • 定义全局环境变量:在 Jenkins 的“全局属性”中设置环境变量,这样可以在所有 Job 中使用。
  • Job 特定的环境变量:在具体的 Job 配置中定义环境变量,这些变量只对该 Job 有效。
多阶段构建
  • 多阶段流水线:可以定义多个阶段来处理不同的任务,例如编译、测试、打包和部署。每个阶段可以根据需要单独运行或跳过。
  • 示例 Jenkinsfile (多阶段)
    pipeline {
        agent any
        environment {
            GO_VERSION = '1.16'
        }
        stages {
            stage('Checkout') {
                steps {
                    git branch: 'main', url: 'https://github.com/yourusername/your-go-repo.git'
                }
            }
            stage('Setup') {
                steps {
                    sh 'go env -w GO111MODULE=on'
                    tool name: 'Go', type: 'go'
                }
            }
            stage('Build') {
                steps {
                    sh 'go build -o myapp ./cmd/myapp'
                }
            }
            stage('Test') {
                steps {
                    sh 'go test -v ./...'
                }
            }
            stage('Package') {
                when { branch 'main' }
                steps {
                    sh 'tar -czf myapp.tar.gz myapp'
                }
            }
            stage('Deploy') {
                when { branch 'main' }
                steps {
                    // 这里可以添加部署脚本,比如使用 SCP 或者 Docker
                    echo 'Deploying to production server...'
                }
            }
        }
        post {
            always {
                archiveArtifacts artifacts: 'myapp.tar.gz', allowEmptyArchive: true
            }
            success {
                emailext body: 'Build succeeded!', subject: 'Build Success', to: 'team@example.com'
            }
            failure {
                emailext body: 'Build failed!', subject: 'Build Failure', to: 'team@example.com'
            }
        }
    }
    
安全实践
  • 凭证管理:使用 Jenkins 内置的凭证存储来管理敏感信息,如 API 密钥、数据库密码等。
  • 权限控制:确保只有授权用户才能访问特定的 Job 或执行敏感操作。

GitHub Actions 高级配置

使用 Secrets
  • GitHub Secrets:用于存储敏感数据,如 API 密钥、令牌等,并在工作流中引用它们。
  • 示例 ci.yml 文件(含 Secrets)
    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        env:
          MY_SECRET: ${{ secrets.MY_SECRET }}
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: '1.16'
        - name: Cache Go modules
          uses: actions/cache@v2
          with:
            path: ~/go/pkg/mod
            key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
            restore-keys: |
              ${{ runner.os }}-go-
        - name: Build
          run: go build -v ./...
        - name: Test
          run: go test -v ./...
        - name: Run Linter
          run: go vet ./...
        - name: Deploy
          if: github.ref == 'refs/heads/main'
          run: |
            echo "Deploying using secret: ${MY_SECRET}"
            # 在这里添加实际的部署命令
    
多阶段构建
  • 矩阵策略:使用矩阵策略来并行运行多个版本的 Go 编译器。
  • 示例 ci.yml 文件(多阶段)
    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        strategy:
          matrix:
            go-version: [1.15, 1.16]
            os: [ubuntu-latest, macos-latest]
        runs-on: ${{ matrix.os }}
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: ${{ matrix.go-version }}
        - name: Build
          run: go build -v ./...
        - name: Test
          run: go test -v ./...
    
      deploy:
        needs: build
        if: github.ref == 'refs/heads/main'
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: '1.16'
        - name: Build for deployment
          run: go build -o myapp ./cmd/myapp
        - name: Package
          run: tar -czf myapp.tar.gz myapp
        - name: Deploy
          run: |
            echo "Deploying the application..."
            # 添加实际部署命令
    

通过这些高级配置,您可以为您的 Go 项目创建一个更加健壮和灵活的 CI/CD 流水线。

接下来,我们将继续深入探讨一些更高级的主题,包括如何在 CI/CD 流程中处理依赖管理、自动化测试报告生成、以及如何集成代码质量检查工具。此外,我们还将讨论如何使用容器化技术来进一步简化部署过程。

依赖管理和缓存

Jenkins
  • 依赖管理:确保每次构建时都能准确地获取到正确的依赖版本。
  • 示例 Jenkinsfile (包含依赖缓存)
    pipeline {
        agent any
        environment {
            GO_VERSION = '1.16'
        }
        stages {
            stage('Checkout') {
                steps {
                    git branch: 'main', url: 'https://github.com/yourusername/your-go-repo.git'
                }
            }
            stage('Setup') {
                steps {
                    tool name: 'Go', type: 'go'
                }
            }
            stage('Restore Cache') {
                steps {
                    sh 'mkdir -p $HOME/go/pkg/mod'
                    cache path: '$HOME/go/pkg/mod', key: "go-mod-${GO_VERSION}-${GIT_COMMIT}", restoreKeys: "go-mod-${GO_VERSION}-"
                }
            }
            stage('Build') {
                steps {
                    sh 'go build -o myapp ./cmd/myapp'
                }
            }
            stage('Test') {
                steps {
                    sh 'go test -v ./...'
                }
            }
            stage('Save Cache') {
                when { always() }
                steps {
                    sh 'mkdir -p $HOME/.cache/go-build'
                    cache path: '$HOME/.cache/go-build', key: "go-build-${GO_VERSION}-${GIT_COMMIT}", restoreKeys: "go-build-${GO_VERSION}-"
                }
            }
        }
    }
    
GitHub Actions
  • 依赖管理:使用 actions/cache 来缓存 Go 模块。
  • 示例 ci.yml 文件(包含依赖缓存)
    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: '1.16'
        - name: Cache Go modules
          uses: actions/cache@v2
          with:
            path: |
              ~/go/pkg/mod
              ~/.cache/go-build
            key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
            restore-keys: |
              ${{ runner.os }}-go-
        - name: Build
          run: go build -v ./...
        - name: Test
          run: go test -v ./...
    

自动化测试报告

Jenkins
  • 测试报告插件:安装并配置 JUnit 插件或其他适合 Go 的测试报告插件。
  • 示例 Jenkinsfile (包含测试报告)
    pipeline {
        agent any
        stages {
            // 其他阶段...
            stage('Test') {
                steps {
                    sh 'go test -v -json ./... > test-report.json'
                }
                post {
                    always {
                        junit allowEmptyResults: true, testResults: 'test-report.json'
                    }
                }
            }
        }
    }
    
GitHub Actions
  • 测试报告:使用 actions/upload-artifact 来上传测试结果,并使用 gotestfmt 或其他工具格式化输出。
  • 示例 ci.yml 文件(包含测试报告)
    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: '1.16'
        - name: Build
          run: go build -v ./...
        - name: Test
          run: go test -v -json ./... > test-report.json
        - name: Upload Test Report
          if: always()
          uses: actions/upload-artifact@v2
          with:
            name: test-report
            path: test-report.json
    

代码质量检查

Jenkins
  • 静态分析工具:集成如 golangci-lint 这样的工具来进行代码质量检查。
  • 示例 Jenkinsfile (包含静态分析)
    pipeline {
        agent any
        stages {
            // 其他阶段...
            stage('Lint') {
                steps {
                    sh 'curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.37.0'
                    sh '$(go env GOPATH)/bin/golangci-lint run'
                }
            }
        }
    }
    
GitHub Actions
  • 静态分析:使用 golangci-lint-action Action 来执行代码质量检查。
  • 示例 ci.yml 文件(包含静态分析)
    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Go
          uses: actions/setup-go@v2
          with:
            go-version: '1.16'
        - name: Lint
          uses: golangci/golangci-lint-action@v2
          with:
            version: v1.37.0
        - name: Build
          run: go build -v ./...
        - name: Test
          run: go test -v ./...
    

容器化部署

使用 Docker
  • Docker 构建:创建一个 Dockerfile 来打包你的 Go 应用。

  • 示例 Dockerfile

    FROM golang:1.16 AS builder
    WORKDIR /app
    COPY . .
    RUN go mod download
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
    
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    COPY --from=builder /app/myapp /myapp
    CMD ["/myapp"]
    
  • Jenkins 中的 Docker 部署:在 Jenkinsfile 中添加 Docker 构建和推送步骤。

  • 示例 Jenkinsfile (包含 Docker 构建)

    pipeline {
        agent any
        environment {
            DOCKER_IMAGE = 'your-dockerhub-username/your-image-name:latest'
        }
        stages {
            // 其他阶段...
            stage('Build Docker Image') {
                steps {
                    script {
                        docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
                            def customImage = docker.build(DOCKER_IMAGE)
                            customImage.push()
                        }
                    }
                }
            }
            stage('Deploy') {
                when { branch 'main' }
                steps {
                    sh 'kubectl apply -f kubernetes/deployment.yaml'
                }
            }
        }
    }
    
  • GitHub Actions 中的 Docker 部署:在 GitHub Actions 工作流中加入 Docker 构建和推送步骤。

  • 示例 ci.yml 文件(包含 Docker 构建)

    name: Go CI
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Set up Docker Buildx
          uses: docker/setup-buildx-action@v1
        - name: Login to DockerHub
          uses: docker/login-action@v1
          with:
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
        - name: Build and push
          id: docker_build
          uses: docker/build-push-action@v2
          with:
            push: true
            tags: your-dockerhub-username/your-image-name:latest
    

通过上述配置,您可以为您的 Go 项目设置一个更加全面且高效的 CI/CD 流水线。希望这些信息对您有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924336.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序按字母顺序渲染城市 功能实现详细讲解

在微信小程序功能搭建中,按字母渲染城市会用到多个ES6的方法,如reduce,map,Object.entries(),Object.keys() ,需要组合熟练掌握,才能优雅的处理数据完成渲染。 目录 一、数据分析 二、数据处理 …

DVWA靶场通过——文件上传漏洞

File Upload漏洞 它允许攻击者通过上传恶意文件来执行任意代码、窃取数据、获取服务器权限,甚至完全控制服务器。为了防止文件上传漏洞,开发者需要对文件上传过程进行严格的验证和处理。 1. 文件上传漏洞概述 文件上传漏洞发生在Web应用程序允许用户通过…

react后台管理系统(一)

🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:react后台管理系统(一) 前言 本文档详细介绍了如何从零开始搭建一个基于 React 和 Ant Design 的…

Vue.js --- 生命周期

1. 前言 在 Vue.js 中,生命周期是指一个 Vue 实例从创建到销毁的过程。Vue 提供了一系列的生命周期钩子(lifecycle hooks),让开发者可以在不同的阶段执行特定的代码。了解这些生命周期钩子是构建 Vue 组件的基础,能够…

使用1panel一键安装Ollama WebUI连接本地Ollama使用开源ai模型

当前我的环境 设备有限只有一张3060 12gb显卡,平时用来轻度学习 主机:windows server Ollama:windows版(它也有linux和mac) 因虚拟机使用的服务器无显卡,只用来跑面板和WebUi 虚拟机:ubuntu se…

任意文件读取漏洞(CVE-2024-7928)修复

验证CVE-2024-7928问题是否存在可以使用如下方法: https://域名/index/ajax/lang?lang..//..//目录名/文件名(不带后缀) 目录名是该项目的一个目录,这里目录位置为nginx设置站点目录为基准,网上两层目录。 文件名…

房屋出租出售预约系统支持微信小程序+H5+APP

核心功能有:新盘销售、房屋租赁、地图找房、小区找房,地铁找房等方式。 地图找房:通过地图标注查看附近房源,方便用户根据地理位置查找合适的房产。二手房资讯:提供租房及二手房市场的相关资讯,帮助用户了…

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例) 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象…

抓SystemTrace的简易方法

前言: Systrace是分析Android性能问题的神器。一般抓trace命令是需要在AndroidSDK下的\platform-tools\systrace执行\systrace.py,很奇怪我的AndroidSDK并没有systrace文件夹,于是CSDN单独下载了trace文件 但是我一运行.\systrace.py -b 102…

微信小程序 城市点击后跳转 并首页显示被点击城市

在微信小程序中,渲染出城市列表后,如何点击城市,就跳转回到首页,并在首页显示所点击的城市呢? 目录 一、定义点击城市的事件 二、首页的处理 首页:点击成都市会跳转到城市列表 城市列表:点击…

修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题

之前很多配置都是放在nacos里面,然后这次同事有个配置写在application.properties中,这个配置含有中文,启动之后发现拿到的中文值会乱码,然后就帮忙看了一下问题。 排查问题 经过不停的百度、排查发现,spring读取app…

STM32F103系列单片机通用和复用I/O(GPIO)

一、GPIO功能描述 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。…

从 App Search 到 Elasticsearch — 挖掘搜索的未来

作者:来自 Elastic Nick Chow App Search 将在 9.0 版本中停用,但 Elasticsearch 拥有你构建强大的 AI 搜索体验所需的一切。以下是你需要了解的内容。 生成式人工智能的最新进展正在改变用户行为,激励开发人员创造更具活力、更直观、更引人入…

《生成式 AI》课程 第7講:大型語言模型修練史 — 第二階段: 名師指點,發揮潛力 (兼談對 ChatGPT 做逆向工程與 LLaMA 時代的開始)

资料来自李宏毅老师《生成式 AI》课程,如有侵权请通知下线 Introduction to Generative AI 2024 Springhttps://speech.ee.ntu.edu.tw/~hylee/genai/2024-spring.php 摘要 这一系列的作业是为 2024 年春季的《生成式 AI》课程设计的,共包含十个作业。…

LabVIEW动态显示控件方案

在LabVIEW开发中,涉及到动态显示和控制界面的设计时,经常需要根据用户选择的不同参数来动态显示或隐藏相关控件。例如,某些能可能会根据“Type”控件的不同选择显示不同的参数,如“Target”、“Duration”和“EndType”等。在一个…

DVWA靶场——File Inclusion

File Inclusion(文件包含)漏洞 指攻击者通过恶意构造输入,利用应用程序错误的文件包含机制,导致程序包含并执行未经授权的本地或远程文件。这类漏洞广泛存在于Web应用程序中,尤其是在那些允许用户提供文件路径或URL的地…

Linux自动化构建-make/Makefile

目录 1. 背景2. 基本使用3. 推导过程4. 好用的操作5. 拓展语法 1. 背景 会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规…

(STM32)ADC驱动配置

1.ADC驱动(STM32) ADC模块中,**常规模式(Regular Mode)和注入模式(Injected Mode)**是两种不同的ADC工作模式 常规模式:用于普通的ADC转换,是默认的ADC工作模式。 注入…

初级数据结构——二叉搜索树

目录 前言一、定义二、基本操作三、时间复杂度分析四、变体五、动态图解六、代码模版七、经典例题[1.——700. 二叉搜索树中的搜索](https://leetcode.cn/problems/search-in-a-binary-search-tree/)代码题解 [2.——938. 二叉搜索树的范围和](https://leetcode.cn/problems/ra…

48-基于单片机的LCD12864时间调控和串口抱站

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机的公交报站系统,可以手动报站,站名十个。 在lcd12864上显示时间(年月日时分秒)和站名,时间可以设置, 仿真中可以…