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

📄 main.c

📁 51单片机时钟 和18B20 温度的 LED显示
💻 C
字号:
//======================================================================
//	The information contained herein is the exclusive property of
//	Sunnnorth Technology Co. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//======================================================================

//======================================================================
//	工程名称:	monthdayclock.spj
//	功能描述:	万年历,农历和电子钟,具备拨报日期、时间、正点报时、秒表、闹钟等功能。
//  IDE环境:   SUNPLUS u'nSPTM  IDE 2.0.0(or later)
//	涉及的库:	CMacro1016.lib
//              sacmv26e.lib
//	组成文件:	main.c/system./Key.c/speak.c/IRQ.asm/miaobiao/asm
//	硬件连接:	
//              IOA8-15接液晶显示模块DB0-DB7
//              IOB4接液晶显示模块AO
//              IOB5接液晶显示模块的R/W
//              IOB6接液晶显示模块的EP
//	维护记录:	2006-7-31	v1.0    by zhenlei
//======================================================================

//======================================================================
//	文件名称:	main.c
//	功能描述:  系统初始化,显示时间日期界面
//              按KEY1,进入时间调整和功能选择菜单。
//              按KEY2,拨报当前的时间。
//              按KEY3,拨报当前的日期。
//              KEY2、KEY3同时按下控制闹钟的开关
//	维护记录:	2006-7-31	v1.0
//======================================================================
#include "SPCE061A.h"
#include "SPLC501User.h"
#include "model.h"
#include "Bit.h"
#define ring1 17                                        //播放第一个铃声的序号
#define ring2 18                                        //播放第二个铃声的序号
//======================================================================
//对主函数调用的函数声明
//======================================================================
extern void display();
extern void PlayRespond(unsigned int Result);
extern void speaktime();
extern void keyscan();
extern void nextdisplay(); 
extern void nextdisplay2();
extern void setday();
extern void set_ring();
extern void setsecond();
extern void uart_operate(unsigned int uart_data );
extern void ClearDisplay();
extern void DS1820();

//extern void set_ring();
//extern void setsecond();  
extern void speaktime();
extern void speakday();
extern void keyinitial();
extern void F_Disp_Drv();
extern void F_DispIO_Initial();
//=======================================================================

//=======================================================================
//定义文件中用到的变量以及常数数组
//=======================================================================
unsigned int keyflag1=0;                                         //键按下标志1,控制进入功能选择菜单
unsigned int keyflag2=0;                                         //键按下标志2,
unsigned int keyflag3=0;                                         //键按下标志3,控制进入时间日期调整界面
unsigned int keyflag4=0;                                         //键按下标志4,控制进入闹钟时间设置界面
unsigned int keyflag5=0;                                         //键按下标志5,控制进入秒表设置界面
unsigned int keyflag6=0;                                         //键按下标志6,控制进入闹钟设置界面
unsigned int keyflag7=0;                                         //键按下标志7,控制进入闹钟铃声选择界面
unsigned int ringflag=0;                                         //播放铃声标志位1播放第一首2播放第二首
unsigned int keyvalue=0;                                         //存放按下的键值
unsigned int keytime=0;											 //存放按下的时间
unsigned int keytimeEnb=0;										 //允许按键计时标志
unsigned int keyTtemp=0;
unsigned int runflag=0;                                          //当年闰月标志位
unsigned int num=0;                                              //2HZ计数单元
unsigned int hour=6;                                             //存放当前的小时
unsigned int min=30;                                              //存放当前的分钟
unsigned int sec=0;                                              //存放当前的秒
unsigned int year=2006;                                          //存放当前的年
unsigned int gmonth=8;                                           //存放当前的公历的月
unsigned int gday=1;                                             //存放当前的公历的日
unsigned int xqvalue=0;                                          //存放当前的星期
unsigned int nmonth=7;                                           //存放农历的月
unsigned int nday=8;                                             //存放农历的日
unsigned int runxq[]={3,6,0,3,5,1,3,6,2,4,0,2};                  //润年星期偏差表
unsigned int pingxq[]={4,0,0,3,5,1,3,6,2,4,0,2};                 //平年星期偏差表
unsigned int mouse[]={1,17,32,48};                               //箭头坐标数组
unsigned int nhour=12;                                           //存放闹钟的小时
unsigned int nmin=0;                                             //存放闹钟的分钟
unsigned int mbmin=0;                                            //存放秒表的分
unsigned int mbsec=0;                                            //存放秒表的秒
unsigned int mmsec=0;                                            //存放秒表的毫秒
unsigned int mbnum=0;                                            //1KHZ中断标志位
unsigned int onoff=0;                                            //闹钟开关标志
unsigned int int2hz;                                             //设置一个2HZ中断标志
unsigned int DispEnb=0;  
unsigned int Flash;
unsigned int ringonoff;                                          //闹钟响时关闭标志     
char number[]={'0','1','2','3','4','5','6','7','8','9'};         //设置待显示的数字。 	              
unsigned int clockset[]={11,31,51};                              //设置闹钟铃声时的光标 
unsigned int counter=0;                                          //设置显示SUNPLUS计数器
unsigned int mapcounter1=0;
unsigned int mapcounter2=0;         

