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

📄 1302.c

📁 1302实现时钟定时报警
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************************
Create By: he jia xing
Date:2007/12/1
*********************************************************************************************
Modified By:
Date:
*********************************************************************************************
说明:按K3键进行日期,时间设置
 	  按下K2使能或取消闹铃功能,闹铃响时按下K2可以消除铃声
	  按下K1和K2查看闹铃时间
	  按下K1和K4设置闹铃时间
**********************************************************************************************
Email: hejiaxing13@yahoo.com.cn
QQ:752957222
**********************************************************************************************/

#include<reg51.h>
#include<intrins.h>
sbit LCD_RS = P1^0;             
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
sbit RESET  = P2^3;
sbit CLK  	= P2^1;               
sbit DATA   = P2^2;			
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar inter,flag,flag1,inter1,alarm_flag;
uchar alarm_time[6]={0x30,0x37,0x33,0x30,0x30,0x30};
//					 十时  时  十分 分  十秒 秒	
uchar code str[] = "  /  /    Week: ";
uchar code str1[] ="Time:           ";     
uchar code str2[] =" Set Alarmtime: ";   
uchar code str3[] ="      -  -      "; 
uchar code str4[] =" Alarmtime Is:  ";
uchar code str5[] ="Time Is coming !";              
sbit K1 = P1^3;
sbit K2 = P1^4;
sbit K3 = P1^5;
sbit K4 = P1^6;
sbit  BEEP = P1^7;

uchar code  init[8] = {0x12,0x10,0x17,0x01,0x12,0x6,0x07};
//						秒   分   时   日   月   周    年	

uchar init1[7] = {0x12,0x10,0x02,0x03,0x01,0x09,0x08};//该数组用于存放读取的时间值
//					秒  分   时   日   月   周    年	

uchar init2[16] = {0x12,0x10,0x02,0x03,0x01,0x09,0x08,0x07,0x12,0x10,0x02,0x03,0x01,0x09,0x08,0x07};
//					十秒  秒 十分  分  十时  时  十日  日  十月  月   无  星期  十年 年 
//					0    1    2     3   4    5    6    7    8    9    10  11    12   13
//用于存放转换后的时间值
uchar time[2] = {0x00,0x00};
uchar ok,week;
uchar code  tab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
//存放设置过程中的值

unsigned char n=0;  //n为节拍常数变量 
unsigned char code music_code[] ={
0x7F, 0x16, 0x72 , 0x16, //格式为: 频率常数, 节拍常数, //两只老虎
0x65, 0x16, 0x80 , 0x16,
0x7F, 0x16, 0x72 , 0x16,
0x65, 0x16, 0x80 , 0x16,

0x65, 0x16, 0x60 , 0x16,
0x55, 0x32, 0x65 , 0x16,
0x60, 0x16, 0x55 , 0x32,

0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,

0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,

0x72, 0x16, 0xAB , 0x16,
0x80, 0x32, 0x72 , 0x16,
0xAB, 0x16, 0x80 , 0x32,
0x7F, 0x16, 0x72 , 0x16, //格式为: 频率常数, 节拍常数, //两只老虎
0x65, 0x16, 0x80 , 0x16,
0x7F, 0x16, 0x72 , 0x16,
0x65, 0x16, 0x80 , 0x16,

0x65, 0x16, 0x60 , 0x16,
0x55, 0x32, 0x65 , 0x16,
0x60, 0x16, 0x55 , 0x32,

0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,

0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,

0x72, 0x16, 0xAB , 0x16,
0x80, 0x32, 0x72 , 0x16,
0xAB, 0x16, 0x80 , 0x32,
0x7F, 0x16, 0x72 , 0x16, //格式为: 频率常数, 节拍常数, //两只老虎
0x65, 0x16, 0x80 , 0x16,
0x7F, 0x16, 0x72 , 0x16,
0x65, 0x16, 0x80 , 0x16,

0x65, 0x16, 0x60 , 0x16,
0x55, 0x32, 0x65 , 0x16,
0x60, 0x16, 0x55 , 0x32,

0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,

0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,

0x72, 0x16, 0xAB , 0x16,
0x80, 0x32, 0x72 , 0x16,
0xAB, 0x16, 0x80 , 0x32,
0x00
};

void key_set(uchar row,uchar col,uchar max);
void set_flash(uchar row,uchar col);
void key_set_xq(uchar row,uchar col);
void set_alarm_time();
void flash(uchar row,uchar col);
void see_alarm_time(void);
void time_campare();

