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

📄 embed.c

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

#define uchar unsigned char
#define uint unsigned int


uchar cur_state;
uchar next_state;

uint Num_Of_Circle;
uint array[6]={1,2,3,4,5,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	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 code  CON[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//数据显示的位选信号11111110	到11011111
											

uchar data inkey _at_ 0x30;//按键值
uchar data  key_down _at_ 0x7E;//按键次数
uchar key;
void initial(void)
{
/*
	T2CON=0x34;
	SCON=0xD0;
	
	PCON=0x00;//波特率不加倍
	RCAP2L=0xC7;
	RCAP2H=0xFE;//定时器2波特率1200
	TR2 = 1;
//*/	

	inkey=0;key_down=0;
	cur_state = 0;
	next_state =0;
	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=0;
}

void delay10ms(uint s)//100 == 1second
{
	uint i;
	while(s--)
	{
		for(i=0;i<255;i++)
		{
			_nop_();
			_nop_();	
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}
void getKey()
{
	P3=P3|0xF0;
	delay10ms(1);
	key=P3&0xF0;
	if(key!=0xF0  && key_down==0)
		{
			key_down+=1;
			switch(key)
			{
				case 0x70:
					inkey=1;
					break;
				case 0xB0:
					inkey=2;
					break;
				case 0xD0:
					inkey=3;
					break;
				case 0xE0:
					inkey=4;
					break;
				default:
					key_down=0;
					break;
				}
			}
	# pragma asm
	#pragma endasm
}

void show( uint bitCon,uint num)
{
  uchar seg =SEGPOS[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 = 0;
				break;
			case 2:
				next_state = 1;
				break;
			case 3:
				next_state = 2;
				break;			
		}
		cur_state = next_state;
}	

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;
    uint LED=0xFF7F;
    initial();

    while(1)
    {
	     getKey();//获得按键输入
	     if(key_down)
	     {
		     	key_down=0;
		     	P3_0=!P3_0;
	     }
/*
//*/
/**设置**
//*/	     	
/*            
	     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 +=1;
			P1=LED;
			LED=LED>>1;
  	  delay10ms(100);	 //**************
			if(LED==0x01FE)
			{
				LED=0xFF7F;
			}
/*      
      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 + -