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

📄 calendar.c

📁 电子万年历作为电子类小设计不仅是市场上的宠儿
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <REG52.H>
#include <intrins.h>
//#include "SoundPlay.h"
#define uchar unsigned char
#define uint unsigned int

sbit CS =   P1^0;	//片选 高电平有效 单片LCD使用时可固定高电平
sbit SID =  P1^1;	//数据
sbit SCLK=  P1^2;	//时钟
sbit KEY_1=P2^0;
sbit KEY_2=P2^1;
sbit KEY_3=P2^2;
sbit KEY_4=P2^3;
sbit bz=P3^5;


void write(bit start, uchar ddata);
void sendbyte(uchar bbyte);
void delay1ms(uint di);
void lcdinit(void);
void lcdtest(void);
void lcdcls(void);




void write(bit start, uchar ddata) //写指令或数据
{
  uchar start_data,Hdata,Ldata;
  if(start==0) start_data=0xf8;	 //写指令
    else       start_data=0xfa;  //写数据

  Hdata=ddata&0xf0;		  //取高四位
  Ldata=(ddata<<4)&0xf0;  //取低四位
  sendbyte(start_data);	  //发送起始信号
  delay1ms(5); //延时是必须的
  sendbyte(Hdata);	      //发送高四位
  delay1ms(1);  //延时是必须的
  sendbyte(Ldata);		  //发送低四位
  delay1ms(1);  //延时是必须的
}

void sendbyte(uchar bbyte) //发送一个字节
{
 uchar i;
 for(i=0;i<8;i++)
   {
   SID=bbyte&0x80; //取出最高位
   SCLK=1;
   SCLK=0;
   bbyte<<=1; //左移
   }
}



void delay1ms(uint k) //延时
{
 uint m,n;
 for(m=0;m<k;m++)
   for(n=0;n<10;n++);
}

/*****************************************************************************/
//清屏函数
void lcm_clr(void)
{
write(0,0x01);
delay1ms(40); //启动等待,等LCM进入工作状态
}
/*****************************************************************************/


void set_function(uchar c)//功能设定基本功能0X30H,绘图功能开0x36h 绘图关0X34H
{
        c=c+0x30;
       write(0,c);
}


void addr_zero(void)/*地址归零*/
{
        write(0,0x02);
}


void dis_on_off(uchar c)/*显示状态*/
{
	c=c+0x08;
        write(0,c);
}


void lcdinit(void)
{
  write(0,0x01); //清除显示
  write(0,0x30); //功能设置   基本功能
  write(0,0x02); //地址归零
  write(0,0x04); // 鼠标移动和 显示内容同步
  write(0,0x0c); //  游标或显示控制
  write(0,0x01);
  write(0,0x80); //显示首地址
}


//设定字符和汉字坐标。水平方向x:0~7,垂直方向y:0~3
void set_pos(uchar x,uchar y)/*设定行列*/
{write(0,(y%2)*0x10+(y/2)*0x08+x+0x80);}




// 向LCM发送一个字符串,长度64字符之内
void lcm_w_word(uchar *str)
{
   while(*str!='\0')
   {
      write(1,*str++);
    }
       *str=0;
}


//显示作品信息
void disp_message(void)
{
  write(0,0x80);write(1,4);write(1,4);write(1,4);write(1,4);
  write(0,0x86);write(1,4);write(1,4);write(1,4);write(1,4);
  write(0,0x80);lcm_w_word("****欢迎使用****") ;
  write(0,0x90);lcm_w_word("--多功能万年历--");
  write(0,0x88);lcm_w_word("作者:xxx    ");
  write(0,0x98);lcm_w_word("指导老师:刘炽辉") ;
}



/****************************************************************************/
    // DS1302  驱动

/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P1 ^ 3;//ds1302_clk(时钟线)
sbit clock_dat = P1 ^ 4;//ds1302_dat(数据线)
sbit clock_Rst = P2 ^ 7;//ds1302_Rst(复位线?//为了编程方便定义的位变量
sbit a0   = ACC ^ 0;
sbit a1   = ACC ^ 1;
sbit a2   = ACC ^ 2;
sbit a3   = ACC ^ 3;
sbit a4   = ACC ^ 4;
sbit a5   = ACC ^ 5;
sbit a6   = ACC ^ 6;
sbit a7   = ACC ^ 7;

/****************************************************************************/
//定义全局变量
uchar yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位


//1302驱动程序
/*void clock_out(unsigned char dd)
{
 unsigned char i;
	ACC=dd;
	for(i=8;i>0;i--)
	{
	 clock_dat=a0;
	 clock_clk=1;
     clock_clk=0;
	 ACC=ACC>>1;
	 }
}*/

/******************************************************************************/
/*unsigned char clock_in(void)
{
	 unsigned char i;
	for(i=8;i>0;i--)
	{
	 ACC=ACC>>1;
	 a7=clock_dat;
     clock_clk=1;
     clock_clk=0;
	 }
	return(ACC);
}*/





