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

📄 temp.txt

📁 单片机的一个小系统演示
💻 TXT
字号:
#include <AT89X52.H>
#include "intrins.h"
#include "absacc.h"

#define uchar unsigned char
#define uint unsigned int

//状态定义
#define	time_show  0x01		//时间显示
#define	date_show  0x02		//日历显示
#define	second_show  0x03//秒表显示
#define time_set 0x04
#define date_set 0x05

uchar cur_state;
uchar next_state;

uint hour,minute,second,//时间
	   Cminute,Csecond,Csecond10;//秒表
uint year,month,day;									//日历
uint Num_Of_Circle;
uint array[6];   //显示数据存储区

//uchar code	SEGPOS[34]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
											//"0"		"1"	"2"		"3"	"4"		"5"	"6"		"7"	"8"		"9"	"A"		"B"	"C"		"D"	"E"		"F"	"-"	 "空" "0." "1."	"2."	"3.""4."	"5.""6."	"7.""8."	"9.""A."	"B.""C."	"D.""E."	"F."	
											//带点的比不带点的大18个位置	  阳极
uchar code  CON[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//数据显示的位选信号11111110	到11011111
											
//阴极段码											
uchar code	SEGNEG[34]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00,0xBF,0x86,0xD4,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1};

uchar data inkey _at_ 0x30;//按键值
uchar data  key_down _at_ 0x7E;//按键次数

void initial(void)
{
/*
	T2CON=0x34;
	SCON=0xD0;
	
	PCON=0x00;//波特率不加倍
	RCAP2L=0xC7;
	RCAP2H=0xFE;//波特率1200
	TR2 = 1;
//*/	

	inkey=0;
	hour=0x06;	minute=0x30; second=0x00; 
	Cminute=0x00; Csecond=0x00;Csecond10=0x00;
	year=0x08;month=0x01; day=0x01;
	cur_state = date_show;
	next_state = date_show;
	Num_Of_Circle=0;
  
	TMOD=0x16;//T0 计数(方式2),T1 计时(方式1),T2 波特率		GATE C/~T M1 M0 
	TH0=0xFF;	TL0=0xFF;
	TH1=0x3C;	TL1=0xB0;//50ms
	
	TR0=1;	TR1=0;

	ET0=0;	ET1=1;
	EX0=0;	EX1=0;
  ES=0;
	EA=1;
}
void delay10ms(uint s)//100 == 1second
{
	while(s--)
	{
		# pragma asm
				MOV R3,#10H
			DS11:
				MOV	R2,#0FFH
			DS12:
				DJNZ	R2,DS12
				NOP
				NOP
				NOP
				NOP
				NOP
				
				DJNZ	R3,DS11
		#pragma endasm
	}
}

void getKey()
{
	if(P2!=0xFF)
		{
			delay10ms(2);
			if(P2!=0xFF)
				{
					key_down+=1;
				}
			if(P1_0==0)
				{
					inkey=1;
				}
			if(P1_1==0)
				{
					inkey=2;
				}
			if(P1_2==0)
				{
					inkey=3;
				}
			if(P1_3==0)
				{
					inkey=4;
				}	
				
		}
		else
			key_down=0;
}

void show( uint bitCon,uint num)
{
  uchar seg =SEGNEG[num];
	P0=seg;	
	switch(bitCon)
	{
    case 0:
			P2=CON[0];
			break;
		case 1:
			P2=CON[1];
			break;
		case 2:
			P2=CON[2];
			break;
		case 3:
			P2=CON[3];
			break;
 		case 4:
			P2=CON[4];
			break;
		case 5:
			P2=CON[5];
			break;

	}
}

//*驱动蜂鸣器
void Buzzer()
{
	P2_6 = 1;//buzzer
	P2_7 = 1;//led
	delay10ms(100);
}

void clearAlarm()
{
	P2_6 = 0;//buzzer
	P2_7 = 0;//led
}

void stateMachine(uchar inkey)
{
		switch(inkey )//复位到显示时间
		{
			case 1:
				next_state = date_show;
				break;
			case 2:
				next_state = second_show;
				break;
			case 3:
				next_state = time_show;
				break;			
		}
		cur_state = next_state;
}	
void getTime(uint circle)
{
	  Csecond10=circle/2;//分秒  circle是0到19的
 //**********************************************
	  if(Csecond10==0)  
	  {
	  	Csecond+=1;
		  if(Csecond==60)
		  {
		  	Csecond=0;
		  	Cminute+=1;
		  }
	  }
}

void setplay(uint h2bit ,uint m2bit,uint l2bit)
{
		array[5]=h2bit/10%10;
		array[4]=h2bit%10+18;
		array[3]=m2bit/10;
		array[2]=m2bit%10+18;
		array[1]=l2bit/10;
		array[0]=l2bit%10+18;
}
void main()
{
    uint display=0;
    initial();

    while(1)
    {
	     getKey();//获得按键输入
	     if(TR1==1)
	     	getTime(Num_Of_Circle);//秒表功能
/**设置**
	     if(inkey==4)
	     if(inkey==5)
//*/	     	
            
	     switch(cur_state)
	     {
	      	case time_show:
			  			setplay(hour,minute,second);
			  			break;
			  	case date_show:
			  			setplay(year,month,day);
			  			break;
			  	case second_show:
			  			setplay(Cminute,Csecond,Csecond10);
			  			break;
		  }
		  
//动态显示四位数据
      show(display,array[display]);
      if(display==5)
    	   display=0;
			else
				display=display+1;
//  	  delay10ms(1);	 //**************
      
      if(key_down == 1)  //运行状态机   
      	stateMachine(inkey);  		
    }
}

/*/////////////////////////////////////////////////////////////
各中断函数的具体处理
//*/
void TIME0() interrupt 1// 计数七次的外部信号下降
{
	if(Num_Of_Circle==0)
		TR1=1;
	Num_Of_Circle = 0;
}

void TIME1() interrupt 3//T1  计时 50ms
{
	Num_Of_Circle = Num_Of_Circle==19 ? 0 : Num_Of_Circle + 1;
}

void EX0INT()   interrupt 0
{
}

void EX1INT()   interrupt 2
{
}

void  SERIAL()  interrupt 4
{
}
///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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