| 本帖最后由 DebugLab 于 2024-9-25 09:07 编辑 
 之前设计了一款 8G1K08A-SOP8 扩展开发板(v1.0),由于未考虑到该款芯片不支持硬件USB,因此对开发板设计进行优化。优化后的开发板仅保留串口通信和串口下载接口作为供电接口。此外该开发板包含一位 74HC595 共阴数码管、所有IO接口LED指示灯、串口通信接口、OLED IIC扩展接口、IIC通信接口等。
 
 
 实物效果如下
 
     
 3D图如下
 
 
 
     
 
 
 2D图
 
     
 
 
 PCB如下
 
   
 
 
 原理图如下
 
 
 
 PCB 项目详见:https://oshwhub.com/jinleili/stc8g1k08a-sop8-extension-develo
 
 DHT11测试
 
   
 
 OLED IIC通信测试
 
   
 
 板载数码管秒表计时测试
 
 
 代码
 
 复制代码#include <STC8G.H>
#include "intrins.h"
typedef unsigned char u8;                                //unsigned char                 类型用 u8 表示
typedef unsigned int u16;                                //unsigned int                  类型用 u16表示
typedef unsigned long int u32;        //unsigned long int 类型用 u32表示
sbit DS = P5^5;                        //串行输入SER接
sbit ST = P3^2;                        //锁存时钟RCLK接
sbit SH = P5^4;                        //串行输入时钟SRCLK接
sbit COM1 = P0^0;                        //数码管公共端COM1接
void delayms(u8 ms);                                                //延时函数声明
void Write595(u8 dat);
u8 SEG_Code[13] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0xFF};        //数码管全灭(10),横杆-(11),数码管全亮(12)
//u8 SEG_Code[13] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x00};//BS digital tube
void main()
{        
        u8 i,number;
        
        P0M1 = 0x00;P0M0 = 0x00;                //设置P0口为准双向口模式 00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
        P1M1 = 0x00;P1M0 = 0x00;                //设置P1口为准双向口模式 00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
        P2M1 = 0x00;P2M0 = 0x00;                //设置P2口为推挽输出模式 00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
        P3M1 = 0x00;P3M0 = 0x00;                //设置P0口为准双向口模式 00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
        P4M1 = 0x00;P4M0 = 0x00;                //设置P1口为准双向口模式 00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
        P5M1 = 0x00;P5M0 = 0x00;                //设置P2口为推挽输出模式 00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
        
        number = 0;
        while(1)
        {
                for(i = 0;i < 200;i++)        //每个数字显示200*5毫秒(粗略计算1秒)
                {
                        Write595(number);                                        //显示0-9计数
                        COM1 = 0;                                                        //共阴极数码管,公共端给低电平点亮
                        delayms(5);                                                //延时5毫秒
                }
                number++;
                if(number > 9) number = 0;
        }
}
void Write595(u8 dat)                                //向595发送写数据函数
{
        u16 i;
        u8 datcode;
        datcode = SEG_Code[dat];        //十进制数转段码
        for(i = 0;i < 8;i++)                //写数据
        {
                SH = 0;                                                        //拉低串行输入时钟SCLK
                DS = datcode & 0x80;        //取最高位
                SH = 1;                                                        //SCKL时钟上升沿,数据存移位寄存器
         datcode <<= 1;                                        //每次一位
        }
        ST = 0;                                                        //拉低ST时钟
        ST = 1;                                                        //ST时钟上升沿,更新输出存储器数据
}
//----------------Timer-----------------------------
void delayms(u8 ms)                //@24.000MHz
{
        u8 i, j;
        
        while(ms--)
        {
                _nop_();
                i = 32;
                j = 40;
                do
                {
                        while (--j);
                } while (--i);
        }
}
 
 相关代码见附件。
 
 |