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);                     //延时
                }
              }

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