AT89C51+DS1302+DS18B20六位数码管显示时钟程序

发布者:SereneSoul55最新更新时间:2017-09-02 来源: elecfans关键字:AT89C51  DS1302  DS18B20  数码管  显示时钟 手机看文章 扫描二维码
随时随地手机看文章

#include

#define uchar unsigned char

#define uint unsigned int

#include"DS1302.h"

#include"DS18B20.h"

#define sec 0x80

#define min 0x82

#define hou 0x84

#define read 0x01

unsigned char hour,minute,second,id=0,timecount,re_disp=0,p,n0,n1;

bit flag;

#define leddata P0 //定义数码管的段选

sbit ssw=P2^7;  //小时十位

sbit sw=P2^6;  //小时个位

sbit sfw=P2^5;  //分十位

sbit fw=P2^4;  //分个位

sbit wdsw=P2^3;  //温度十位

sbit wdgw=P2^2;  //温度个位

sbit DOWN=P2^1;  //加按键

sbit UP=P2^0;  //减按键

//sbit DQ=P3^0;  //DS18B20信号端

//sbit T_CLK=P3^1; //DS1302的时钟端

//sbit T_IO=P3^2; //DS1302的数据端

//sbit T_RES=P3^3; //DS1302的复位端

sbit SET=P3^4;  //时间设定键

unsigned int ok;

unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};

unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};

//                          秒  分钟 小时  日   月   年  星期

void Set_id(unsigned char sel,unsigned char sel_1);

void delays(unsigned char k)

