⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 jmq1.c

📁 这是一个用51单片机做的记米器程序
💻 C
字号:
#define POD8751
#include <reg51.h>
#include <math.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

/*define MAX7219*/
sbit led_din=P1^7;  
sbit led_clk=P1^6;  
sbit led_ena=P1^5; 
/*define MAX7219 end */

/*define x25045*/
sbit xicorcs=P1^0;
sbit xicorsi=P1^1;
sbit xicorsck=P1^2;
sbit xicorso=P1^3;
/*define x25045 end*/

/*define sub of x25045*/
void wren_cmd(void);
void wrsr_cmd(void);
void rdsr_cmd(void);
void tbyte_write(uchar);
void tbyte_read(uchar);
void out_byte(uchar);
void in_byte(void);
void wip_poll(void);
/*define sub of x25045 end*/


/*define 89c51*/
sbit inc=P3^4;
sbit dec=P3^6;
sbit set=P3^3;
sbit save=P3^7;
sbit clear=P0^4;
sbit restart=P0^5;
sbit out1=P0^6;
sbit out2=P0^7;

uint mode,num,disp;
float meter,r;
uchar sdata;
bdata uchar rdata;
union {uint  word;struct{uchar hi;uchar lo;}bytes;}alldata;
bit oldsave,oldset;
uchar code ledmtab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00};
sbit fwip=rdata^0;
  void service_int0();
  void displ(uint,uchar);
  void send(uint);
  void wdelay(void);
  void ldelay(void);
  void deal();
  void int7219();

  void main(void)
{   
   meter=0;
   disp=meter;
   out1=1;
   out2=1;
   IT0=1;
   EX0=1;
   PX0=1;
   EA=1;
   mode=0;
   num=0;
  
   set=1;
   clear=1;
   inc=1;
   dec=1;
   save=1;
   oldsave=save;
   oldset=set;
   restart=1;
   int7219();
      
   
   for(;;)
   {   
       if(mode!=0) deal();/*判断SET键的状态,若SET键按下,则转DEAL()子程序*/

       if(!restart) 
       {meter=0;IT0=1;EX0=1;PX0=1;EA=1;}

       disp=meter;
       displ(disp,mode);

       wren_cmd();wrsr_cmd();tbyte_read(0x00);/*计米到设置1时,OUT1灯亮,指示开始减速*/
       if((meter==(float)alldata.word)&&(meter!=0))  
       {out1=0;send(0x500+(uint)(0x40));}

       wren_cmd();wrsr_cmd();tbyte_read(0x02); /*计米到设置2时,OUT2灯亮,指示停止*/
       if((meter==(float)alldata.word) &&(meter!=0)) 
	  { out2=0;IT0=0;EX0=0;PX0=0;EA=0;send(0x500+(uint)(0x08));}

       if (!clear) {meter=0;IT0=0;EX0=0;PX0=0;EA=0;}

       if (oldset!=set)/*按下SET键时的工作*/
	{ ldelay(); mode++;oldset=set;}

       wren_cmd();wrsr_cmd();tbyte_read(0x04);
       r=(float)alldata.word/10;
    }                                                                                                                                                                                    
}

void service_int0() interrupt 0 using 1   /*计算送一次脉冲的米数*/
{  
    num++;/*统计误差*/
    meter=meter+2*3.14159*r;
    if (!(num%5)) meter=meter+1.0;
   }        
   
void deal()
{  

    if (mode==1)/*模式1状态下的工作*/
    {  wren_cmd();wrsr_cmd();/*读取设置1的值并显示*/
       tbyte_read(0x00); disp=alldata.word;displ(disp,mode);} 

    if (mode==2) /*模式2状态下的工作*/
    {  wren_cmd();wrsr_cmd();/*读取设置2的值并显示*/
       tbyte_read(0x02);disp=alldata.word;displ(disp,mode); }

    if (mode==3) /*模式3状态下的工作*/
    {  wren_cmd();wrsr_cmd();/*读取设置3的值并显示*/
       tbyte_read(0x04);disp=alldata.word;displ(disp,mode);}

      for(;;)
   {
      if (oldset!=set)
      { wdelay();mode++;oldset=set;if(mode>3) mode=0;break;}

    if (!inc)/*按下INC键时的工作*/
    { wdelay();
         if (!inc) 
         {
           if (disp==9999) disp=0;else disp++;
           displ(disp,mode);
           }
       }
            

    if (!dec) /*按下DEC键时的工作*/
    { wdelay();
         if (!dec) 
         {           
           if (disp==0) disp=9999;else disp--;
           displ(disp,mode);
           }
     }
          
	  
     if (oldsave==!save) /*按下SAVE键时的工作*/
    {  ldelay();
       if (mode==1){alldata.word=disp;wren_cmd();tbyte_write(0x00);}
       if (mode==2){alldata.word=disp;wren_cmd();tbyte_write(0x02);}
       if (mode==3){alldata.word=disp;wren_cmd();tbyte_write(0x04);}
       oldsave=save;
       mode++;
       if(mode>=3) mode=0;
       break;
        }
   }
}

