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

📄 main.c

📁 单片机开发训练板”的使用者提供一个实验参考
💻 C
字号:
#pragma small
#include "REGX52.H" 
#include "stdio.h"
//#include "string.h"

void 	delay();   
void 	display(void);  
void 	key(void);  
void	init_t0_1(void); 
void	init_t2(void);
void	second(void);
void	music(void);
void	init_board(void);
//void	receive(char);
void	ad_timer(void);			//调整时间子程序
extern	void	send(char);

unsigned char 	code	led[]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char 	code	ledd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

unsigned char 	data	dis_buf[7],key_num=0;//dis_buf[0]为最高位数据,dis_buf[5]为最低位数据;dis_buf[6]为二极管的

unsigned char 	data	operate,byte_bit,rx_byte=0;
unsigned char  	data 	mus_th0,mus_tl0,mus_th1,mus_tl1,mus_num;
unsigned char  	data 	dida=20,secl,sech,minl=5,minh=2,houl=9,houh=0,hour=9,ad_time;

bit		flag_music,flag_t2,flag_serial,rx_bit;

//********************************************************

void int_t0(void)	interrupt 1   using 1             //T0中断
{  
	static	unsigned char 	data	i=0xff;
	
	TL0=0x15;
	TH0=0xfd;
	rx_bit=P3_3;
	if(i==0xff)
	{
		if(rx_bit)
		{
			TR0=0;		EX1=1;
			return;
		}
	}
	if(rx_bit)	rx_byte=rx_byte+1<<i;
	
	i++;
	if(i==8)
	{
		i=0xff;
		dis_buf[1]=rx_byte;
		rx_byte=0;
		TR0=0;
	}		
}
//********************************************************

void int_t1(void)	interrupt 3   using 1             //T1中断,时钟程序,fosc按12MHz计算
{  												
	TL1=0xb0;
	TH1=0x3c;
	dida--;
	if(dida>0)	return;
	dida=20;	secl++;		if(operate==0x03||operate==0x08)	dis_buf[5]=secl;
	if(secl<10)	return;	
	secl=0;		sech++;		if(operate==0x03||operate==0x08)	{dis_buf[5]=secl;	dis_buf[4]=sech;	}
	if(sech<6)	return;
	sech=0;		minl++;		if(operate==0x03||operate==0x08)	{dis_buf[4]=sech;	dis_buf[3]=minl;	}
	if(minl<10)	return;
	minl=0;		minh++;		if(operate==0x03||operate==0x08)	{dis_buf[3]=minl;	dis_buf[2]=minh;	}
	if(minh<6)	return;
	minh=0;		hour++;
	if(hour>12)	hour=1;
	houl=hour%10;	houh=hour/10;
	if(operate==0x03||operate==0x08)	{	dis_buf[2]=minh;	dis_buf[1]=houl;	dis_buf[0]=houh;	}
}
//********************************************************

void int_serial(void)	interrupt 4   using 1             //串行中断
{  
	if(RI==1)	
	{	dis_buf[6]=SBUF;	RI=0;	}
	else if(TI==1)	TI=0;
}
//********************************************************
		
void int_t2(void)	interrupt 5   using 1             //T2中断
{  
	P2_7=~P2_7;							//演奏
	TF2=0;
}
//********************************************************

