钰平电子 发表于 2023-6-17 14:14:28

STC12C5A60S2单片机设计的20路NPN输入20路晶体管输出二维码扫码控制电路及程序分享














下图为二维码扫码器




【声明】此程序仅用于学习与参考!   
*********************************************************************/
#include "hedder\\STC12C5A60S2.h"
#include"hedder\\DODI.h"
#include <intrins.h>
#defineuchar unsigned char
#defineuintunsigned int
/*
sfr IAP_DATA    = 0xC2;
sfr IAP_ADDRH   = 0xC3;
sfr IAP_ADDRL   = 0xC4;
sfr IAP_CMD   = 0xC5;
sfr IAP_TRIG    = 0xC6;
sfr IAP_CONTR   = 0xC7;
sfr P4   = 0xC0;

sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;       
sbit IN4=P2^3;

sbit OUT1=P0^0;
sbit OUT2=P0^1;
sbit OUT3=P0^2;
sbit OUT4=P0^3;

sbit OUT10=P0^7;
*/

bit bz1=0;
bit bz2=0;
bit bz3=0;
bit bz4=0;
bit bz5=0;
bit bz6=0;
bit bz7=0;
bit bz8=0;
bit bz9=0;
bit bz10=0;
bit bz11=0;
bit bz12=0;
bit bz13=0;
bit bz14=0;
bit bz15=0;
bit bz16=0;
bit bz17=0;
bit bz18=0;
bit bz19=0;
bit bz20=0;
uchar scdt;
//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值

uchar dat;
uchar add;
uchar t,r,ii;
bit flag_zx=0;
uchar receBuf;//接收缓冲区
bit write=0;
uchar k=100;
bit qcbz=0;
uchar xdata tmz1;//接收缓冲区
//uchartmz2;//接收缓冲区
uchar y;
/********************************************************************
                            函数声明
*********************************************************************/
union union_temp16
{
uint un_temp16;
uchar un_temp8;
}
my_unTemp16;

uchar Byte_Read(uint add);            //读一字节,调用前需打开IAP 功能
void Byte_Program(uint add, uchar ch);//字节编程,调用前需打开IAP 功能
void Sector_Erase(uint add);            //擦除扇区
void IAP_Disable();
/********************************************************************
                            串口初始化
*********************************************************************/

void init(void)
{
        TMOD = 0x20;                              //定时器1产生波特率
           SCON = 0x50;                               //方式2,8位数据,波特率可变
        PCON = 0x00;                               //不倍增波特率
        AUXR = 0x00;                               //1T工作方式,不使用波特率发生器
        IP   = 0x00;                               //优先级默认
        TH1= TL1 = 0xfd;                       //波特率 9600
        TR1= 1;                                     //启动定时器产生波特率
        EA   = 1; ES = 1;                       //开总中断,开串口中断
}

