历史上的今天
今天是:2025年02月12日(星期三)
2020年02月12日 | 51单片机OLED时钟显示
2020-02-12 来源:51hei
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_dat=a5; clock_clk=1; clock_clk=0; clock_dat=a6; clock_clk=1; clock_clk=0; clock_dat=a7; clock_clk=1; clock_clk=0; } /************************1302读驱动函数*****************************************/ uchar read_clock() { clock_dat=1; //输出赋1 a0=clock_dat;clock_clk=1; clock_clk=0; //位0为1,读1302 a1=clock_dat;clock_clk=1; clock_clk=0; //下降沿读出有效 a2=clock_dat;clock_clk=1; clock_clk=0; a3=clock_dat;clock_clk=1; clock_clk=0; a4=clock_dat;clock_clk=1; clock_clk=0; a5=clock_dat;clock_clk=1; clock_clk=0; a6=clock_dat;clock_clk=1; clock_clk=0; a7=clock_dat;clock_clk=1; clock_clk=0; return(ACC); } /***************************写数据入1302****************************************/ void write_dat_clock(uchar add,uchar dat) { clock_clk=0; clock_rst=0; //时钟脉冲为低时 clock_rst=1; //复位端才能置高 write_clock(add); //写入地址(命令字节) write_clock(dat); //写入数据 clock_rst=0; //终止数据传送 clock_clk=1; } /***************************从1302读出数据**************************************/ uchar read_dat_clock(uchar add) { uchar dat=0; //定义数据储存变量 clock_clk=0; clock_rst=0; clock_rst=1; write_clock(add); //写入要读数据的地址 dat=read_clock(); //读出数据 clock_rst=0; //终止数据传送 clock_clk=1; return dat; //返回数据 } /**************************设置初始时间函数*************************************/ void set_time() { read_dat_clock(0x81); //读取秒
史海拾趣
|
我有一个WINDOWS MOBILE的PDA,用的三星CPU,有高手能把这个系统改成WINCE.NET么?当然是要付费的,价钱商量. 我有一个WINDOWS MOBILE的PDA,用的三星CPU,有高手能把这个系统改成WINCE.NET么?当然是要付费的,价钱商量. 联系我QQ:86163938 MSN:myfm3a@hotmail.com 急… 查看全部问答> |
|
DirectDraw和DirectShow如何协调,正十分迷茫中 我开发一个游戏,采取独占模式,想在DIRECTDRAWSURFACE表面开辟一块区域用于播放视频,现在是没有办法看见视频播放的画面, 但是如果我把DirectDraw相关的代码去掉,只保留播放视频的代码,视频是能够正常播放的。另外请教高手知道如何使用MediaPl ...… 查看全部问答> |
|
一、变频恒压供水的特点1. 节能,可以实现节电20%-40%,能实现绿色用电。2. 占地面积小,投入少,效率高。3. 配置灵活,自动化程度高,功能齐全,灵活可靠。4. 运行合理,由于是软起和软停,不但可以消除水锤效应,而且电机轴 ...… 查看全部问答> |
|
购买或者黑金FPGA开发板换购ARM开发板,野火,神舟均可,多退少补。 我的FPGA板子是今年4月份在黑金官方淘宝店买的 RMB399 换购野火开发板或者神舟开发板。 不愿换购的话。 RMB 270 收野火(+液晶+jlink) RMB 200收神舟(+液晶+jlink) 可以的话 加QQ 411101807 这个论坛不常上,请直接加QQ,学生党,非诚 ...… 查看全部问答> |
|
MSP430G2开发板 ,LaunchPad实验板 元件 学习 TPS77301DGK品牌TI封装MSOP8 MSP430G2开发板 ,LaunchPad实验板 元件 学习 TPS77301DGK品牌TI封装MSOP8 大概:TPS77301DGK升降压稳压管复位IC供应小结 1.5-- 5.5v 常用的电源电压监督员(中职),或重置输出电压。 可能相关 :当前级接上高阻抗的后级它主要提供适切的输出电压 ...… 查看全部问答> |