void 	key(void)						//键盘程序
{
	unsigned	char	dd;

	P1=0xf8;							//查询是否有键按下
	dd=P1;
	if(dd==0xf8)	return;
	display();							//去抖动
	P1=0xf8;
	dd=P1;
	if(dd==0xf8)	return;

	P1=0xfb;							//查是否有功能键F1---F4按下
	dd=P1;	dd&=0xf0;
	if(dd==0xf0)	goto	keynt1;		//为数字键转
//	if(P1_3==0)		{	operate=0x00;	goto	keynt4;}		//为功能键
	if(P1_4==0)		{	operate=0x01;	goto	keynt4;}
	if(P1_5==0)		{	operate=0x02;	goto	keynt4;}
	if(P1_6==0)		{	operate=0x04;	goto	keynt4;}
	if(P1_7==0)		{	operate=0x08;	goto	keynt4;}

keynt1:
	if(key_num==0)						//若是向最高位写数据,则对整个显示缓冲区清0
		for(dd=0;dd<6;dd++)		dis_buf[dd]=0;
	P1=0xfe;							//查是否有数字1---5键按下
	dd=P1;	dd&=0xf8;
	if(dd==0xf8)	goto	keynt2;
	if(P1_3==0)
	{	dis_buf[key_num]=1;		goto	keynt3;	}
	if(P1_4==0)
	{	dis_buf[key_num]=2;		goto	keynt3;	}		
	if(P1_5==0)
	{	dis_buf[key_num]=3;		goto	keynt3;	}
	if(P1_6==0)
	{	dis_buf[key_num]=4;		goto	keynt3;	}
	if(P1_7==0)
	{	dis_buf[key_num]=5;		goto	keynt3;	}
	
keynt2:
	P1=0xfd;							//查是否有数字6---9、0键按下
	dd=P1;	dd&=0xf8;
	if(dd==0xf8)	goto	keynt4;
	if(P1_3==0)
	{	dis_buf[key_num]=6;		goto	keynt3;	}
	if(P1_4==0)
	{	dis_buf[key_num]=7;		goto	keynt3;	}		
	if(P1_5==0)
	{	dis_buf[key_num]=8;		goto	keynt3;	}
	if(P1_6==0)
	{	dis_buf[key_num]=9;		goto	keynt3;	}
	if(P1_7==0)
	{	dis_buf[key_num]=0;		goto	keynt3;	}
	goto	keynt4;

keynt3:									//按下的为数字键
	key_num++;							//调整存键盘值指针
	if(key_num==6)	key_num=0;

keynt4:
	while(1)							//等待按键释放
	{
		P1=0xf8;
		dd=P1;	dd&=0xf8;
		if(dd==0xf8)	break;
		display();
	}
}
//********************************************************

void 	display(void)			//数码管、发光二极管显示函数
{
	unsigned char 	data	i,dd,kk;

	kk=0xfe;
	for(i=0;i<6;i++)			//显示6位数码管,从最左边开始
	{							//共阴极
		dd=dis_buf[i];
		P0=led[dd];		
		flag_music=P2_7;		//保存P2.7的数值
		P2=kk;			
		P2_7=flag_music;		//恢复P2.7的数值,使其不影响发声
		kk=kk*2+1;
		if(ad_time-1==i)		//调整时间时使对应位的小数点闪烁
			if(dida%4==0)	P0_7=1;
		delay();				//调用汇编中的延时函数,延时2ms
	}

	P0=dis_buf[6];				//显示8个发光二极管	
	flag_music=P2_7;			//保存P2.7的数值
	P2=kk;		P2_7=flag_music;
	delay();

/*

	kk=0x01;
	for(i=0;i<6;i++)			//显示6位数码管,从最左边开始
	{							//共阳极
		dd=dis_buf[i];
		P0=ledd[dd];		
		flag_music=P2_7;		//保存P2.7的数值
		P2=kk+0x40;			
		P2_7=flag_music;		//恢复P2.7的数值,使其不影响发声
		kk=kk*2;
		if(ad_time-1==i)		//调整时间时使对应位的小数点闪烁
			if(dida%4==0)	P0_7=1;
		delay();				//调用汇编中的延时函数,延时2ms
	}

	P0=dis_buf[6];				//显示8个发光二极管	
	flag_music=P2_7;			//保存P2.7的数值
	P2=0x80;		P2_7=flag_music;
	delay();
*/
} 
//********************************************************

