oled时钟单片机源程序如下:
#include "REG52.h"
#include "oled.h"
#define uchar unsigned char
#define uint unsigned int
#include
sbit DQ = P3^6; //数据口define interface
/***********************DS1302端口定义*******************************************/
sbit clock_rst=P3^5; //1302复位管脚定义
sbit clock_dat=P1^3; //1302I/O管脚定义
sbit clock_clk=P1^2; //1302时钟管脚定义
/***************寄存器定义(用于记录1302IO的输入和输出)*************************/
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;
/**********************1302全局变量定义******************************************/
uchar sec,min,hour,day,month,year1,year2=20;//秒,分,时,日,月,星期,年
/************************蜂鸣器端口定义******************************************/
sbit beep=P3^7;
/***********************按键定义*************************************************/
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P3^4;
uchar status=0;//按键功能选择定义(年0,月1,日2,时3,分4 )
uint tmp; //温度值 variable of temperature
uint Temp_Buffer = 0;
uint t1;
uint t2;
uint t3;
float tt;
void delay2(unsigned char i) //延时函数
{
while(--i);
}
/**********************延时函数*************************************************/
void delay(uint t)
{
uint b;
for(;t;t--)
for(b=0;b<121;b++);
}
void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command
{
DQ = 1; //DQ复位,不要也可行。
delay2(1); //稍做延时
DQ = 0; //单片机拉低总线
delay2(250); //精确延时,维持至少480us
DQ = 1; //释放总线,即拉高了总线
delay2(100); //此处延时有足够,确保能让DS18B20发出存在脉冲。
}
uchar Read_One_Byte() //读取一个字节的数据read a byte date
//读数据时,数据以字节的最低有效位先从总线移出
{
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us内读数据才会有效。
_nop_(); //至少维持了1us,表示读时序开始
dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。
DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上
delay2(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
if(DQ) //控制器进行采样
{
dat |= 0x80; //总线为1, DQ为1,那就把dat的最高位置1;若为0,不处理,保持0
}
delay2(10); //此延时不能少,确保读时序的长度60us。
}
return (dat);
}
void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低总线
_nop_(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
DQ = dat&0x01; //从字节的最低位开始传输
//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
//因为15us后DS18B20会对总线采样。
delay2(10); //必须让写时序持续至少60us
DQ = 1; //写完后,必须释放总线,
dat >>= 1;
delay2(1);
}
}
uint Get_Tmp() //获取温度get the temperature
{
uchar a=0,b=0;
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0x44); //温度转换指令
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0xbe); //读暂存器指令
a = Read_One_Byte(); //读取到的第一个字节为温度LSB
b = Read_One_Byte(); //读取到的第一个字节为温度MSB
tmp = b; //先把高八位有效数据赋于temp
tmp <<= 8; //把以上8位数据从temp低八位移到高八位
tmp = tmp|a; //两字节合成一个整型变量
tt = tmp*0.0625; //得到真实十进制温度值,DS18B20可以精确到0.0625度
tmp =(uint)( tt*10+0.5); //放大十倍,目的是将小数点后第一位也转换为可显示数字
return (tmp);
}
void Display_Temp()
{
Temp_Buffer = Get_Tmp() ; //读取DS18B20的值
t1=(Temp_Buffer%1000/100); //显示温度十位值
t2=(Temp_Buffer%100/10); //显示温度个位值
t3=(Temp_Buffer%10); //显示温度十分位值
}
/*******************************************************************************/
/*************************DS1302子函数******************************************/
/************************1302写驱动函数*****************************************/
void write_clock(uchar dat)
{
ACC=dat;
clock_dat=a0; clock_clk=1; clock_clk=0; //数据在上升沿变化
clock_dat=a1; clock_clk=1; clock_clk=0; //下降沿写入1302
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_
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』