网站标志
导航菜单
当前日期时间
当前时间:
购物车
购物车中有 0 件商品 去结算 我的订单
商品搜索
商品搜索:
文章正文
单片机16进制转10进制程序(1)
作者:管理员    发布于:2015-08-17 16:53:08    文字:【】【】【

  单片机16进制转10进制程序
 unsigned char d[10];    //用于显示的10位显示缓存
 //========================================================
      //16进制to10进制输出子程序:显示数据,起始位,结束位,有无小数点
 //========================================================
  void output(unsigned long dd,unsigned char s,unsigned char
  e,unsigned char dip) {
      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<e;i++) {
          d[i]=tm[j];
          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 <reg51.h>
  #i nclude <intrins.h>
  #i nclude <absacc.h>
 
 #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;
      }
  }
 
 void lock(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;

浏览 (42) | 评论 (0) | 评分(0) | 支持(0) | 反对(0) | 发布人:管理员
将本文加入收藏夹
新闻详情
脚注栏目
|
脚注信息
机电工程网(C) 2015-2020 All Rights Reserved.    联系我们