void displ(uint n,uchar cap)/*显示程序*/
{ 
   uchar temp[4];
   uint d,i;
   if (cap==0) send(0x0500+(uint)(0x00));/*模式0下,第5位无显示*/
   if (cap==1) send(0x0500+(uint)(0x30));/*模式1下,第5位显示1*/
   if (cap==2) send(0x0500+(uint)(0x6d));/*模式2下,第5位显示2*/
   if (cap==3) send(0x0500+(uint)(0x79));/*模式3下,第5位显示3*/

   d=n;
   temp[3]=0;while(d>=1000) {temp[3]++; d-=1000;}
   temp[2]=0;while(d>=100) {temp[2]++;d-=100;}
   temp[1]=0;while(d>=10) {temp[1]++;d-=10;}
   temp[0]=(uchar)d;

   for(i=0;i<4;i++)
      {  temp[i]=ledmtab[temp[i]];
         if ((i==1)&&(cap==3)) temp[i]|=0x80;
        }

    d=n;
   if (d<10)
   { send(0x0400+(uint)(0x00));
     send(0x0300+(uint)(0x00));
     if (mode!=3)
     send(0x0200+(uint)(0x00));
     else
     send(0x0200+(uint)(0x7e+0x80));
     send(0x0100+(uint)(temp[0]));}
   else
     { if (d<100)   
       {  send(0x0400+(uint)(0x00));
          send(0x0300+(uint)(0x00));
          send(0x0200+(uint)(temp[1]));
          send(0x0100+(uint)(temp[0]));}
      else { if (d<1000)       
             {  send(0x0400+(uint)(0x00));
                send(0x0300+(uint)(temp[2]));
                send(0x0200+(uint)(temp[1]));     
                send(0x0100+(uint)(temp[0]));}
             else
                {  send(0x0400+(uint)(temp[3]));
                   send(0x0300+(uint)(temp[2]));
                   send(0x0200+(uint)(temp[1]));
                   send(0x0100+(uint)(temp[0]));}
                }
             }
  }


void send(sh1)
uint sh1;
{uchar i;
   led_clk=0;
   led_ena=1;
 for(i=0;i<16;i++)
  {led_clk=0;
     sh1<<=1;
      led_din=CY;
       led_clk=0;
	led_clk=1;
  }
  led_clk=0;
   led_ena=0;led_ena=1;led_ena=0;
}

void wdelay(void)
{  uchar i,j;
    for (i=0;i<50;i++)
      for(j=0;j<200;j++)
          {;}
}

void wren_cmd(void)
{
 xicorsck=0;
 xicorcs=0;
 out_byte(0x06);
 xicorsck=0;xicorcs=1;;;
 }

void wrsr_cmd(void)
{xicorsck=0;xicorcs=0;;;
 out_byte(0x01);
 out_byte(0x00);
 xicorsck=0;xicorcs=1;;
 wip_poll();
}

void rdsr_cmd(void)
{xicorsck=0;xicorcs=0;
 out_byte(0x05);;;
 in_byte();;;
 xicorsck=0;xicorcs=1;;
}


void tbyte_write(uchar twaddress)
{xicorsck=0;xicorcs=0;;;
 out_byte(0x02);
 out_byte(twaddress);
 out_byte(alldata.bytes.hi);
 out_byte(alldata.bytes.lo);
 xicorsck=0;xicorcs=1;;
 wip_poll();
 }


void tbyte_read(uchar traddress) 
{xicorsck=0;xicorcs=0;;
 out_byte(0x03);;
 out_byte(traddress);
 in_byte();;
 alldata.bytes.hi=rdata;
 in_byte();;
 alldata.bytes.lo=rdata;
 xicorsck=0;xicorcs=1;;
 }



void out_byte(sdata)
uchar sdata;
{uchar scount=0x08;
 while(scount){
               xicorsck=0;;;
	       sdata<<=1;
               xicorsi=CY;;
               xicorsck=1;;
	       --scount;
	       }
               xicorsi=0;
 }

void in_byte(void)
{uchar rcount=0x08,subbyte;
 rdata=0;
 while(rcount){
               xicorsck=1;;
               xicorsck=0;;;
               CY=xicorso;
	       subbyte=(uchar)CY;
	       rdata*=2;
	       rdata+=subbyte;
	       --rcount;
	       }
}

void wip_poll(void)
{uchar max=0x99;
 do{
    rdsr_cmd();
    rdata=rdata;
    --max;
    }while(fwip&&(max!=0));
 }

void ldelay(void)
{uchar i,j;
 for(i=0;i<120;i++){    
     for(j=0;j<150;j++){;}
		    }
 }


void int7219(void)
{
  send(0x0900); send(0x0a01);  send(0x0b04);  send(0x0c01);
  send(0x010f);send(0x020f);send(0x030f);send(0x040f);send(0x050f);
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -