ds1302底层代码
/* # DS1302代码片段说明
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <STC15F2K60S2.H>
#include "ds1302.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
//
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
//===================================
void ds1302_Write(unsigned char *time)
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<3;i++)
{
Write_Ds1302_Byte(0x84-2*i,time[i]/10%10<<4|time[i]%10);
}
Write_Ds1302_Byte(0x8e,0x00);
}
void ds1302_Read(unsigned char *time)
{
unsigned char i;
for(i=0;i<3;i++)
{
time[i]=Read_Ds1302_Byte(0x85-2*i);
time[i]=((time[i]/16)*10+time[i]%16);
}
}
温度传感器底层
/* # 单总线代码片段说明
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <STC15F2K60S2.H>
#include "onewire.h"
sbit DQ=P1^4;
//
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--){
for(i=0;i<12;i++);
}
}
//
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
float temperature()
{
unsigned int low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
return ((high<<8)|low)/16.0;
}
按键底层
#include "main.h"
unsigned char key_init()
{
unsigned char key=0;
P44=0;P42=1;P35=1;P34=1;
if(P33==0)key=4;
if(P32==0)key=5;
if(P31==0)key=6;
if(P30==0)key=7;
P44=1;P42=0;P35=1;P34=1;
if(P33==0)key=8;
if(P32==0)key=9;
if(P31==0)key=10;
if(P30==0)key=11;
P44=1;P42=1;P35=0;P34=1;
if(P33==0)key=12;
if(P32==0)key=13;
if(P31==0)key=14;
if(P30==0)key=15;
// P44=0;P42=1;P35=1;P34=1;
// if(P33==0)key=4;
// if(P32==0)key=5;
// if(P31==0)key=6;
// if(P30==0)key=7;
return key;
}
(小编这里P34用于频率测量将其注释掉)
数码管及LED底层
(基于西风建立的模板)
#include <STC15F2K60S2.H>
#include "main.h"
uchar led_dly;
uchar led_flay;
uchar key_dly;
uchar display_dly;
uchar SMG[]={16,16,16,16,16,16,16,16};
uchar LED[]={0,0,0,0,0,0,0,0};
uchar dot[]={0,0,0,0,0,0,0,0};
uchar pos;
void Timer1_Init(void)
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0x18;
TH0 = 0xFC;
TF1 = 0;
TR1 = 1;
ET1=1;
EA=1;
}
void Timer1_isr() interrupt 3
{
key_dly++;
led_dly++;
display_dly++;
smg_Init(SMG,dot,pos);
led_Init(LED,pos);
if(++pos==8)pos=0;
}