//1302驱动程序(底层协议)
void clock_out(uchar dd){
	ACC=dd;
	clock_dat=a0; clock_clk=1; clock_clk=0;
	clock_dat=a1; clock_clk=1; clock_clk=0;
	clock_dat=a2; clock_clk=1; clock_clk=0;
	clock_dat=a3; clock_clk=1; clock_clk=0;
	clock_dat=a4; clock_clk=1; clock_clk=0;
	clock_dat=a5; clock_clk=1; clock_clk=0;
	clock_dat=a6; clock_clk=1; clock_clk=0;
	clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
uchar clock_in(void){
	clock_dat=1;
	a0=clock_dat;
	clock_clk=1; clock_clk=0; a1=clock_dat;
	clock_clk=1; clock_clk=0; a2=clock_dat;
	clock_clk=1; clock_clk=0; a3=clock_dat;
	clock_clk=1; clock_clk=0; a4=clock_dat;
	clock_clk=1; clock_clk=0; a5=clock_dat;
	clock_clk=1; clock_clk=0; a6=clock_dat;
	clock_clk=1; clock_clk=0; a7=clock_dat;
	return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
uchar read_clock(uchar ord){
	uchar dd=0;
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	dd=clock_in();
	clock_Rst=0;
	clock_clk=1;
	return(dd);
}
/*****************************************************************************/
/*****************************************************************************/
//常用时钟数据读取
void read_clockS(void){
	ss = read_clock(0x81);//读取秒数据
	mm = read_clock(0x83);//读取分钟数据
	hh = read_clock(0x85);//小时
	dd = read_clock(0x87);//日
	mo = read_clock(0x89);//月
	xq = read_clock(0x8b);//星期
	yy = read_clock(0x8d);//年
}

/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(uchar ord, uchar dd){
	clock_clk=0;
	clock_Rst=0;
	clock_Rst=1;
	clock_out(ord);
	clock_out(dd);
	clock_Rst=0;
	clock_clk=1;
}



/*****************************************************************************/
//调时用加1程序(上层应用)
void Set_time(uchar sel){ //根据选择调整的相应项目加1并写入DS1302
  uchar address,item;
  uchar max,mini;
  write(0,0x9a);
  if(sel==7)  {address=0x80; max=0;mini=0;}     //秒7
  if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟6
  if(sel==5)  {address=0x84; max=23;mini=0;}    //小时5
  if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4
  if(sel==3)  {address=0x86; max=31;mini=1;}    //日3
  if(sel==2)  {address=0x88; max=12;mini=1;}    //月2
  if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1

  //读取1302某地址上的数值转换成10进制赋给item
  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(KEY_3 == 0){
        delay1ms(10);
         if(KEY_3 == 0){

  	item++;//数加 1
        }
  }
  if(KEY_4 == 0){
        delay1ms(10);
        if(KEY_4 == 0){

  	item--;//数减 1
        }
  }
  if(item>max) item=mini;//查看数值有效范围
  if(item<mini) item=max;
  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  write_clock(0x8e,0x80);//写保护,禁止写操作
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2007年1月1日00时00分00秒星期一)

        write_clock(0x8e,0x00);//允许写操作
	write_clock(0x8c,0x08);//年
	write_clock(0x8a,0x03);//星期
	write_clock(0x88,0x09);//月
	write_clock(0x86,0x17);//日
	write_clock(0x84,0x23);//小时
	write_clock(0x82,0x59);//分钟
	write_clock(0x80,0x56);//秒
	write_clock(0x90,0xa5);//充电
	write_clock(0x8e,0x80);//禁止写操作
}

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









/*****************************************************************************/
//温度传感器定义
sbit DQ = P3 ^ 7;//定义ds18B20总线IO

/******************************************************************************/
void Delay(int num)//延时函数
{
	while(num--) ;
}
/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
	uchar x=0;
	DQ = 1;    //DQ复位
	Delay(8);  //稍做延时
	DQ = 0;    //单片机将DQ拉低
	Delay(80); //精确延时 大于 480us
	DQ = 1;    //拉高总线
	Delay(14);
	x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
	Delay(20);
}
/******************************************************************************/
uchar ReadOneChar(void)//读一个字节
{
	uchar i=0;
	uchar dat = 0;
	for (i=8;i>0;i--)
	{
		DQ = 0; // 给脉冲信号
		dat>>=1;
		DQ = 1; // 给脉冲信号
		if(DQ)
		dat|=0x80;
		Delay(4);
	}
	return(dat);
}
/******************************************************************************/
void WriteOneChar(uchar dat)//写一个字节
{
	uchar i=0;
	for (i=8; i>0; i--)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay(5);
		DQ = 1;
		dat>>=1;
	}
}
/******************************************************************************/
uint ReadTemperature(void)//读取温度
{
	uchar a=0;

⌨️ 快捷键说明

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