基於stc15f2k60s2芯片單片機編程(按鍵的長短按)

(一)程序現象

(DS1302+超聲波)上電顯示超聲波,按下S7切換爲時鐘,鬆開切換爲超聲波測距

(二)程序思路

關鍵按鍵如何去設置,以下是按鍵程序。

if(s4==0)
	{
	Delay10ms();
		if(s4==0)
		{			
			
			while(1)
			{
			DS_get();
				saomiao[0]=abile[TIME[2]/16];
				saomiao[1]=abile[TIME[2]%16];
				saomiao[2]=0xbf;
				saomiao[3]=abile[TIME[1]/16];
				saomiao[4]=abile[TIME[1]%16];
				saomiao[5]=0xbf;
				saomiao[6]=abile[TIME[0]/16];
				saomiao[7]=abile[TIME[0]%16];
				if(s4!=0)break;
			}
		
		}
		while(!s4);
	}

當按鍵按下的時候(沒鬆開),按鍵會一直在while裏不出來。當按鍵鬆開的時候就可以跳出去。短按直接在while外面進行設置就好了。

(三)程序設計

main.c函數

#include <stc15f2k60s2.h>
#include <intrins.h>
#include "ds1302.h"


void shumaguan();
void Timer0Init();
void Delay500ms();

unsigned char abile[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char saomiao[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
unsigned int distance;

void Send_Wave();
sbit TX=P1^0;
sbit RX=P1^1;
sbit s4=P3^0;
unsigned int t=0;
void Delay12us();
void mdistance();
void xianshi();
void Delay10ms();



void main()
{	

	Timer0Init();		 P2=0XA0;P0=0X00;  DS_init();

		while(1)
		{

		mdistance();xianshi();

		}
}




void xianshi()
{
		
 if(distance ==99)
		 {
			saomiao[0]=0x90;
			 saomiao[1]=0x90;
			 saomiao[2]=0x90;
			 Delay500ms();
			saomiao[3]=saomiao[4]=saomiao[5]=saomiao[6]=saomiao[7]=0xff;
		 }
		 else
		 {
		saomiao[0]=abile[distance%1000/1000];
		saomiao[1]=abile[distance%100/10];
		saomiao[2]=abile[distance%10];
    Delay500ms();
	  saomiao[3]=saomiao[4]=saomiao[5]=saomiao[6]=saomiao[7]=0xff;
		 }
	if(s4==0)
	{
	Delay10ms();
		if(s4==0)
		{			
			
			while(1)
			{
			DS_get();
				saomiao[0]=abile[TIME[2]/16];
				saomiao[1]=abile[TIME[2]%16];
				saomiao[2]=0xbf;
				saomiao[3]=abile[TIME[1]/16];
				saomiao[4]=abile[TIME[1]%16];
				saomiao[5]=0xbf;
				saomiao[6]=abile[TIME[0]/16];
				saomiao[7]=abile[TIME[0]%16];
				if(s4!=0)break;
			}
		
		}
		while(!s4);
	}
}


void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void weixuan() interrupt 1
{
	unsigned char i;
	 P2=P2&0x1f|0xe0;
	P0=0xff;
	P2=0x1f;
  P2=P2&0x1f|0xc0;
	P0=1<<i;
	P2=0x1f;
  P2=P2&0x1f|0xe0;
	P0=saomiao[i];
	P2=0x1f;
	i++;
	if(i==8) i=0;
}
void Timer0Init()		//[email protected]
{
	AUXR |= 0x80;		//?????1T??
	TMOD &= 0xF0;		//???????
	TL0 = 0x9A;		//??????
	TH0 = 0xA9;		//??????
	TF0 = 0;		//??TF0??
	TR0 = 1;		//???0????	
	EA=1;
	ET0=1;
}


void Send_Wave()
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
	TX=1;
	 Delay12us();
	 TX=0;
	Delay12us();
	}
}
void mdistance()
{	
	unsigned int time=0;
	TMOD&=0X0F;//定時器1模式
	TL1=0;
	TH1=0;//初始化
	Send_Wave();  //發送聲波信號
	TR1=1;//啓動定時器
	while((RX==1)&&(TF1==0)) ;//等待超聲波信號返回或者等到測量超出範圍
	TR1=0; //停止定時器
	
	if(TF1==0)
	{
		t=TH1;
		t=(t<<8)|TL1;  //將計算值裝到16爲計數器
		distance=t*0.017;//測量距離
	}
	else
	{   
	 	TF1=0;//禁止中斷溢出
	 	distance=99;
	}
//	if(distance>=30)
//	{P2=0XA0;P0=0Xff;P2=0X1F;}
//	else 
//	{P2=0XA0;P0=0X00;P2=0X1F;}
		}
void Delay12us()            
{
	unsigned char i;
 
	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

ds1302.c函數

#include<ds1302.h>

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302??												


unsigned char code READ_RTCADDR[7]={0X81,0X83,0X85,0X87,0X89,0X8B,0X8D};
unsigned char code WRITE_RTCADDR[7]={0x80,0X82,0X84,0X86,0X88,0X8C,0X8E};
 char TIME[7]={0x50,0x59,0x23};
 
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}

unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();
	return (temp);			
}
void DS_init()
{
	unsigned char n;
	Write_Ds1302_Byte(0x8e,0x00);//關閉寫保護
  	for(n=0;n<3;n++)
	Write_Ds1302_Byte(WRITE_RTCADDR[n],TIME[n]);
  Write_Ds1302_Byte(0x8e,0x80);
}

void DS_get()
{
	unsigned char n;
	for(n=0;n<3;n++)
  TIME[n]=Read_Ds1302_Byte (READ_RTCADDR[n]);
}



ds1302.h函數

#ifndef __DS1302_H_
#define __DS1302_H_

#include<stc15f2k60s2.h>
#include<intrins.h>



void Write_Ds1302(unsigned  char temp) ;
void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) ;
unsigned char Read_Ds1302_Byte ( unsigned char address );
void DS_init();
void DS_get();
extern char TIME[7];


//---??????--//


#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章