STC8H8K32U控制板PCB设计必读
本文主要介绍了STC8H系列单片机的开发应用技术,包括C51开发环境配置、芯片引脚功能解锁、下载电路设计(含LQFP32、TSSOP20封装)、中断系统架构(12.1-12.3节)、USB和串口下载方案(PL2303-GL/USBLink1D)、仿真调试方法、变量地址分配技巧,以及复位电路和ADC模块设计。重点展示了"一箭双雕"下载工具的使用流程,覆盖了从硬件接口到软件编程的完

C51C251MDK安装目录
/********************IO_rst**********************/
void IO_rst()
{
P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
P0M1 = 0x00; P0M0 = 0x00; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M0 = 0x00; P2M1 = 0x3f; //P2.0-2.5 高阻输入
// P2PU &= ~0x3f; P2IE |= 0x3f; //
// P2=0X3F; //00 11 1111拉高
P3M0 = 0x00; P3M1 = 0xfc; //P3.2-P3.7高阻输入
P3PU &=~0xfc; P3IE |= 0xfc;
P3=0XFC; //1111 1100
P4M0 = 0x00; P4M1 = 0x1e; //
P4PU &= ~0x1e; P4IE |= 0x1e;
P4=0X1E; // 0001 1110
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
}

Fig_02_解锁

IO口

LQFP32

OLED接口

PL2303 -GL下载线路图

STC8H8K64U TSSOP20

STC8H8K下载线路图

STC8H系列中断源 12.1

STC8H系列中断源 12.2

STC8H系列中断源 12.3

STC8H 5V系统下载线路图

STCMCU中断列表

USB Link1D仿真烧录通讯8H系列
USB下载线路图


USB仿真步骤演示

变量指定绝对地址

表格选定绝对地址

复位电路设计

高精度ADC转换图

下载流程图

下载与编程

一箭双雕USB转串口下载
PCB板

LQFP44

#include "stc8h.h" //包含此头文件后,不需要再包含"reg51.h"头文件
#include "stdio.h"
#include "intrins.h"
#define high 1
#define low 0
#define OPEN 1
#define OFF 0
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sbit OLED_SCL=P2^7; //
sbit OLED_SDA=P2^6; //
sbit OUT_A=P6^0; //
sbit OUT_B=P6^1; //
sbit OUT_C=P6^2; //
sbit OUT_D=P6^3; //
sbit Motora_Ina1=P1^0; //
sbit Motora_Ina2=P1^1; //
sbit Motorb_Ina1=P1^4; //
sbit Motorb_Ina2=P1^5; //
sbit INT_1=P3^2; // 自动启动
sbit INT_2=P3^3; // 开模信号
sbit INT_3=P3^4; // 机械手到位
sbit INT_4=P3^5; // 气缸前到位
sbit INT_5=P3^6; // 气缸后到位
sbit INT_6=P3^7; // 气缸前退停
sbit INT_7=P4^1; // 气缸后退停
sbit INT_8=P4^2; // 电机前到位
sbit INT_9=P4^3; // 电机后到位
sbit INT_10=P4^4; // 电机前退停
sbit INT_11=P2^0; // 电机后退停
sbit INT_12=P2^1; // 手动气缸进
sbit INT_13=P2^2; // 手动气缸退
sbit INT_14=P2^3; // 手动电机进
sbit INT_15=P2^4; // 手动电机退
sbit INT_16=P2^5; //
//输入信号
sbit OUT_1=P0^6; //
sbit OUT_2=P0^4; //
sbit OUT_3=P0^3; //
sbit OUT_4=P0^2; //
sbit OUT_5=P0^1; //
sbit OUT_6=P0^0; //
sbit OUT_7=P4^6; //
sbit OUT_8=P4^5; //
//输出信号
sbit KEY_1=P1^7; //
sbit KEY_2=P1^6; //
sbit KEY_3=P1^3; //
sbit KEY_4=P5^4; //
sbit KEY_5=P4^0; //
sbit KEY_6=P4^7; //
sbit KEY_7=P0^5; //
sbit KEY_8=P0^7; //

TL431