extern unsigned int LED[10];//数码管的段选码
unsigned int Time[6],mTime[6],Date[6],nDate[6];

const int glunarmonthday[]=                                      //存放2001-2100的阴历月天数表b15-b14表征1-12月的天数特征
{                                                                //为1则当月为30天,为0则为29天。低四位为当年闰月的月份 
	0xd954,0xd4a0,0xda50,0x7552,0x56a0,0xabb7,0x25d0,0x92d0,0xcab5,0xa950,
	0xb4a0,0xbaa4,0xad50,0x55d9,0x4ba0,0xa5b0,0x5176,0x52bf,0xa930,0x7954,
	0x6aa0,0xad50,0x5b52,0x4b60,0xa6e6,0xa4e0,0xd260,0xea65,0xd530,0x5aa0,
	0x76a3,0x96d0,0x4afb,0x4ad0,0xa4d0,0xd0b6,0xd25f,0xd520,0xdd45,0xb5a0,  
	0x56d0,0x55b2,0x49b0,0xa577,0xa4b0,0xaa50,0xb255,0x6d2f,0xada0,0x4b63,
	0x937f,0x49f8,0x4970,0x64b0,0x68a6,0xea5f,0x6b20,0xa6c4,0xaaef,0x92e0,
	0xd2e3,0xc960,0xd557,0xd4a0,0xda50,0x5dd5,0x56a0,0xa6d0,0x55d4,0x52d0,
	0xa9b8,0xa950,0xb4a0,0xb6a6,0xad50,0x55a0,0xaba4,0xa5b0,0x52b0,0xb273,
	0x6930,0x7337,0x6aa0,0xad50,0x4b55,0x4b6f,0xa570,0x54e4,0xd260,0xe968,
	0xd520,0xdaa0,0x6aa6,0x56df,0x4ae0,0xa9d4,0xa4d0,0xd150,0xf252,0xd520
};
//=================================================================================
//	语法格式:	int main(void)
//	实现功能:  键盘控制语音拨报日期时间及功能选择
//	参数:		无
//	返回值:	无
//================================================================================
int main(void)
{   
	unsigned int j=0;
	keyinitial();                                                   //键盘初始化
//---------------------------------------------------
	*P_IOB_Dir=0xffff;
	*P_IOB_Attrib=0xffff;
	*P_IOB_Data=0x0000;
	*P_SystemClock=0x0080;
//------------------------------------------------------
	*P_INT_Ctrl_New = *P_INT_Ctrl_New | 0x0004;                     //置2HZ中断标志
   	__asm("INT IRQ");                                               //开放2HZ中断
    while(1)
	{  
		unsigned int i=0;  											//定义一个循环变量,用来对数组寻址.
	    if(DispEnb)
	    {
 	 	 	if(j==0) display();										//j=0显示年、月、日
 	 	 	else if(j==1) nextdisplay();							//j=1显示十、分、秒
 	 	  	else if(j==2) nextdisplay2();
 	 	  	else DS1820();
	    	DispEnb=0;												//显示过后,将显示允许位清零
	    }
	    *P_Watchdog_Clear=0x0001;
	   	 while(hour==nhour && min==nmin && onoff==0)                 //当闹钟开时,判断闹钟时间是否到了 
	   	{   
	   		keyscan();                                              //当闹钟响时如果有任何键按下,则关闭闹钟。
	   		if(keyvalue!=0)
	   			onoff=1;   		
	    	else if(ringflag==0)
	     		PlayRespond(ring1);                                 //播放乐曲1         
	     	else 
	     		PlayRespond(ring2);                                 //播放乐曲2	   	
	    }
	   	if(min==0 && sec==0)                                        //正点报时功能
	   	{
	   		speaktime();
	   	}
 	   	keyscan();                                                  //键盘扫描
 	  	*P_Watchdog_Clear=0x0001;	
 	  	if(keyvalue==0x0001&&keytime>=4)                            //如果KEY1键按下(长按)
 	  	{	
 	 		keyflag1=1;                                             //置位键按下标志
//-----------------------------------------------
			ClearDisplay();
//-----------------------------------------------
            while(keyflag1==1)
 	 		{
				if(DispEnb)	
 	    		{
 	    			uart_operate(0x00);								  //显示当前功能
 	    			uart_operate(0x00);
 	    			uart_operate(0x00);	
 	    			uart_operate(0x00);	
 	    			uart_operate(0x00);	
 	    			uart_operate(0x00);	
 	    			uart_operate(0x00);	
 	    			uart_operate(LED[i+1]);
 	    			DispEnb=0;
 	    		}
 	    				
        		keyscan();       
      			*P_Watchdog_Clear=0x0001;	
      			switch(keyvalue)	
      			{    
      				case 0x0001:                                    //如果是KEY1按下则进入相应的调整
      		        { 
      			       	switch(i)                                   //判断此时的鼠标指向
      			       	{
      			       		case 0:  
      			       	 	{
      			       	 		setday();
      			           	}
      			           	break;                                  //指向的时间日期调整
      			      		case 1: 
      			       	 	{
      			       			set_ring();                         //设置闹钟的铃声和时间
      			       	 	}
      			       	 	break;
      			       		case 2:  
      			            {
      			     	      	setsecond();                        //设置秒表
      			            }
      			            break;     
      			   	    	case 3:                                 //指向的返回,则执行返回程序 
      			         	{
      			               	keyflag1=0;
      			         	}
      			         	break;
      			        }
					}  
      		        break;
      	    		case 0x0002:                                    //  如果是KEY2则箭头下翻//
      	            {
      	                if(i==3)
      	                	i=0;
      	                else
      	                	i=++i; 
					}
      	            break;                                        
      	    		case 0x0004:                                    //如果是KEY3则箭头上翻
      	            {
      	            	if(i==0)
      	                	i=3;
      	                else
      	                	i=--i;                                  //修改箭头的坐标
      	            }
      	            break;                                                 	  
				}
			}
		}		
 	 	else if (keyvalue==0x0001&&keytime<4)						//key1短按
 	 {
 	 	  	j++;
 	 	  	if(j==4) j=0;											//循环显示
 	 	  	else if(j==0) display();								//j=0显示年、月、日
 	 	  	else if(j==1) nextdisplay();							//j=1显示十、分、秒
 	 	  	else if(j==2) nextdisplay2();									//j=2显示农历月、日、星期
 	 	  	else DS1820();									
 	 	}
 	 	else if(keyvalue==0x0002)                                   //如果KEY2按下报时间
 	 	{
 	    	speaktime();                                            //调用时间拨报函数
 	 	}
 	 	else if(keyvalue==0x0004)                                   // 如果KEY3按下报日期
 	 	{
 	        speakday() ;                                            //调用日期拨报函数
 	 	}
 	 	else if(keyvalue==0x0006)                                   //如果KEKY2\KEY3同时按下则切换闹钟
 	 	{
 	 		switch(onoff)                                           //的开关
 	 	    {
 	 	    	case 0:
 	 	    		onoff=1;
 	 	    		break;                                          //切换闹钟的开关
 	 			case 1:
 	 				onoff=0;
 	 				break;
			}
		}
	  	else
 	 		*P_Watchdog_Clear=0x0001;		 	                      //清看门狗
	}
}
//====================================================================================
//main.c end
//====================================================================================

⌨️ 快捷键说明

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