51单片机仿真例程-万年历

驱动DS1302模块,显示时间

#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
sbit RSPIN = P3^0;
sbit RWPIN = P3^1;
sbit EPIN = P3^2;

sbit DS1302_CLK = P0^1;
sbit DS1302_IO = P0^0;
sbit DS1302_RST = P0^2;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

void delay3ms(void)
{
  unsigned char i,j,k;
  for(i=0;i<18;i++)
  for(j=0;j<55;j++)
  for(k=0;k<100;k++);


}
void DS1302InputByte(unsigned char d)
{
 unsigned char i;
 ACC=d;
 for(i=8;i>0;i--)
 {
  DS1302_IO = ACC0;
  DS1302_CLK = 1;
  DS1302_CLK = 0;
  ACC = ACC>>1;
 
 
 
 
 }

}

unsigned char DS1302OutputByte(void)
{
 unsigned char i;
 for(i=8;i>0;i--)
 {
   ACC = ACC>>1;
   ACC7 = DS1302_IO;
   DS1302_CLK=1;
   DS1302_CLK=0;

 
 
 
 
 }
 return(ACC);


}

void Write1302(unsigned char ucAddr, unsigned char ucDa)
{
 DS1302_RST = 0;
 DS1302_CLK = 0;
 DS1302_RST = 1;
 DS1302InputByte(ucAddr);
 DS1302InputByte(ucDa);
 DS1302_CLK = 1;
 DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr)
{
 unsigned char ucData;
 DS1302_RST = 0;
 DS1302_CLK = 0;
 DS1302_RST = 1;
 DS1302InputByte(ucAddr | 0x01);
 ucData = DS1302OutputByte();
 DS1302_CLK = 1;
 DS1302_RST = 0;
 return(ucData);
}
void lcdwaitidle(void)
{
 unsigned char i;
 P1=0xff;
 RSPIN=0;
 RWPIN=1;
 EPIN=1;
 for(i=0;i<20;i++)
   if((P1&0x80)== 0)break;
 EPIN=0;

}
void lcdwc(unsigned char c)
{
 lcdwaitidle();
 RSPIN=0;
 RWPIN=0;
 P1=c;
 EPIN=1;
 _nop_();
 EPIN=0;
}
void lcdwd(unsigned char d)
{
 lcdwaitidle();
 RSPIN=1;
 RWPIN=0;
 P1=d;
 EPIN=1;
 _nop_();
 EPIN=0;
}

void lcdreset(void)
{
 lcdwc(0x38);
 delay3ms();
 lcdwc(0x38);
 delay3ms();
 lcdwc(0x38);
 delay3ms();
 lcdwc(0x38);
 delay3ms();
 lcdwc(0x08);
 lcdwc(0x01);
 delay3ms();
 lcdwc(0x06);
 lcdwc(0x0c);
}

unsigned char year,month,day,hour,min,sec;
unsigned char date[8]={0,0,'-',0,0,'-',0,0};
unsigned char time[8]={0,0,':',0,0,':',0,0};
void main()
{
   unsigned char a,charpos,i,temp;
   lcdreset();
   Write1302(0x8e,0x00);
   Write1302(0x80,0x00);
   while(1)
   {
   temp= Read1302(0x80);
   sec=((temp&0x70)>>4)*10 + (temp&0x0f);
   temp = Read1302(0x82);
   min=((temp&0x70)>>4)*10 + (temp&0x0f);
   temp	= Read1302(0x84);
   hour = ((temp&0x70)>>4)*10 + (temp&0x0f);

   temp= Read1302(0x86);
   day=((temp&0x70)>>4)*10 + (temp&0x0f);
   temp= Read1302(0x88);
   month=((temp&0x70)>>4)*10 + (temp&0x0f);
   temp= Read1302(0x8c);
   year=((temp&0x70)>>4)*10 + (temp&0x0f);
   
   date[0]=year/10+'0';
   date[1]=year%10+'0';
   date[3]=month/10+'0';
   date[4]=month%10+'0';
   date[6]=day/10+'0';
   date[7]=day%10+'0';

   time[0]=hour/10+'0';
   time[1]=hour%10+'0';
   time[3]=min/10+'0';
   time[4]=min%10+'0';
   time[6]=sec/10+'0';
   time[7]=sec%10+'0';


   charpos=0x4;
   for(i=0;i<8;i++)
   {
   	 a=date[i];
	 lcdwc(charpos | 0x80);
	 lcdwd(a);
	 charpos++;
   
   
   
   }
   charpos=0x44;
   for(i=0;i<8;i++)
   {
    a=time[i];
	lcdwc(charpos | 0x80);
	lcdwd(a);
	charpos++;
   
   
   
   
   
   
   }
   
   
   
   
   
   
   
   }




}








效果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机与ATK-HC05蓝牙通讯是一种常见的通信方式,用来实现单片机与蓝牙设备之间的数据传输。通常使用串口通讯的方式实现数据的收发。 首先,需要通过51单片机的串口与ATK-HC05蓝牙模块进行连接。将单片机的TX引脚连接到蓝牙模块的RX引脚,将单片机的RX引脚连接到蓝牙模块的TX引脚,并为蓝牙模块和单片机提供电源。 其次,需要在单片机的程序中编写相应的代码,使其能够通过串口与蓝牙模块进行通信。具体的通信过程如下: 1. 初始化串口:设置串口的波特率、数据位数、停止位等参数。 2. 发送AT指令:ATK-HC05蓝牙模块使用AT指令进行配置和控制,可以通过单片机发送AT指令给蓝牙模块来实现相应的功能。 3. 接收AT指令响应:蓝牙模块接收到AT指令后会返回相应的响应信息,单片机需要接收并解析这些响应信息。 4. 发送数据:单片机可以通过串口向蓝牙模块发送需要传输的数据,蓝牙模块会将数据发送给远程蓝牙设备。 5. 接收数据:单片机可以通过串口接收蓝牙模块发送过来的数据,进行相应的处理。 通过以上步骤,就能实现51单片机与ATK-HC05蓝牙模块之间的通信了。 需要注意的是,通信的具体实现会涉及到具体的硬件连接和编程细节,因此可以根据具体的硬件和需求进行相应的调试和优化。另外,要保证程序的稳定性和可靠性,可以添加错误处理和异常情况的处理等功能。 总之,51单片机与ATK-HC05蓝牙通讯例程是一种常见的通信方式,通过串口来实现单片机与蓝牙设备之间的数据传输,具有简单、可靠的特点,可以应用于各种需要远程数据传输的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值