void	ad_timer(void)			//调整时间子程序
{
	switch(ad_time)
	{
		case	1:{houh++;	if(houh>1)	houh=0;	hour=houh*10+houl;	dis_buf[0]=houh;	break;}
		case	2:{houl++;	if(houl>9)	houl=0;	hour=(hour/10)*10+houl;	dis_buf[1]=houl;break;}
		case	3:{minh++;	if(minh>5)	minh=0;	dis_buf[2]=minh;	break;}
		case	4:{minl++;	if(minl>9)	minl=0;	dis_buf[3]=minl;	break;}
		case	5:{sech++;	if(sech>5)	sech=0;	dis_buf[4]=sech;	break;}
		case	6:{secl++;	if(secl>9)	secl=0;	dis_buf[5]=secl;	break;}
	}
}
//********************************************************
/*void	receive(unsigned	char	data	d)
{
	unsigned	char	data	i;

	byte_bit=0;
	TF0=0;		EX0=1;	
	SBUF=d;
	P3_2=1;
	for(i=0;i<8;i++)
	{
		while(TF0==0);
		flag_serial=P3_2;	
		if(flag_serial)		byte_bit=byte_bit+2^i;
		TF0=0;
	}
	while(TF0==0);	TR0=0;
	dis_buf[1]=byte_bit;
}*/
//********************************************************

void	init_t0_1(void)
{
	TMOD=0x12;
	IE=0x88;						//T0不做音乐定时器用

	TL0=156;
	TH0=156;

	TL1=0xb0;						//T1做时钟定时器用
	TH1=0x3c;
	TR1=1;
}
//********************************************************

void	init_t2(void)
{
	if(flag_t2==0)
	{
		T2MOD=0x00;					//T2作为定时器
		T2CON=0x00;
		ET2=1;
	}
	else
	{
		T2MOD=0x0;
		T2CON=0x34;					//T2作为发送和接收的波特率发生器,并且开T2运行
		RCAP2H=0xfe;             	//设置波特率为9600,fosc=12MHz,初值为FFD9H
		RCAP2L=0xe0;					//波特率为1200,fosc=11.0592MHz,初值为FEE0H
	}
}
//********************************************************

main()
{
	unsigned char 	data	i,dd,secd=10;
	
	init_t0_1();
	flag_t2=1;		init_t2();						//T2初始化为串行口的波特率发生器(定时器)
	SCON=0x50;										//初始化串行口,允许中断
	IT0=1;
	EA=1;		ES=1;	IT1=1;		ET0=1;
//	TI=1;

	dd=0x31;
//	printf("C=%c\n",dd);
	dd++;
//	printf("C=%c\n",dd);

	operate=0x00;

	for(i=0;i<7;i++)	dis_buf[i]=i+1;

	while(1)
	{
		display();
		key();	

		switch(operate)
		{
			case	0x00:									//执行F0功能
			{			
				if(secd!=secl)
				{
					secd=secl;
					for(i=0;i<7;i++)
					{
						dis_buf[i]++;
						if(dis_buf[i]==10)	dis_buf[i]=0;
					}
				}
				break;
			}

			case	0x01:									//执行F1功能,与计算机串行通信,将显示缓冲区的数据发送给PC机
			{
				if(secd!=secl)									//每1秒发送1个字节
				{
					secd=secl;	
					SBUF=secd;									//发送0---F
				}
				break;
			}


			case	0x02:									//执行F2功能,显示时间
			{	dis_buf[0]=houh;	dis_buf[1]=houl;	dis_buf[2]=minh;
				dis_buf[3]=minl;	dis_buf[4]=sech;	dis_buf[5]=secl;	
				operate=0xff;	
				break;		
			}

			case	0x04:									//执行F3功能,调整时间
			{	ad_time++;	
				if(ad_time==7)	ad_time=0;
				operate=0xff;
				break;
			}

			case	0x08:									//执行F4功能,播放音乐
			{	if(ad_time==0)	
				{
					flag_t2=0;		init_t2();	
					music();	
					flag_t2=1;		init_t2();	
					operate=0x00;
				}
				else
				{	ad_timer();
					operate=0xff;
				}
				break;
			}

			case	0xff:	break;

			default:	break;
			
		}
	}
}

⌨️ 快捷键说明

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