找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

基于stc8g1k08a单片机的简易示波器和超声波测距二合一小制作 附程序

查看数: 15062 | 评论数: 19 | 收藏 25
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-4-22 15:20

正文摘要:

stc8g1k08a是深圳宏晶科技的一款8脚8位兼容51系列的单片机  价格很便宜 但麻雀虽小五脏俱全 且速度还挺快下面就是用它做的小东东 精度不是很高 本人也是刚入门 水平有限 希望大家多多指教共两个按键 :按 ...

回复

ID:1110792 发表于 2025-7-17 17:23
深入学习,由启发。
ID:1110792 发表于 2024-9-13 22:12
厉害,有器件,但不知道能不能弄成,学习了。
ID:681572 发表于 2023-4-14 09:17
请问这个是用keil4还是keil5建立的工程啊??建立工程时选择哪个器件啊?为什么我的keil4 C51里面没有这个stc8g1k08a器件啊???
ID:476058 发表于 2022-10-15 22:33
共同学习,共同进步,向大佬学习!
ID:1042937 发表于 2022-8-27 15:48
有时间研究一下
ID:185675 发表于 2022-6-8 22:32
//一个简单的在stc8g1ko8A上可以运行的小demo,可以用于简单的AD测量,define修改一下就行了
#define TIME_3S 30000
#define TIME_2S 30000
#define TIME_1MS 100
#define  TIME_2MS 200
#define  TIME_5MS 500
// 状态机
#define READY_ST 1
#define CAPCHARGE 2
#define MOT_ST 3
#define STOP_ST 4
#define CHARGE_ST 5
#define DELAY_ST 6
// 信号接收
// 状态机
#define keyRun
#define keyMot
// 数值
#define U500 20
#define U6500 500
#define U8000 700

unsigned int STATUS
unsigned int ADS
// 计数器
unsigned int keyRunCounter
unsigned int keyShutDownCounter
unsigned int shortCurrentCounter
unsigned int delaySTCounter
unsigned int capChargeCounter
unsigned int OVMonitCounter_1
unsigned int OVMonitCounter_2


mian()
{
case Status
    Run:
        Gpio.init;//keyRun 为推挽
    Mot:
        Gpio.init2;//keyRun 为input
    default:
        Gpio.init;//初始化为Run
}
void ISR()
{
    /*滤波器*/

    /*保护*/
    Protect();
    /*按键检测*/
    keyMonitor();

    /*状态与动作*/
    switch STATUS:
    case READY_ST:
        setGPIO1;
    case CHARGE_ST:
        setGPIO1();
    case DELAY_ST:
        setGPIO1();
    case MOT_ST:
        setGPIO1();
    case STOP_ST:
        setGPIO1();   
    default:   
}


/******************************
*执行保护逻辑
****************************/
void Protect()
{
    // Short State monitor
    if (STATUS != READY_ST) && (ADS < U500)//在待机时不检测,其他时段都不放过
    {
        shortCurrentCounter++;
    }
    else
    {
        shortCurrentCounter = 0;
    }
    if (shortCurrentCounter > TIME_1MS)
    {
        shortCurrentCounter = 0;
        STATUS = STOP_ST;
        return;
    }
    // OverVoltage Monitor 1
    if (STATUS != READY_ST) && (ADS > U500)//
    {
        OVMonitCounter_1++;
    }
    else
    {
        OVMonitCounter_1 = 0;
    }
    if (OVMonitCounter_1 > OVMonitCounter_1Debounce)
    {
        OVMonitCounter_1 = 0;
        STATUS = DELAY_ST;
    }
    // OverVoltage Monitor 2
    if (STATUS != READY_ST) && (ADS > U7500)//
    {
        OVMonitCounter_2++;
    }
    else
    {
        OVMonitCounter_2 = 0;
    }
    if (OVMonitCounter_2 > OVMonitCounter_2Debounce)
    {
        OVMonitCounter_2 = 0;
        STATUS = DELAY_ST;
    }
}
/******************************
*按键检测逻辑
****************************/
void keyMonitor()
{
    //待机状态,长按*秒开机
    if (STATUS == READY_ST) && (keyRun == 1)//待机状态,长按3秒开机
    {
        keyRunCounter++;
    }
    else
    {
        keyRunCounter = 0;
    }
    if (keyRunCounter > TIME_3S)
    {
        keyRunCounter = 0;
        STATUS = CHARGE_ST;
    }
    //运行状态,信号消失1ms关机
    if ((STATUS == CHARGE_ST) || (STATUS == DELAY_ST) || (STATUS == CAPCHARGE)  )&& (keyRun == 0)
    {
        keyShutDownCounter++;
    }
    else
    {
        keyShutDownCounter = 0;
    }
    if (keyShutDownCounter > TIME_3S)
    {
        keyShutDownCounter = 0;
        STATUS = READY_ST;
    }
   
    /*母线大电容充电2秒,开始工作*/
    if (STATUS == CAPCHARGE)  
    {
        if  (capChargeCounter < TIME_2S)
        {
            capChargeCounter++;
        }
        else
        {
            capChargeCounter = 0;
            STATUS = CHARGE_ST;
        }
    }
    //delay状态,1ms后使能检测
    if ((STATUS == DELAY_ST) ) //&& (ADS < U500) delay 之后1ms再次检测,不够再加,够了就再次进入delay
    {
        delaySTCounter++;
    }
    else
    {
        delaySTCounter = 0;
    }
    if (delaySTCounter > TIME_2MS)
    {
        delaySTCounter = 0;
        STATUS = CHARGE_ST;
    }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:558833 发表于 2022-2-14 21:29
面包板插线,直接下载成功
ID:953759 发表于 2021-7-17 10:57
老董 发表于 2021-4-22 18:55
谢谢版主帮我整理 忘了告诉大家 单片机下载程序是 时钟选择33.1776MZ

您好,这个时钟是怎么确定的呢?
ID:849913 发表于 2021-7-10 11:42
kmikmi 发表于 2021-7-5 22:09
把文件头改一下就能编译
#include "reg51.h"
#include "intrins.h"

谢谢指点 我还不知道有这个方法  所以把reg51.h里面加了很多与8G相关的东西
ID:927469 发表于 2021-7-5 22:09
lin2453676722 发表于 2021-5-2 20:10
keil5好像编译不成功

把文件头改一下就能编译
#include "reg51.h"
#include "intrins.h"
#include"main.h"
#include<math.h>
改成:
#include <STC8G.h>
#ifndef     __STC8G_H__
#define     __STC8G_H__
ID:849913 发表于 2021-6-3 15:26
测距精度可以用软件调节 前提就是做着玩的 目的是对示波器和测试仪构思的实践
ID:414556 发表于 2021-5-30 23:19
测距精度高不高,有没有精度微调
ID:849913 发表于 2021-5-30 21:41
zhike 发表于 2021-5-30 10:00
这个能做成示波器吗?

简易的 都是出于自己对示波器工作原理的理解  频率和精度都不高 主要是出于兴趣玩玩
ID:601214 发表于 2021-5-30 10:00
这个能做成示波器吗?
ID:915390 发表于 2021-5-3 22:00
学到了,有空弄一个
ID:431787 发表于 2021-5-2 20:10
keil5好像编译不成功
ID:756506 发表于 2021-4-24 11:21
不错,有时间来做一个
ID:857072 发表于 2021-4-24 11:15
有意思,下来有时间研究一下
ID:849913 发表于 2021-4-22 18:55
谢谢版主帮我整理 忘了告诉大家 单片机下载程序是 时钟选择33.1776MZ

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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