STC8H8K32U工业控制板PCB,16路开关量输入信号,7路500mA开关量输出,
2路 3.5A直流电机正反转输出,一路5V继电器常开开放触点,
一个OLED显示,一个HMI LCD显示
扩展8个按键。USB下载 串口仿真。
/******************************************/
#include "stc8h.h" //包含此头文件后,不需要再包含"reg51.h"头文件
#include "stdio.h"
#include "intrins.h"
#define high 1
#define low 0
#define OPEN 1
#define OFF 0
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sbit OLED_SCL=P2^7; //
sbit OLED_SDA=P2^6; //
sbit OUT_A=P6^0; //
sbit OUT_B=P6^1; //
sbit OUT_C=P6^2; //
sbit OUT_D=P6^3; //
sbit Motora_Ina1=P1^0; //
sbit Motora_Ina2=P1^1; //
sbit Motorb_Ina1=P1^4; //
sbit Motorb_Ina2=P1^5; //
u8 Counter; //步进计数器
#define MAIN_Fosc 24000000UL
u8 code show1[]=
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/
0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/
};
u8 code show2[]=
{
0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,/*"左",0*/
0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,/*"右",1*/
0x80,0x60,0xF8,0x07,0x00,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x01,0x03,0x00,/*"停",2*/
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"止",3*/
0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,
0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,/*"启",4*/
0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,
0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",5*/
0x00,0x04,0x84,0x84,0x94,0xE4,0x85,0x86,0x84,0xC4,0xB4,0x84,0x84,0x84,0x80,0x00,
0x80,0x60,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"产",6*/
0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,
0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,/*"量",7*/
0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00,/*"进",8*/
0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00,/*"退",9*/
0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,
0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,/*"刀",10*/
0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*"待",11*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*"机",12*/
};
//==========================================================================
void delay_ms(u8 ms)
{
u16 i;
do
{
i=MAIN_Fosc/1000;
while(--i);
}
while(--ms);
}
/*************Pin Define***************/
void Oled_delay(u16 ms)
{
u16 i,j;
for(i=0;i<ms;i++)
for(j=0;j<20;j++);
}
/*************Pin Define***************/
void Initial_LY096BG30();
void Delay_50ms(u16 Del_50ms);
void fill_picture(u8 fill_Data);
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(u8 IIC_Command);
void Write_IIC_Data(u8 IIC_Data);
bit Write_IIC_Byte(u8 IIC_Byte);
/*******************IIC Start******************/
void IIC_Start()
{
OLED_SCL=high;
Oled_delay(2);
OLED_SDA=high;
Oled_delay(2);
OLED_SDA=low;
Oled_delay(2);
OLED_SCL=low;
}
/*************IIC Stop*************************/
void IIC_Stop()
{
OLED_SDA=low;
Oled_delay(2);
OLED_SCL=high;
Oled_delay(2);
OLED_SDA=high;
}
/*****************IIC Write byte***************/
bit Write_IIC_Byte(u8 IIC_Byte)
{
unsigned char i;
bit Ack_Bit; //应答信号
for(i=0;i<8;i++)
{
if(IIC_Byte & 0x80) //1?0?
OLED_SDA=high;
else
OLED_SDA=low;
OLED_SCL=high;
Oled_delay(2);
OLED_SCL=low;
IIC_Byte<<=1; //loop
}
OLED_SDA=high; //释放IIC SDA总线为主器件接收从器件产生应答信号
Oled_delay(2);
OLED_SCL=high; //第9个时钟周期
Oled_delay(2);
Ack_Bit=OLED_SDA; //读取应答信号
OLED_SCL=low;
return Ack_Bit;
}
/*************IIC Write Command*****************/
void Write_IIC_Command(u8 IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
Write_IIC_Byte(0x00); //write command
Write_IIC_Byte(IIC_Command);
IIC_Stop();
}
/****************IIC Write Data*****************/
void Write_IIC_Data(u8 IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40); //write data
Write_IIC_Byte(IIC_Data);
IIC_Stop();
}
/***********************Initial code*********************/
void Initial_LY096BG30()
{
Write_IIC_Command(0xAE); //display off
Write_IIC_Command(0x20); //Set Memory Addressing Mode
Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
Write_IIC_Command(0xc8); //Set COM Output Scan Direction
Write_IIC_Command(0x00); //---set low column address
Write_IIC_Command(0x10); //---set high column address
Write_IIC_Command(0x40); //--set start line address
Write_IIC_Command(0x81); //--set contrast control register
Write_IIC_Command(0x7f);
Write_IIC_Command(0xa1); //--set segment re-map 0 to 127
Write_IIC_Command(0xa6); //--set normal display
Write_IIC_Command(0xa8); //--set multiplex ratio(1 to 64)
Write_IIC_Command(0x3F); //
Write_IIC_Command(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
Write_IIC_Command(0xd3); //-set display offset
Write_IIC_Command(0x00); //-not offset
Write_IIC_Command(0xd5); //--set display clock divide ratio/oscillator frequency
Write_IIC_Command(0xf0); //--set divide ratio
Write_IIC_Command(0xd9); //--set pre-charge period
Write_IIC_Command(0x22); //
Write_IIC_Command(0xda); //--set com pins hardware configuration
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb); //--set vcomh
Write_IIC_Command(0x20); //0x20,0.77xVcc
Write_IIC_Command(0x8d); //--set DC-DC enable
Write_IIC_Command(0x14); //
Write_IIC_Command(0xaf); //--turn on oled panel
}
/***************设置参数显示******************/
void dis_Val1(u8 s)
{
u8 x,y;
u16 i=0;
u8 A1,A2,A3;
A1=s/100;
A2=(s-A1*100)/10;
A3=s-A1*100-A2*10;
for(y=0;y<2;y++) //百位显示
{
Write_IIC_Command((u8)(0XB4+y)); //纵向页 1011
Write_IIC_Command(0X00); //横向离左部边缘开始的距离
Write_IIC_Command(0X10); //横向第四个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表
}
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A2*16]);
Oled_delay(2);
}
}
for(y=0;y<2;y++) //十位显示
{
Write_IIC_Command((u8)(0XB4+y)); //纵向页
Write_IIC_Command(0X00); //横向离左部边缘开始的距离
Write_IIC_Command(0X11); //横向第五个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+A3*16]);
Oled_delay(2);
}
}
}
/********************显示待机**********************/
void Diswait()
{
u8 x,y;
u16 Cnt=32;
for(y=0;y<2;y++)
{
Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 待
Write_IIC_Command(0x00);
Write_IIC_Command(0x10); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*11]); //字符表第7个字
}
}
//
for(y=0;y<2;y++)
{
Write_IIC_Command((u8)(0XB0+y)); //竖向第一行 机
Write_IIC_Command(0x00);
Write_IIC_Command(0x11); //横向第二个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*12]); //字符表第8个字
}
}
}
/********************IO_rst**********************/
void IO_rst()
{
P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
P0M1 = 0x00; P0M0 = 0x00; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x03; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0xFF; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
}
/********************picture**********************/
void cleardisp()
{
u8 x,y;
for(y=0;y<8;y++)
{
Write_IIC_Command((u8)(0xb0+y));
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(x=0;x<128;x++) //横向像素
{
Write_IIC_Data(0X00);
}
}
}
/***************显示计数器值******************/
void dis_Val(u8 s)
{
u8 x,y;
u16 i=0;
for(y=0;y<2;y++) //百位显示
{
Write_IIC_Command((u8)(0XB2+y)); //纵向页 1011
Write_IIC_Command(0X00); //横向离左部边缘开始的距离
Write_IIC_Command(0X10); //横向第四个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+s*16]); //0--A字符表
}
}
}
/********************开关散转*********************/
void motor_RUN(u8 Counter)
{
switch(Counter) //橙黄粉蓝
{
case 1:P0=0X01; //橙色开 1 0 0 0 1
case 2:P0=0X03; //黄色开 2 0 0 1 1
case 3:P0=0X02; //橙色关 3 0 0 1 0
case 4:P0=0X06; //粉色开 4 0 1 1 0
case 5:P0=0X04; //黄色关 5 0 1 0 0
case 6:P0=0X0C; //蓝色开 6 1 1 0 0
case 7:P0=0X08; //粉色关 7 1 0 0 0
case 8:P0=0X09; //橙色开 8 1 0 0 1
}
}
/******************** 主函数 **************************/
void main(void)
{
IO_rst();
Initial_LY096BG30();
cleardisp();
Diswait();
Counter=0;
while(1)
{
Counter++; //计数器
if(Counter>8) //计数加
Counter=0; //大与8归零
dis_Val(Counter); //第二行显示
motor_RUN(Counter); //开关散转显示
dis_Val1(0X12); //第三行显示十进制数18
Motora_Ina1=0; //电机旋转初始化方向
Motora_Ina2=1; //
P30 = 0; //LED
delay_ms(250); //延时
P30 = 1; //LED
dis_Val1(0X16); //第三行显示十进制数22
Motora_Ina1=1; //电机停止
Motora_Ina2=1; //
delay_ms(250); //延时
}
}
更多推荐



所有评论(0)