/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
    uchar i;
        for(i=0;i<8;i++)
        {
        receBuf=0;
        }
}
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
   for(i=0;i<t;i++)
   {
          for(j=130;j>0;j--);
       { ;
       }
   }
}
void KEY()
{

if((IN1==0)&&(bz1==0)){delay(k);if(IN1==0)
{
r=0;

bz1=1;qcbz=1;
}}
if((bz1==1)&&(IN1==1)){delay(k);if(IN1==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz1=0;qcbz=0;r=0;
}}
if((IN2==0)&&(bz2==0)){delay(k);if(IN2==0){r=0;bz2=1;qcbz=1;}}
if((bz2==1)&&(IN2==1)){delay(k);if(IN2==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz2=0;qcbz=0;r=0;
}}

if((IN3==0)&&(bz3==0)){delay(k);if(IN3==0){r=0;bz3=1;qcbz=1;}}
if((bz3==1)&&(IN3==1)){delay(k);if(IN3==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz3=0;qcbz=0;r=0;
}}
if((IN4==0)&&(bz4==0)){delay(k);if(IN4==0){r=0;bz4=1;qcbz=1;}}
if((bz4==1)&&(IN4==1)){delay(k);if(IN4==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz4=0;qcbz=0;r=0;
}}
if((IN5==0)&&(bz5==0)){delay(k);if(IN5==0){r=0;bz5=1;qcbz=1;}}
if((bz5==1)&&(IN5==1)){delay(k);if(IN5==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz5=0;qcbz=0;r=0;
}}
if((IN6==0)&&(bz6==0)){delay(k);if(IN6==0){r=0;bz6=1;qcbz=1;}}
if((bz6==1)&&(IN6==1)){delay(k);if(IN6==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz6=0;qcbz=0;r=0;
}}
if((IN7==0)&&(bz7==0)){delay(k);if(IN7==0){r=0;bz7=1;qcbz=1;}}
if((bz7==1)&&(IN7==1)){delay(k);if(IN7==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz7=0;qcbz=0;r=0;
}}
if((IN8==0)&&(bz8==0)){delay(k);if(IN8==0){r=0;bz8=1;qcbz=1;}}
if((bz8==1)&&(IN8==1)){delay(k);if(IN8==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz8=0;qcbz=0;r=0;
}}
if((IN9==0)&&(bz9==0)){delay(k);if(IN9==0){r=0;bz9=1;qcbz=1;}}
if((bz9==1)&&(IN9==1)){delay(k);if(IN9==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz9=0;qcbz=0;r=0;
}}
if((IN10==0)&&(bz10==0)){delay(k);if(IN10==0){r=0;bz10=1;qcbz=1;}}
if((bz10==1)&&(IN10==1)){delay(k);if(IN10==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz10=0;qcbz=0;r=0;
}}
if((IN11==0)&&(bz11==0)){delay(k);if(IN11==0){r=0;bz11=1;qcbz=1;}}
if((bz11==1)&&(IN11==1)){delay(k);if(IN11==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz11=0;qcbz=0;r=0;
}}
if((IN12==0)&&(bz12==0)){delay(k);if(IN12==0){r=0;bz12=1;qcbz=1;}}
if((bz12==1)&&(IN12==1)){delay(k);if(IN12==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz12=0;qcbz=0;r=0;
}}
if((IN13==0)&&(bz13==0)){delay(k);if(IN13==0){r=0;bz13=1;qcbz=1;}}
if((bz13==1)&&(IN13==1)){delay(k);if(IN13==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz13=0;qcbz=0;r=0;
}}
if((IN14==0)&&(bz14==0)){delay(k);if(IN14==0){r=0;bz14=1;qcbz=1;}}
if((bz14==1)&&(IN14==1)){delay(k);if(IN14==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz14=0;qcbz=0;r=0;
}}
if((IN15==0)&&(bz15==0)){delay(k);if(IN15==0){r=0;bz15=1;qcbz=1;}}
if((bz15==1)&&(IN15==1)){delay(k);if(IN15==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz15=0;qcbz=0;r=0;
}}
if((IN16==0)&&(bz16==0)){delay(k);if(IN16==0){r=0;bz16=1;qcbz=1;}}
if((bz16==1)&&(IN16==1)){delay(k);if(IN16==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz16=0;qcbz=0;r=0;
}}
if((IN17==0)&&(bz17==0)){delay(k);if(IN17==0){r=0;bz17=1;qcbz=1;}}
if((bz17==1)&&(IN17==1)){delay(k);if(IN17==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz17=0;qcbz=0;r=0;
}}
if((IN18==0)&&(bz18==0)){delay(k);if(IN18==0){r=0;bz18=1;qcbz=1;}}
if((bz18==1)&&(IN18==1)){delay(k);if(IN18==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz18=0;qcbz=0;r=0;
}}
if((IN19==0)&&(bz19==0)){delay(k);if(IN19==0){r=0;bz19=1;qcbz=1;}}
if((bz19==1)&&(IN19==1)){delay(k);if(IN19==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz19=0;qcbz=0;r=0;
}}
if((IN20==0)&&(bz20==0)){delay(k);if(IN20==0){r=0;bz20=1;qcbz=1;}}
if((bz20==1)&&(IN20==1)){delay(k);if(IN20==1)
{
    tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
        tmz1=receBuf;
write=1;bz20=0;qcbz=0;r=0;
}}
}
/********************************************************************

                                  主函数
*********************************************************************/
void main()
{
   delay(k);
   P4SW|=0x70;//配置P4.4为IO口                  
   P4M0&=0x00;                  
   P4M1&=0x00;
   for (y=0; y<160; y++)
    {
    tmz1 = Byte_Read(y);
    }
   init();   //串口初始化
   while(1)
   {
   KEY();
   if(write==1)
   {
    write=0;
        Sector_Erase(0);
        for (y=0; y<160; y++)
    {
   Byte_Program(y, tmz1);
    }
        qcbz=0;clear_receBuf();r=0;
   }
   if((r!=0)&&(qcbz==0)){delay(k);delay(k);delay(k);clear_receBuf();r=0;}
}       
}
/********************************************************************
                         串口一 发送接收中断函数
*********************************************************************/
void uart_isr()interrupt 4
{
if(RI)//如果有接收
           {
             RI=0; //接收标志清零
             receBuf=SBUF;   //把接受的数据存储到BUT数组中
               if(r>=8)
               {       
               flag_zx=1;
               }
           }
           if(flag_zx==1)
           {                     
             flag_zx=0;
               
                if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT1=0;delay(k);delay(k);OUT1=1;clear_receBuf();r=0;
                        }
                  else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT2=0;delay(k);delay(k);OUT2=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT3=0;delay(k);delay(k);OUT3=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT4=0;delay(k);delay(k);OUT4=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT5=0;delay(k);delay(k);OUT5=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT6=0;delay(k);delay(k);OUT6=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT7=0;delay(k);delay(k);OUT7=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT8=0;delay(k);delay(k);OUT8=1;;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT9=0;delay(k);delay(k);OUT9=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT10=0;delay(k);delay(k);OUT10=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT11=0;delay(k);delay(k);OUT11=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT12=0;delay(k);delay(k);OUT12=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT13=0;delay(k);delay(k);OUT13=1;clear_receBuf();r=0;
                        }
                  else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT14=0;delay(k);delay(k);OUT14=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT15=0;delay(k);delay(k);OUT15=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT16=0;delay(k);delay(k);OUT16=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT17=0;delay(k);delay(k);OUT17=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT18=0;delay(k);delay(k);OUT18=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT19=0;delay(k);delay(k);OUT19=1;clear_receBuf();r=0;
                        }
          else if((receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1)&&(receBuf==tmz1))
                        {
                        OUT20=0;delay(k);delay(k);OUT20=1;clear_receBuf();r=0;
                        }
               if(qcbz==0){clear_receBuf();r=0;}
} }

