有关题目







实现代码
注意:
数据处理方面:由于ds1302芯片存储的数据是BCD码,所以我们要进行BCD码与十进制之间的转换,例如0x16 的BCD码为16,十进制为1 * 16 + 6 = 32。
源文件修改方面:官方给onewire.h,ds1302.h中使用的时C51的头件"reg52.h",我们需修改为对应的15系列头文件"STC15F2K60S2.h",这样才可以使用一些特殊位寄存器。
底层代码:需修改驱动代码onewire.c中单总线延时函数,官方给我们是STC89C52RC系列,15系列的单片机速度比51快8~12倍,需要修改对应的延时函数。修改如下
void Delay_OneWire(unsigned int t)
{
char i;
while(t–)
for (i = 0; i < 12; i++);
}
main.c
#include "STC15F2K60S2.h"
#include "onewire.h"
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
uchar jm = 0;//界面初始化温度界面
code uchar tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff, 0xc1, 0xbf};
//U - 11 12
uchar init_time[3] = {
0x40, 0x59, 0x23};//初始化时间秒 分 时
uchar time[3] = {
0 };//秒 分 时
bit mod_flag;//0为温度控制模式
bit rel_flag;//继电器是否闭合标志,为0未闭合
bit flag_5s;
bit led10_flag;//初始化0为led10熄灭
bit L1_flag;//初始化0为L1熄灭
bit L3_flag;//初始化0为L3熄灭
float curr_temp;
uchar para_temp = 23;
void sys_init();
void key_handle();
float rd_temperature();
void rd_time();
void rel_handle();
void led();
void dsp_smg_bit(uchar pos, val);
void display();//显示功能,分四个大块
void dsp_temp();
void dsp_time();
void dsp_para();
void dsp_min_sec();//长按S17显示分秒
void delay_k(uchar t);//延时t * 10us
void Delay1ms(); //1ms@12.000MHz,延时1ms用于给足数码管足够显示时间
void main()
{
sys_init();
while(1)
{
curr_temp = rd_temperature();
rd_time();//实时读取时间
key_handle();
display();
rel_handle();//继电器处理
led();
}
}
void led()
{
if (time[0] == 0x00 && time[1] == 0x00)
{
L1_flag = 1;
}
if (L1_flag)
{
P2 = (P2 & 0x1f) | 0x80;
L1 = 0;
}
else
{
P2 = (P2 & 0x1f) | 0x80;
L1 = 1;
}
if (!mod_flag)
{
P2 = (P2 & 0x1f) | 0x80;
L2 = 0;
}
else
{
P2 = (P2 & 0x1f) | 0x80;
L2 = 1;
}
if (led10_flag)
{
//继电器吸附,间隔0.1sL3闪烁
if (L3_flag)
{
P2 = (P2 & 0x1f) | 0x80;
L3 = 0;
}
else
L3 = 1;
}
P0 |= 0xf8;

此篇博客详细介绍了在2022年单片机省赛中,如何使用STC15F2K60S2单片机配合onewire和ds1302库实现BCD码转换、时间读取与显示,以及温度传感器DS18B20的通信。重点涉及代码修改、数据处理和底层驱动的调整以适应15系列单片机。
最低0.47元/天 解锁文章
5453





