经典常用的单片机c程序
扫描二维码
随时随地手机看文章
//16进制<->10进制互换程序
unsigned char d[10];  //用于显示的10位显示缓存
//========================================================
  //16进制to10进制输出子程序:显示数据,起始位,结束位,有无小数点
//========================================================
void output(unsigned long dd,unsigned char s,unsigned char
e,unsigned charDIP) {
  unsigned long div;
  unsigned char tm[8],i,j;
  div=10000000;
  for (i=0;i<8;i++) {
    tm[i]=dd/div;
    dd%=div;
    div/=10;
  }
  for (i=0;i<6;i++) {
    if (tm[i]!=0) break;
    tm[i]=nul;
  }
  tm[5]|=dip;      //小数点控制,请看“串行LED数码管显示驱动程序”
  j=7;
  for (i=s;i
    j--;
  }
}
//把显示位5-9位的10进制数转换成为16进制数
unsigned int input(void) {
  unsigned int dd,dat;
  dd=10000;dat=0;
  for (i=5;i<10;i++) {
    dat+=dd*temp;
    dd/=10;
  }
  return(dat);
}
/*  89C51系列CPU编程器接收CPU程序*/
#i nclude 
#i nclude 
#i nclude 
#define e 8
#define p 9
#define l 10
sbit led=P3^2;
sbit p27=P2^7;
sbit p26=P2^6;
sbit p36=P3^6;
sbit p37=P3^7;
sbit rst=P3^3;
sbit ale=P3^5;
sbit vpp=P3^4;
bit b_break;
unsigned int adds;
//  13.8mS
void int_t0(void) interrupt 1 {
  TH0=-100;
  b_break=1;
}
void wait(unsigned char w) {
  unsigned int t=w*184;
  b_break=0;
  TL0=-t%256-1;TH0=-t/256;
  while (b_break==0) {}
}
void nop(void) {
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
unsigned char command(void) {
  TH0=-100;b_break=0;
  while (RI==0) {if (b_break==1) return(0);}
  RI=0;
  return(SBUF);
}
void earsure(unsigned char cpu) {
  switch (cpu) {
  case 1:    //89C51
  case 2:rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop();
    ale=0;wait(110);ale=1;nop();
    break;
  case 3:
  case 4:break;
  case 5:
  case 6:break;
  }
}
void program(unsigned char cpu) {
  unsigned int bdata adds=0;
  unsigned char d;
  switch (cpu) {
  case 1:  //89C51
  case 2:
    p36=p37=1;rst=1;
    while (1) {
      TH0=-100;b_break=0;
      while (RI==0) {if (b_break==1) return;}
      RI=0;
      d=SBUF;
      //address
      P0=adds%256;
      P2=adds/256;
      p27=1;
      //data
      P1=d;
      nop();  //48clcl
      //vpp
      vpp=1;
      nop();  //48clcl
      //ale
      ale=0;
      wait(1);//100uS
      ale=1;
      nop();  //10uS
      vpp=0;
      nop();  //48clcl
      p27=0;
      nop();  //48clcl
      P1=0xff;
      TH0=-100;b_break=0;
      while (d!=P1) {if (b_break==1) return;}  //data
polling
      SBUF=d;
      adds++;
    }
    break;
  case 3:
  case 4:
  case 5:
  case 6:break;
  }
}
voidLOCk(unsigned char cpu) {
  unsigned char i;
  switch (cpu) {
  case 1:  //89c51
  case 2:
    //lock 1
    rst=p26=p36=p27=p37=1;nop();
    vpp=1;
    nop();
    ale=0;
  //  for (i=0;i<6;i++) wait(100);
    wait(1);
    ale=1;
    nop();
    vpp=0;
    nop();
 
    //lock 2
    rst=p26=p27=1;p36=p37=0;nop();
    vpp=1;
    nop();
    ale=0;
  //  for (i=0;i<6;i++) wait(100);
    wait(1);
    ale=1;
    nop();
    vpp=0;
    nop();
   
    //lock 3
    rst=p26=p36=1;p27=p37=0;nop();
    vpp=1;
    nop();
    ale=0;
  //  for (i=0;i<6;i++) wait(100);
    wait(1);
    ale=1;
    nop();
    vpp=0;
    nop();
    break;
  case 3:
  case 4:
  case 5:
  case 6:break;
  }
}
void main(void) {
 unsigned char disp,flash,temp,cpu;
 EA=1;
 SCON=0xd8;PCON=0x80;
 TMOD=0x21;
 TL1=TH1=0xff;TR1=1;
 TH0=-100;ET0=TR0=1;
flash=0x80;
 while (1) {
 temp=command();
 switch (temp) {
 case 0:
 case 1: //89c51
 case 2: //89C52
 case 3: //80f51
 case 4: //80F52
 case 5: //87F51
 case 6:cpu=temp;SBUF=temp;break;//87f52
 case e:SBUF=temp;earsure(cpu);break; //erasure
 case p:SBUF=temp;program(cpu);break; //program
 case l:LOCk(cpu);SBUF=temp;break; //lock
 default:SBUF=temp;break;
 }
 b_break=0;
 if ((++disp)>flash) {disp=0;LED=!led;}
 }
}
//HT1380实时时钟驱动程序
sbit clock_dat=P0^1;
sbit clock_clk=P0^2;
sbit clock_rst=P0^3;
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
void clock_out(unsigned char dd) {
 ACC=dd;
 clock_dat=a0;clock_clk=1;clock_clk=0;
 clock_dat=a1;clock_clk=1;clock_clk=0;
 clock_dat=a2;clock_clk=1;clock_clk=0;
 clock_dat=a3;clock_clk=1;clock_clk=0;
 clock_dat=a4;clock_clk=1;clock_clk=0;
 clock_dat=a5;clock_clk=1;clock_clk=0;
 clock_dat=a6;clock_clk=1;clock_clk=0;
 clock_dat=a7;clock_clk=1;clock_clk=0;
}
unsigned char clock_in(void) {
 clock_dat=1;
 a0=clock_dat;
 clock_clk=1;clock_clk=0;a1=clock_dat;
 clock_clk=1;clock_clk=0;a2=clock_dat;
 clock_clk=1;clock_clk=0;a3=clock_dat;
 clock_clk=1;clock_clk=0;a4=clock_dat;
 clock_clk=1;clock_clk=0;a5=clock_dat;
 clock_clk=1;clock_clk=0;a6=clock_dat;
 clock_clk=1;clock_clk=0;a7=clock_dat;
 return(ACC);
}
unsigned char read_clock(unsigned char ord) {
 unsigned char dd=0;
 clock_clk=0;
 clock_rst=0;
 clock_rst=1;
 clock_out(ord);
 dd=clock_in();
 clock_rst=0;
 clock_clk=1;
 return(dd);
}
void write_clock(unsigned char ord,unsigned char dd) {
 clock_clk=0;
 clock_rst=0;
 clock_rst=1;
 clock_out(ord);
 clock_out(dd);
 clock_rst=0;
 clock_clk=1;
}
/*单个汉字库字摸提取程序,tc2.0编译*/
#i nclude "stdio.h"
#i nclude "dos.h"
#i nclude "process.h"
#i nclude "string.h"

			



		 