/************************************************************************************
函数描述:延时
入口参数:	ms:延时毫秒数
出口参数:无
*************************************************************************************/
void delay1(int ms)
{
 unsigned char y;
  while(ms--)
 {
  for(y = 0; y<250; y++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

/*****************************************************************
函数描述:检查LCD忙状态                                                  
入口参数:无
出口参数:无
说明:向lcd写入指令或代码要进行忙状态检测
*****************************************************************/ 

bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
 }

/********************************************************
函数描述:写指令数据到LCD  
入口参数:cmd:指令代码
出口参数:无                                     
*********************************************************/

void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}

/********************************************************
函数描述:写显示数据到LCD                                                            
入口参数:dat:要写入的数据
出口参数: 无                                                       
*********************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}

/******************************************************
函数描述:LCD初始化设定                                      
入口参数:无
出口参数:无
说明:lcd显示前,调用该函数                                                      
*********************************************************/

void init_lcd()
{ 
    delay1(15);   
    lcd_wcmd(0x01);      //清除LCD的显示内容
            
    lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);

	lcd_wcmd(0x0c);      //显示开,关光标
    delay1(5);
    lcd_wcmd(0x06);      //移动光标
    delay1(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay1(5);
}
/*********************************************************/
/*                                                       */
/*  设定显示位置                                         */
/*                                                       */
/*********************************************************/
void write_position(uchar row,uchar col)
 {
   uchar place;
   if(row==1)
   {
     place=0x80+col-1;
     lcd_wcmd(place);
   }
   else
   {
     place=0xc0+col-1;
     lcd_wcmd(place);
   }
 }
/*******************************************************
函数描述:写自定义字符到指定位置
入口参数:tab:字符代码起始地址(8个代码一个字符)
	  num: 自定义字符代号,(范围1~8,1号存放在40h,2号存放在48h....
********************************************************/
void  writetab(uchar num,uchar *tab)  
{  
    	unsigned char i;
    	lcd_wcmd(64+(num-1)*8);            //写CGRAM
    	for (i = 0; i< 8; i++)   
    	lcd_wdat(*tab++);        
}
/*********************************************************************
函数描述:显示自定义字符
入口参数:row:显示位置(行)
	  col:显示位置(列)	
	  num:自定义字符代码,范围1~8
出口参数:无
***********************************************************************/
void xianshitab(uchar row,uchar col,uchar num)
{	write_position(row,col);
	lcd_wdat(num-1);	
}	

/*********************************************************
函数描述:写入指定n个字符到指定位置(位置向增加方向变化)             
入口参数:num:指定字符数目
	  row:行(范围1~2)  
	  col:列(范围1~16)
	  str:显示字符的起始地址	
出口参数:无	                                                     
********************************************************/
void write_str1(uchar row,uchar col,uchar *str,uchar num)
{
	uchar i=0; 
	lcd_wcmd(0x06);      //移动右移光标
    	delay1(5);
   	write_position(row,col);
   	for(i=0;i<num;i++)
   	{	lcd_wdat(*str++);
   	}
}
/*****************************************************************
函数描述:指定位置显示指定字符
入口参数:dat:显示的字符
	  row:行(范围1~2)  
	  col:列(范围1~16)
出口参数:无
*******************************************************************/
void  write_str3(uchar row,uchar col,uchar dat)	
{	write_position(row,col);
	lcd_wdat(dat);
}

void int1(void)  interrupt 3   //采用中断0 控制节拍//10ms
{  	TH1=0xd8;
   	TL1=0xef;
   	n--;
}

void delay2 (unsigned char m)   //控制频率延时,基本延时为1ms
{
 	unsigned 	i=m;
 	while(--i);
}

void delayms(unsigned char a)  //毫秒延时子程序
{
 	while(--a);      //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}
/*************************************************************************************************
函数描述:播放音乐两只老虎
入口参数:无
出口参数:无
调用模块: time_campare()
***************************************************************************************************/
void playmusic()
{ 	unsigned char p,m;   //m为频率常数变量
  	unsigned char i=0;
  
	TR1 = 1;
   	while(1)
    {	if(!K2)
			break;
a: 		p=music_code[i];
       	if(p==0x00)
      	{ 	i=0;
     		delayms(1000);
      		break;
   		}     //如果碰到结束符,延时1秒,回到开始再来一遍
       else if(p==0xff) 
     	{ 	i=i+1;
    		delayms(100);
    		TR1=0;
    		goto a;
  		}  //若碰到休止符,延时100ms,继续取下一音符
       else        
     	{
        	m=music_code[i++];
     		n=music_code[i++];
   		}  //取频率常数 和 节拍常数
        TR1=1;                                             //开定时器1
        while(n!=0)
     	{
    		BEEP=!BEEP;
    		delay2(m);
   		}                         //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
       	TR1=0;                                             //关定时器1
    }            //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
   	TR1=0; 
       //关定时器1
	BEEP = 1;
		    
}

/**************************************************************************
函数描述:向ds1302写一字节数据
入口参数:dat:所写的数据
出口参数:无
***************************************************************************/
void write_dat(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		CLK = 0;		//写的时候低电平改变数据
		if((dat&0x01)==0x01)
			DATA = 1;
		else 
			DATA = 0;	 //写的时候高电平,把数据写入ds1302
		CLK = 1;
		_nop_();
		dat=dat>>1;
	}
}
/*********************************************************************************
函数描述:从ds1302读一字节数据
入口参数:无
出口参数:dat:读到的数据
***************************************************************************/
uchar read_dat()

⌨️ 快捷键说明

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