{

unsigned char i,j;

for(i=0;i

  for(j=0;j<50;j++);

}

void display(void)

{

if(flag&hour)  //为真时是设定时间

  {

   ssw=0;leddata=0xff;delays(10);ssw=1;

   sw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sw=1;

  }

else   //为假时为正常走时

  {

   leddata=tab[Read1302(hou+1)/16];ssw=0;delays(10);ssw=1;

   leddata=tab[Read1302(hou+1)]&~((unsigned char)~flag<<6);sw=0;delays(10);sw=1;

  }

if(flag&minute)

  {

   sfw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sfw=1;

   fw=0;leddata=0xff;delays(10);fw=1;

  }

else

  {

   leddata=tab[Read1302(min+1)/16]&~((unsigned char)~flag<<6);sfw=0;delays(10);sfw=1;

   leddata=tab[Read1302(min+1)];fw=0;delays(10);fw=1;

  }

TR0=0;  //关定时器

ok=Read_Temperature();  //调用读温度函数

TR0=1;  //开定时器

p=(unsigned char)(ok>>4); //温度数据转换

wdsw=0;leddata=tab[p0/10];delays(10);wdsw=1; //温度显示十位

wdgw=0;leddata=tab[p];delays(10);wdgw=1;  //温度显示个位

}

void id_case1_key(void)  //按键加减子程序

{

display();

   if (!DOWN) //减少

       {

         while(!DOWN)display();

   re_disp=0;

      Set_id(id,0);    

       }

    if (!UP)  //增加

       {

         while(!UP)display();

   re_disp=0;

      Set_id(id,1);    

       }

}

void Scan_Key(void)  //按键扫描程序

{

display();

if(!SET)

  {

   while(!SET)display();

   re_disp=0;

   id++;if(id>2)id=0;

  }

if(id==0){hour=0;minute=0;second=0;}

if(id==1){hour=1;id_case1_key();}

if(id==2){hour=0;minute=1;id_case1_key();}

// if(id==3){minute=0;second=1;id_case1_key();}

}

//根据选择调整相应项目并写入DS1302

void Set_id(unsigned char sel,unsigned char sel_1)

{

   signed char max,mini,address,item;

if(sel==1)  {address=hou; max=23;mini=0;}    //小时

if(sel==2)  {address=min; max=59;mini=0;}    //分钟

  // if(sel==3)  {address=sec; max=0;mini=0;}     //秒

   item=Read1302(address+1)/16*10+Read1302(address+1);

   if (sel_1==0) item--;  else item++;

  if(item>max) item=mini;  

   if(item

Write1302(0x8e,0x00);//允许写操作

   Write1302(address,item/10*16+item);

   Write1302(0x8e,0x80);//写保护,禁止写操作  

}

void main()

{  TMOD=0x01;

    TH0=(65535-50000)/256;

    TL0=(65535-50000)%6;

    EA=1;

    ET0=1;

  TR0=1;

  Write1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻

   Write1302(0x8e,0x80);//写保护,禁止写操作

  if(!UP&!DOWN)Set1302(inittime);

  adjust_res(0x7f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125; 0x7f:0.0625

while(1)

{

  Scan_Key();  //调用按键扫描程序

  display();  //调用数码管显示程序

    

}

}

void t0(void) interrupt 1 using 0

{

   TH0=(65535-50000)/256; //50ms定时

   TL0=(65535-50000)%6;  

   timecount++;re_disp++;

   if(timecount>9)

     {

   timecount=0;

      flag=~flag;

     }

if(re_disp>200){re_disp=0;if(id)id=0;}

}


关键字:AT89C51  DS1302  DS18B20  数码管  显示时钟 引用地址:AT89C51+DS1302+DS18B20六位数码管显示时钟程序

上一篇:AT89C51单片机1602液晶显示时钟程序
下一篇:液晶显示AT89C52单片机DS1302实时时钟程序

推荐阅读最新更新时间:2024-03-16 15:35

AT89C51单片机的红外线遥控信号发送器电路设计
TC9012F是一种通用型红外遥控信号发送用CMOS大规模集成电路,适用于电视(TV),磁带录像机(VTR),激光唱机等设备的遥控操作。市场上,以TC9012F为核心的9012型红外遥控器被广泛使用且价格便宜。将设计的基于单片机AT89C51的9012型红外遥控解码器应用于生产即时显示系统中,作为参数设置和系统控制用红外遥控器,在实际应用中收到了良好效果。 1 红外线遥控信号发送器电路 TC9012F的遥控信号 TC9012F为4位专用微控制器,其内部振荡电路的振荡频率fosc典型值为455 kHz。当不按下操作键时,其内部455 kHz的时钟振荡器停止工作,以减少电池消耗。内部分频电路将振荡频率,fosc进行12分频后,变成
[单片机]
<font color='red'>AT89C51</font>单片机的红外线遥控信号发送器电路设计
武林教你学PIC32(十五)液晶显示实时时钟
春节过后,很多内容都忘记了,好在以前整理了一些子函数,子模块。今天就用子函数模块化编写,液晶LCD1602实时显示时钟。 用到这样几个文件: delay.c采用定时器延时函数,里面有延时毫秒和微秒的函数。 lcd1602.c液晶显示函数 rtc.c实时时钟函数 采用模块化编程好处就是简单方便,便于移植,主函数内容不会过于庞大,也方便阅读。 main.c的内容为: #include lcd1602.h #include delay.h #include rtc.h #include led.h int main(void) { LED_INIT(); //LED初始化 initLCD(); //初始化LCD1602 putsL
[单片机]
武林教你学PIC32(十五)液晶<font color='red'>显示</font>实时<font color='red'>时钟</font>
单片机万年历DS1302时钟芯片的应用
基于DS1302时钟芯片的万年历的制作 包含温度传感器,温度显示 按键操作,红外遥控 万年历时间断电记录 12864液晶显示屏显示万年历等 ------------------------------------------------- 五年专业设计经验,嵌入式linux,arm,stm32,fpga,电路PCB板,网络,GPS差分定位,等等解决方案,代码设计,联-系-方-式-微-信 : 253376326 -------------------------------------------------- 通过protues仿真和keil仿真 protues截图: keil代码
[单片机]
单片机万年历<font color='red'>DS1302</font><font color='red'>时钟</font>芯片的应用
AT89C51ED2 的EEPROM 读写操作总结
今天因为要用到ED2的EEPROM,写点东西总结一下,以防日后忘了。 先引用网上有朋友问到的一个问题。 //////// 哪位高手用过AT89C51ED EEPROM 保存数据 下面程序写数据到EEPROM: #define EEPROM_VC_ADD 0X0100 adr = EEPROM_VC_ADD; // ACC = c1; while(EECON & 0x01); EA = 0; ACC = 44; EECON = 0x02; XBYTE = ACC; // *(unsigned char xdata*)adr = ACC; EECON = 0x00; E
[单片机]
五花八门的关于单片机的开发经验
单片机开发初探 做AT89C5X(51,52,55等等)的时间最长,知道的可能多些,主要谈些实际应用中的经验与教训。书可以参看北航出的一本专门讲AT89系列的,还不错,建议大家购买。 AT89C51我认为是一个非常标准的51单片机了,4个P口,1个串口,RAM只有标准的128Byte,Flash也只有4K,功能还算齐全,我就以它为基础,所以开发过程中遇到的问题吧。 复位源的问题 大家最常用的复位方式就是电阻加电容吧,AT89C51是高电平复位,这种方式不稳定,在产品调试时可以使用,因为在调试时我们一般使用了仿真器,而许多仿真器都会自己输出复位信号,而屏蔽掉目标板产生的复位信号,所以调试时复位信号是没有问题的,我们公司使用的
[单片机]
五花八门的关于单片机的开发经验
STC单片机之1602显示时钟
/****为了简单起见,调整时间是只添加了s1和s2,删除了s3的功能,若调过了可通过s2循环一圈 ****/ /****From Brandon 2016-09-17 ****/ /****关键点:按键扫描和定时器0的中断程序比较生疏,需再看 ****/ #include reg51.h sbit LCD_rs=P1^0; sbit LCD_rw=P1^1; sbit LCD_en=P2^5; sbit s1=P3^0; sbit rd=P3^7; sbit wr=P3^6; sbit s2=P3^1; sbit s3=P3^2; unsigned char code table = 2016-9-15 THU ; u
[单片机]
单片机万年历(LCD12864、DS18B20DS1302
一、简介 此电路由AT89C51最小电路板和LCD12864显示模块、DS18B20温度模块、DS1302时钟模块组成。 主要的功能是:显示实时的时间和当前的温度。 二、运行效果 三、部分代码 /*想要更多项目私wo!!!*/ #include reg51.h #include DS18B20.H #include DS1302.H #include LCD12864.H unsigned char j ; sbit KEY1=P3^2; sbit KEY2=P3^3; sbit KEY3=P3^4; sbit LED1=P3^5; sbit LED2=P3^6; sbit LED3=P3^7; ucha
[单片机]
单片机万年历(LCD12864、<font color='red'>DS18B20</font>、<font color='red'>DS1302</font>)
基于AT89C51应用系统的串行通信设计
1 引 言 在红外成像技术的电力设备状态检测系统中,基于AT89C51单片机的应用系统,采用美国雷态公司的型号为3iLRL3的非接触式红外测温仪.该测温仪采用的是RS232C串行通信标准接口,该接口在很多通信设备中通用,目前与PC机的直接串行通信也是RS 232C接口。尽管RS232C性能指标并非很好,但还是有广泛的市场支持。串行通信技术在测控系统中占有很重要的地位,只用三根线.就可以方便的在2个数字设备之间进行信息的交换,实现全双工的传送数据,硬件成本低.而且通用性好。 2 串行通信的硬件设计 在所开发的系统中.红外测温仪将检测电力没备的工作和环境温度,通过RS 232C串口传给单片机,同时由单片机控制检测装置的在线工作组态
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved