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

📄 subprogram.h

📁 毕设时做的程序
💻 H
字号:
#define	uint	unsigned int
#define uchar  unsigned char

void start();
void stop();
unsigned char shin();
bit shout(unsigned char write_data);
unsigned char read_random(unsigned char random_addr);
void write_byte( unsigned char addr, unsigned char write_data);
void fill_byte(unsigned char fill_data);
void delay_n_ms( unsigned int n_milisecond) ;
void Rest()  ;
//uchar  Send(uchar N);


void dyms(unsigned char a)  //微秒延时程序
{
  while(--a);                  
}
void delay(void)   //延迟程序
{
int i,j;
for(i=50;i--;i>0)
  for(j=10000;j--;j>0)
  ;
}

void DelayMs(uchar CNT)          //fosc=12HzM
{
	uchar i;
	while(CNT-- !=0)
		for(i=0;i<100;i++);
}

void clr_wdt() 			//软件看门狗                  
{
	WDTRST = 0x1E;		// 清除看门狗指令
	WDTRST = 0xE1;		// 
}

void MCU_Init()
{   
	uchar i,j;
    TMOD=0x11;                 //波特率发生器T1工作在模式2上
	TH0=(65536-500)/256; 
	TL0=(65536-500)%256; 
	TH1=(65536-10000)/256;
    TL1=(65536-10000)%256;  
	TR0=1; 
	TR1=0;
	ET0=1; 
	ET1=1;
	PT1=1;					//T1 中断优先级设定
	EA=1;

	P3=0xff;
	BEEP=0;
	doorNumflag=0;
	psCHINf=0;
	Keyenableflag=1;
	AUXR = 0xff;				// 初始化看门狗相关寄存器
   for(j=0;j<20;j++)
   {
	for(i=0;i<6;i++)				//读密码		
		{
		ps[i]=read_random(i);
		
		}
	}		
}

void DealNum()
{
  if(keycount<6) 
   {   
	 if(doorNumflag==1)     
		{
		if(keycount<3)  dispbuf[5+keycount]=key;
		
		else  {keycount=2; 	errorflag=1; rightflag=0; }		 
				// 输入三位门号后,继续输入数字键错误提示			 	
		 }
     else   psCH0flag=1;

     if(psCH0flag==1){ getps[keycount]=key;  dispbuf[7-keycount]=19;}
     if(psCH1flag==1 ) {psbuf1[keycount]=key; dispbuf[7-keycount]=19;}
     if(psCH2flag==1 ) {psbuf2[keycount]=key; dispbuf[7-keycount]=19;}
     
  } 
  keycount++;  
  if(keycount==6)     keycount=6;    
  else if(keycount>6)          //输入6位密码后,再输入数字错误提示
   { keycount=6;  errorflag=1;  rightflag=0; } 	 
}




void DealDel()							//取消键的处理
{  uchar i;
   if(keycount>0) 
    { 		
	if(psCH0flag==1) for(i=keycount;i>0;i--)getps[i]=0;
	if(psCH1flag==1 ) for(i=keycount;i>0;i--)psbuf1[i]=0; 
    if(psCH2flag==1 ) for(i=keycount;i>0;i--)psbuf2[i]=0; 
	for(i=keycount;i>0;i--)  dispbuf[8-i]=16;
  } 
   else                   //没有输入密码,按取消键错误报警提示
   { errorflag=1; rightflag=0;} 
   keycount=0; 
  
}

