51单片机 Proteus仿真 时钟 串口 发送时钟 整点报时

在这里插入图片描述

#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


/*
 * 大概就是,做一个电子时钟,然后加四个独立按键,
 * K1按一次设置闹钟的秒,两次设置闹钟的分,三次设置闹钟的时,
 * 然后四次修改时间的秒,五次修改时间的分,六次改时间的时这样
 *
 * K2是加一,K3是减一
 *
 * K4是关闹钟
 
 
 
定时器实现时钟送PC机显示独立键盘设置时间

要求;
筒易时钟。并送PC机上湿示,当前时间可以通过独立键盘来没置;整点提醒、定时闹钟


需要keil c语言程序(注释),proteus仿真图


 *
 */

#define uchar	unsigned char
#define uint	unsigned int
#define u8	unsigned char
#define u16	unsigned int

char	rtc_hour	= 23;
char	rtc_min		= 59;
char	rtc_sec		= 55;

char	rtc_hour_al	= 1;            /* 闹钟 */
char	rtc_min_al	= 0;
char	rtc_sec_al	= 1;

unsigned char num2 = 0;                 /* 计数 */

u8 ItemsNum = 0;                        /*按键改变项目 */


char *ALLtime[] = { &rtc_hour, &rtc_min, &rtc_sec, &rtc_hour_al, &rtc_min_al,
		    &rtc_sec_al };      /* 指针便于调用 */


u8 openAlarm = 1;                       /* 打开或者关闭闹钟 */

u8 alarmifg = 0;

u8 alarm_shijian = 0;


sbit	key_01	= P2 ^ 1;
sbit	key_02	= P2 ^ 2;
sbit	key_03	= P2 ^ 3;
sbit	key_04	= P2 ^ 4;
sbit	key_05	= P2 ^ 5;

sbit BEEP = P3 ^ 6;


/*********************************************************************************
 * 【函 数 名】: void send_cmd(unsigned char dat)
 * 【功    能】: 串口发送数据命令
 **********************************************************************************/
void send( unsigned char dat )
{
	SBUF = dat;     /* 发送指令到SBUF */
	while ( !TI )
		;       /* 等待发送结束 */
	TI = 0;         /* 清除结束标志,以便再发送数据 */
}


/*********************************************************************************
 * 【函 数 名】: Print_Str(unsigned char *s)
 * 【功    能】: 串口发送 一个字符串
 **********************************************************************************/
void Print_Str( unsigned char *s )
{
	while ( *s != '\0' )
	{
		send( *s++ );
	}
}

#define FSOC 11059200L    //晶振
#define BAUD  9600        //波特率
/*********************************************************************************
 * 【函 数 名】: void SerInit(void)
 * 【功    能】: 串口初始化程序 设置波特率为9600
 **********************************************************************************/
void SerInit( void )
{
	SCON = 0x50;	/* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */
	TMOD = 0x20;	/* T1工作于方式2 */
	TCON = 0x40;	/* 定时器1开始计数 */
	TH1 = -(FSOC/BAUD/12/16);		/* T1计数初值 */
	TL1 = -(FSOC/BAUD/12/16);
	PCON = 0x80;	/* SMOD置1,双倍速率 */
	RI = 0;
	TI = 0;
	
	ES	= 0;    /* 关闭串口中断 */
}


/* 闹钟函数 */
void BeepAlarm()
{
	unsigned char	beeptime	= 0;
	int		cycl		= 1000;
	while ( cycl-- )
	{
		BEEP = !BEEP;
		for ( beeptime = 0; beeptime < 5; beeptime++ )
			;
	}
	BEEP = 1;
}


/* 延时函数 */
void delay_ms_key( unsigned char t ) /* 延时xms */
{
	unsigned char ttt;
	while ( t-- )
	{
		for ( ttt = 0; ttt < 125; ttt++ )
			;
	}
}


/*
 * 四个按键的检测函数
 * 按键则返回1 2 3 4
 * 无按键则返回0xff
 */
