51单片机通过蓝牙对ds1302调时的代码
时间: 2023-11-13 13:02:35 浏览: 49
以下是一个简单的示例代码,使用51单片机通过蓝牙对DS1302实时时钟芯片进行调时:
```c
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER0_RELOAD_VALUE 256 - (FOSC / 12 / BAUD)
sbit SCK = P1^0;
sbit DSIO = P1^1;
sbit RST = P1^2;
unsigned char time[7];
unsigned char receive_buf[20];
unsigned char receive_len;
void delay(unsigned int t)
{
while(t--);
}
void send_byte(unsigned char byte)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DSIO = byte & 0x01;
byte >>= 1;
SCK = 1;
SCK = 0;
}
}
unsigned char receive_byte()
{
unsigned char i;
unsigned char byte = 0;
for(i = 0; i < 8; i++)
{
byte >>= 1;
if(DSIO)
byte |= 0x80;
SCK = 1;
SCK = 0;
}
return byte;
}
void init_ds1302()
{
RST = 0;
delay(100);
RST = 1;
send_byte(0x8e);
send_byte(0);
send_byte(0x80);
}
void write_ds1302(unsigned char reg, unsigned char val)
{
send_byte(0x8e);
send_byte(reg);
send_byte(val);
}
unsigned char read_ds1302(unsigned char reg)
{
send_byte(0x8e);
send_byte(reg);
return receive_byte();
}
void read_time()
{
unsigned char i;
for(i = 0; i < 7; i++)
time[i] = read_ds1302(i + 1);
}
void write_time()
{
unsigned char i;
write_ds1302(0x80, 0);
for(i = 0; i < 7; i++)
write_ds1302(i + 1, time[i]);
write_ds1302(0x80, 0x80);
}
void uart_init()
{
TMOD = 0x20;
TH1 = TIMER0_RELOAD_VALUE;
TL1 = TIMER0_RELOAD_VALUE;
PCON = 0x00;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
}
void uart_send(unsigned char byte)
{
SBUF = byte;
while(TI == 0);
TI = 0;
}
void uart_send_string(unsigned char *str)
{
unsigned char i;
for(i = 0; i < strlen(str); i++)
uart_send(str[i]);
}
void uart_receive() interrupt 4
{
if(RI == 1)
{
receive_buf[receive_len] = SBUF;
receive_len++;
RI = 0;
}
}
void parse_command()
{
unsigned char i;
if(strncmp(receive_buf, "time", 4) == 0)
{
read_time();
for(i = 0; i < 6; i++)
uart_send(time[i]);
}
else if(strncmp(receive_buf, "set", 3) == 0)
{
time[0] = receive_buf[4] & 0x7f;
time[1] = receive_buf[6] & 0x7f;
time[2] = receive_buf[8] & 0x3f;
time[3] = receive_buf[10] & 0x3f;
time[4] = receive_buf[12] & 0x1f;
time[5] = receive_buf[14] & 0x7f;
write_time();
uart_send_string("OK");
}
else
uart_send_string("Invalid command");
}
void main()
{
uart_init();
init_ds1302();
EA = 1;
ES = 1;
while(1)
{
if(receive_len > 0)
{
parse_command();
receive_buf[0] = 0;
receive_len = 0;
}
}
}
```
在这个例子中,我们使用P1口的0、1、2三个引脚分别连接DS1302时钟芯片的SCLK、IO、RST引脚,使用串口通信模块进行蓝牙通信。我们可以通过发送类似“set 21 01 01 12 00 00”这样的指令来设置DS1302的时间,或者通过发送“time”指令来读取当前的时间。