void  Doorbell(void )
{

unsigned char flagsing=0;
//TR0=0;
while(1)
     {
     switch(music_tab[i])
     {
        case 0x00:
            i=0;delay();flagsing=1 ;break; // 曲终停顿一定时间
        case 0xff:
            i=i+1;dyms(100);break;  //遇到休止符停顿一定时间100微秒,再取下一个频率
        default:
               m=music_tab[i++];
			   n=music_tab[i++];//取频率到m,取节拍到n  
                 TR1=1;
                 while(n!=0)
                  {
                  BEEP=!BEEP;
                  dyms(4*m);//调整产生的频率,可以通过在m前的值来修正音调的高
                   }
    TR1=0;
      }
     if(flagsing==1) goto outmusic ;
     }
/*uchar i,nom;
 unsigned char m;   //m为频率常数
//unsigned char n=0; //n为节拍常数 
//Keyenableflag=0;                      //禁止案件输入
 TR0=0; 
 TR1=0; 							//禁止TR0中断 
 i=0;    
 for(nom=0;nom<191;nom++)
     {
     if(music_tab[i])
     {
        
        if(music_tab[i]==0xff)
            dyms(100); //遇到休止符停顿一定时间100微秒,再取下一个频率
        else 
         {   m=music_tab[i++];
			 n=music_tab[i++];//取频率到m,取节拍到n  
             TR1=1;
             while(n!=0)
             {
             BEEP=!BEEP;
             dyms(4*m);             //调整产生的频率,可以通过在m前的值来修正音调的高
             }
		 }
      TR1=0;
      }     
     }*/
 outmusic:
 	
 // Keyenableflag=1;                      //禁止案件输入
   Rest();
}


void Dealpschange()              //密码修改键的处理
{
	uchar i;
	if(keycount!=pslen)               //密码不足6位,错误报警提示。且显示清空
	{ 
    if(keycount==3 && doorNumflag==1)  

	    {doorNumflag=0;  dispbuf[0]=17; psCHINf=1; goto b; }
			//输入门号后按确定,显示P开始输入门号
	errorflag=1; 

	rightflag=0; 
	} 
	else
	{
	
		for(i=0;i<keycount;i++) 
	 	{ 
	  		if(getps[i]!=ps[i])         //输入的6位密码不正确,错误报警提示
				{ 
				i=keycount; 
				errorflag=1; 
				rightflag=0; 
				second3=0; 
				goto b; 
				} 
	  	}
		dispbuf[0]=17;
		psCHINf=1;
    	if( psCHINf==1 )            //修改密码时旧密码输入正确,            
			 {							//提示输入新密码,显示H1
				psCH0flag=0;
				psCH1flag=1;            
				dispbuf[1]=1;
			 }			
	}


	b:second3=0; 

	keycount=0;

	for(k=2;k<8;k++)
   		{dispbuf[k]=16;}			 				  
}


void DealENl()                    //确定键的处理     
{
  
uchar i,j;
if(keycount!=pslen)               //密码不足6位,错误报警提示。且显示清空

	{ 
    if(keycount==3 && doorNumflag==1)  

	    {doorNumflag=0;  dispbuf[0]=18; goto a; }
			//输入门号后按确定,显示P开始输入门号
	errorflag=1; 

	rightflag=0; 
	
	second3=0; 

	keycount=0;

	for(k=2;k<8;k++)
   		{dispbuf[k]=16;}

	} 

else 
	{
  if(psCH2flag==1)
  {
    for(i=0;i<keycount;i++) 
	 { 
	  if(psbuf1[i]!=psbuf2[i])         //两次输入的新密码不相同,错误报警提示
		{ 
		i=keycount; 
		errorflag=1; 
		rightflag=0; 
		second3=0; 
		goto a; 
		} 
	  }	
    for(i=0;i<keycount;i++)   
	  {       //两次输入相同,修改密码	   
	    ps[i]=psbuf1[i];	    
	  }
	for(j=0;j<20;j++)
	for(i=0;i<keycount;i++)   
	  {       //两次输入相同,修改密码	   
	    write_byte(i, ps[i]);	    
	  }
	errorflag=0;                             
    rightflag=1;			
	psrightflag=1 ;	
  	psCH2flag==0; 
  }

  if(psCH1flag==1)  {psCH1flag=0; psCH0flag=0;psCH2flag=1;dispbuf[1]=2;}

  if(psCH0flag==1)                 //密码输入正确与否的处理
	 {
	 for(i=0;i<keycount;i++) 
	 { 
	  if(getps[i]!=ps[i])         //输入的6位密码不正确,错误报警提示
		{ 
		i=keycount; 
		errorflag=1; 
		rightflag=0; 
		second3=0; 
		goto a; 
		} 
	  }
    if( psCHINf==1 )            //修改密码时旧密码输入正确,            
	 {							//提示输入新密码,显示H1
		psCH0flag=0;
		psCH1flag=1;            
		dispbuf[1]=1;
	 }
	else
	 {
	 	errorflag=0;                //输入密码正确,提示并显示清空               
		rightflag=1;			
	 	psrightflag=1 ; 			//输入密码正确标志
	  }
	}    //end if(psCH0flag==1)  
   
	a: i=keycount; 	
	keycount=0;
	for(k=2;k<8;k++)
   {dispbuf[k]=16;}

} 
}