unsigned char KeySscan( void )
{
	unsigned char keyvaluee = 0xff;
	if ( key_01 == 0 )
	{
		delay_ms_key( 10 );
		if ( key_01 == 0 )
		{
			while ( key_01 == 0 )
				;
			return(1);
		}
	}

	if ( key_02 == 0 )
	{
		delay_ms_key( 10 );
		if ( key_02 == 0 )
		{
			while ( key_02 == 0 )
				;
			return(2);
		}
	}

	if ( key_03 == 0 )
	{
		delay_ms_key( 10 );
		if ( key_03 == 0 )
		{
			while ( key_03 == 0 )
				;
			return(3);
		}
	}

	if ( key_04 == 0 )
	{
		delay_ms_key( 10 );
		if ( key_04 == 0 )
		{
			while ( key_04 == 0 )
				;
			return(4);
		}
	}
	if ( key_05 == 0 )
	{
		delay_ms_key( 10 );
		if ( key_05 == 0 )
		{
			while ( key_05 == 0 )
				;
			return(5);
		}
	}
	return(0xff);
}


/* 显示时间 */
void displaytime()
{
	u8	disp[15];
	u8	count = 0;
	disp[count++]	= rtc_hour / 10 + '0';
	disp[count++]	= rtc_hour % 10 + '0';
	disp[count++]	= ':';

	disp[count++]	= rtc_min / 10 + '0';
	disp[count++]	= rtc_min % 10 + '0';
	disp[count++]	= ':';

	disp[count++]	= rtc_sec / 10 + '0';
	disp[count++]	= rtc_sec % 10 + '0';

	disp[count++] = 0;

	Print_Str( disp );
	Print_Str("\r\n");//发送换行符号 便于看
}


/* 显示闹钟 */
void displayAlarm()
{
	u8	disp[15];
	u8	count = 0;

	disp[count++]	= rtc_hour_al / 10 + '0';
	disp[count++]	= rtc_hour_al % 10 + '0';
	disp[count++]	= ':';

	disp[count++]	= rtc_min_al / 10 + '0';
	disp[count++]	= rtc_min_al % 10 + '0';
	disp[count++]	= ':';

	disp[count++]	= rtc_sec_al / 10 + '0';
	disp[count++]	= rtc_sec_al % 10 + '0';

	disp[count++] = 0;

	Print_Str( disp );
	Print_Str("\r\n");//发送换行符号 便于看
}


/*********************************************************************************
 *
 *        定时器中断
 **********************************************************************************/
void T1_time()
interrupt 1
{
	TH0	= (65536 - 50000) / 256;
	TL0	= (65536 - 50000) % 256;

	num2++;
	if ( num2 == 20 )
	{
		displaytime(); /* 发送时间显示 */


		num2 = 0;
		rtc_sec++;


		/* 闹钟响声判定 */
		if ( openAlarm == 1 )                           /* 打开了闹钟 */
		{
			if ( *ALLtime[0] == *ALLtime[3] )       /* 判定时间一样不一样 */
			{
				if ( *ALLtime[1] == *ALLtime[4] )
				{
					if ( *ALLtime[2] == *ALLtime[5] )
					{
						alarmifg = 1;
					}
				}
			}
		}

		if ( alarmifg == 1 ) /* 闹钟开始响了 */
		{
			alarm_shijian++;
		}

		if ( rtc_sec == 60 )
		{
			rtc_sec = 0;
			rtc_min++;

			if ( rtc_min == 60 )
			{
				rtc_min = 0;
				
				//整点报时
				//alarmifg = 1;//打开蜂鸣器
				Print_Str("zheng dian bao shi ");
				Print_Str("\r\n");//发送换行符号 便于看
				
				
				rtc_hour++;
				if ( rtc_hour == 24 )
				{
					rtc_hour = 0;
				}
			}
		}
	}
}


void delay_ms( unsigned int t ) /* 延时xms */
{
	unsigned char ttt;
	while ( t-- )
	{
		for ( ttt = 0; ttt < 125; ttt++ )
			;
	}
}