/********************************************************************
                            结束主函数
*********************************************************************/
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar Byte_Read(uint add)
{
    IAP_DATA = 0x00;
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;               //IAP/ISP/EEPROM 字节读命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8;    //设置目标单元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    //EA = 1;
    IAP_Disable();//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                  //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return (IAP_DATA);
}

//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void Byte_Program(uint add, uchar ch)
{
    IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x02;               //IAP/ISP/EEPROM 字节编程命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8;    //设置目标单元地址的低8 位地址

    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    //EA = 1;
    IAP_Disable();//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                  //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(uint add)
{
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x03;               //IAP/ISP/EEPROM 扇区擦除命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8;    //设置目标单元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    //EA = 1;
    IAP_Disable();//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                  //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

void IAP_Disable()
{
    //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG= 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0;
    IAP_ADDRL = 0;
}

/********************************************************************
                              结束
*********************************************************************/



神农鼎 发表于 2023-6-17 15:11:44

感谢分享 !
STC12C5A60S2系列是STC 第一代 1T 8051;
STC15W4K32S4系列是 STC 第二代 1T 8051;
STC8H8K64U系列是   STC 第三代 1T 8051;

STC32是32位8051

LGX6727 发表于 2023-7-6 07:26:54

{:4_165:}
页: [1]
查看完整版本: STC12C5A60S2单片机设计的20路NPN输入20路晶体管输出二维码扫码控制电路及程序分享