void ReleaseKey()                    //等待键释放
{
   temp=temp & 0x0f;                          
   while(temp!=0x0f) 
   { temp=P1; temp=temp & 0x0f; }         
}

void KeyDelay()                  //按键延时去抖
{
	uchar i,j;
	for(i=10;i>0;i--) 
	for(j=248;j>0;j--); 
	temp=P1; 
	temp=temp & 0x0f;
}

void  efficiencyKey()         // 按键有效提示
{
	temp=P1;          //按键有效标志,
	P3_2=0; 		 //指示灯闪	
	BEEP=1;  		//声音提示
	DelayMs(50) ;
	P3_2=1; 
	BEEP=0; 
}

void Rest()                   //复位件键复位
{
	doorNumflag=0;
	keycount=0;
	psrightflag=0;
	psCHINf=0;
	psCH0flag=0;
	psCH1flag=0;
	psCH2flag=0;	
	for(k=0;k<8;k++)   {	dispbuf[k]=16;   	}
	for(k=0;k<6;k++)	{psbuf1[k]=0;psbuf2[k]=0;getps[k]=0;}
}

void delay_n_ms( unsigned int n_milisecond)  /* n mS delay */
{
    unsigned char i;
     while(n_milisecond--)
     {
          i=37;
          while(i--);
     }
}


void start()
// 开始位
{
	SDA = 1;
	SCL = 1;
	_nop_();
	_nop_();
	SDA = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL = 0;
}

void stop()
// 停止位
{
	SDA = 0;
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 1;
}

unsigned char shin()
// 从AT24Cxx移入数据到MCU
{
	unsigned char i,read_data;
	for(i = 0; i < 8; i++)
	{
		SCL = 1;
		read_data <<= 1;
		read_data |= (unsigned char)SDA;
		SCL = 0;
	}
	return(read_data);
}
bit shout(unsigned char write_data)      
// 从MCU移出数据到AT24Cxx
{
	unsigned char i;
	bit ack_bit;
	for(i = 0; i < 8; i++)		// 循环移入8个位
	{
		SDA = (bit)(write_data & 0x80);
		_nop_();
		SCL = 1;
		_nop_();
		_nop_();
		SCL = 0;
		write_data <<= 1;
	}
	SDA = 1;			// 读取应答
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ack_bit = SDA;
	SCL = 0;
	return ack_bit;			// 返回AT24Cxx应答位
}

void write_byte(unsigned char addr, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
	start();
	shout(OP_WRITE);
	shout(addr);
	shout(write_data);
	stop();
	delay_n_ms(10);		// 写入周期
}

void fill_byte(unsigned char fill_data)
// 填充数据fill_data到EEPROM内
{
	unsigned char i;
	for(i = 0; i < MAX_ADDR; i++)
	{
		write_byte(i, fill_data);
	}

}

unsigned char read_current()
// 在当前地址读取
{
	unsigned char read_data;
	start();
	shout(OP_READ);
	read_data = shin();
	stop();
	return read_data;
}

unsigned char read_random(unsigned char random_addr)
// 在指定地址读取
{
	start();
	shout(OP_WRITE);
	shout(random_addr);
	return(read_current());
}



⌨️ 快捷键说明

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