/*********************************************************************************
 *
 *       主函数
 **********************************************************************************/
void main( void )
{
	u8 key = 0xff;

	SerInit();

	TMOD	|= 0x01;
	TH0	= (65536 - 50000) / 256;
	TL0	= (65536 - 50000) % 256;
	EA	= 1;
	ET0	= 1;
	TR0	= 1;

	/* LCD_write_com(0x0c); //关光标,闪烁 */
	while ( 1 )
	{
		key = KeySscan();
		if ( key != 0xff )
		{
			if ( key == 1 )
			{
				ItemsNum = (ItemsNum + 1) % 7;
				if(ItemsNum==0)
				{
					Print_Str("Settings have been saved and exited\r\n");
				}else if(ItemsNum==1)
				{
					Print_Str("Set Clock hours\r\n");
				}else if(ItemsNum==2)
				{
					Print_Str("Set Clock minutes, \r\n");
				}else if(ItemsNum==3)
				{
					Print_Str("Set Clock seconds\r\n");
				}else if(ItemsNum==4)
				{
					Print_Str("Set Alarm clock hours \r\n");
				}else if(ItemsNum==5)
				{
					Print_Str("Set Alarm clock minutes, \r\n");
				}else if(ItemsNum==6)
				{
					Print_Str("Set Alarm clock seconds\r\n");
				}
			} else if ( key == 2 )          /* 加法 */
			{
				*ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] + 1;
			} else if ( key == 3 )          /* 减法 */
			{
				*ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] - 1;
			} else if ( key == 4 )          /* 关闭或者打开闹钟 */
			{
				openAlarm = !openAlarm;
				if ( openAlarm == 0 )   /* 恢复闹钟功能 */
				{
					alarmifg	= 0;
					alarm_shijian	= 0;
				}
			} else if ( key == 5 )          /* 保存并退出设置 */
			{
				ItemsNum=0;
				Print_Str("Settings have been saved and exited\r\n");
			}

			/* 增加时间界限 */
			if ( *ALLtime[0] == 24 )
			{
				*ALLtime[0] = 0;
			} else if ( *ALLtime[1] == 60 )
			{
				*ALLtime[1] = 0;
			} else if ( *ALLtime[2] == 60 )
			{
				*ALLtime[2] = 0;
			}
			if ( *ALLtime[0] == -1 )
			{
				*ALLtime[0] = 23;
			} else if ( *ALLtime[1] == -1 )
			{
				*ALLtime[1] = 59;
			} else if ( *ALLtime[2] == -1 )
			{
				*ALLtime[2] = 59;
			}
			/* 增加闹钟界限 */
			if ( *ALLtime[3] == 24 )
			{
				*ALLtime[3] = 0;
			} else if ( *ALLtime[4] == 60 )
			{
				*ALLtime[4] = 0;
			} else if ( *ALLtime[5] == 60 )
			{
				*ALLtime[5] = 0;
			}
			if ( *ALLtime[3] == -1 )
			{
				*ALLtime[3] = 23;
			} else if ( *ALLtime[4] == -1 )
			{
				*ALLtime[4] = 59;
			} else if ( *ALLtime[5] == -1 )
			{
				*ALLtime[5] = 59;
			}
			/* 无论按哪一个按键 我们都要刷新显示 */
			if ( ItemsNum <= 3 )
			{
				displaytime();
			} else {
				displayAlarm();
			}

			/* 控制游标 */
			if ( ItemsNum == 0 )
			{
				TR0 = 1;        /* 开启时钟 */
			} else {
				TR0 = 0;        /* 关闭时钟 */
			}

			key = 0xff;
		}

		/* 闹钟 */
		if ( alarmifg == 1 )
		{
			BeepAlarm();                    /* 闹钟想 */
			if ( alarm_shijian > 5 )        /* 响一会后关闭闹钟 alarm_shijian在定时器中自加 */
			{
				alarmifg	= 0;
				alarm_shijian	= 0;
			}
		}
	}
}



猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/107324842