使用51单片机设计电子钟制作的介绍电路图和程序等资料说明

电子说

1.2w人已加入

描述

经过两天熬夜的艰苦奋战,在原程序基础上进行升级,添加按键多功能操作

新增功能:1. K1模式转换,可自由切换:主界面显示,时间调整,闹钟设置,温度上下限设定等; 2. K2选定需要调整的位数。

切换至时间调整时,通过K3-"加",K4-"减"按键调整数值。

切换至闹钟设置时,通过K3-"加",K4-"减"按键调整数值。

切换至温度上下限设定时,通过K3-"加",K4-"减"按键调整数值。

准备扩展的新功能:闹钟音乐,喇叭开启和关闭,。

操作说明:

开机进入主界面,显示时钟和温度。按下K1时,进入模式选择,(有时间调整,闹钟设置,温度上下限设定等),当K1按下四次后,长响一声,回到主界面。

当K1(模式选择键)按下第一次,选择在时间调整时,按下K2,选定需要调整的位数,选定的位数会一秒钟不停的闪烁。然后按下K3 “加”或者K4 “减”按键,进行数值的加减,当K2按到五次时,返回时间调整界面。

再按下K1(模式选择键)按下第二次,进入到下一个模式,闹钟设置。按下K2,选定需要调整的位数,选定的位数会一秒钟不停的闪烁。然后按下K3 “加”或者K4 “减”按键,进行数值的加减,当K2按到五次时,返回闹钟设置界面。

再按下K1(模式选择键)按下第三次,进入到下一个模式,温度上下限设定。按下K2,选定需要调整的位数,选定的位数会一秒钟不停的闪烁。然后按下K3 “加”或者K4 “减”按键,进行数值的加减,当K2按到五次时,返回温度上下限设定界面。

当K1(模式选择键)按下第四次,返回到时钟和温度主界面显示。

采用的是stc89c51单片机,代码:

#include"reg51.h" #define uchar unsigned char #define uint unsigned int /****温度 端口定义******/  sbit wx5=P2^4;  sbit wx6=P2^5;  sbit wx7=P2^6;  sbit wx8=P2^7;  sbit DQ=P3^6;  uint temp, temp1,temp2, xs,H1,H2,L1,L2;              uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,       0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0X9c,0xc6,0x91,0xfc,0XE3};   /******延时程序*******/ void delay1(uint m)    {      uint i,j;    for(i=m;i>0;i--)   for(j=110;j>0;j--);    } void delay(unsigned int m)    {      while(m--);     } void Init_DS18B20()     {     unsigned char x=0;     DQ = 1;          //DQ复位 ds18b20通信端口     delay(8); //稍做延时     DQ = 0;          //单片机将DQ拉低     delay(80); //精确延时 大于 480us     DQ = 1;          //拉高总线       delay(4);     x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败     delay(20);    } /***********ds18b20读一个字节**************/  uchar ReadOneChar()   {     unsigned char i=0;     unsigned char dat = 0;     for (i=8;i>0;i--)     {      DQ = 0; // 高电平拉成低电平时读周期开始      dat>>=1;      DQ = 1; // 给脉冲信号      if(DQ)      dat|=0x80;   //      delay(4);      }     return(dat);   } /*************ds18b20写一个字节****************/  void WriteOneChar(unsigned char dat)  {   unsigned char i=0;   for (i=8; i>0; i--)    {      DQ = 0;          //从高电平拉至低电平时,写周期的开始      DQ = dat&0x01;   //数据的最低位先写入      delay(5);        //60us到120us延时      DQ = 1;              dat>>=1;         //从最低位到最高位传入    }  } /**************读取ds18b20当前温度************/ void ReadTemperature()  {    unsigned char a=0;    unsigned  b=0;    unsigned  t=0;    Init_DS18B20();    WriteOneChar(0xCC);   // 跳过读序号列号的操作    WriteOneChar(0x44);   // 启动温度转换    delay(1);            // this message is wery important    Init_DS18B20();    WriteOneChar(0xCC);   //跳过读序号列号的操作    WriteOneChar(0xBE);   //读取温度寄存器等(共可读9个寄存器) 前两个就是温度    delay(1);    a=ReadOneChar();      //读取温度值低位      b=ReadOneChar();      //读取温度值高位        temp1=b<<4;           //高8位中后三位数的值    temp1+=(a&0xf0)>>4;   //低8位中的高4位值加上高8位中后三位数的值   temp1室温整数值    temp2=a&0x0f;         //小数的值    temp=((b*256+a)>>4);  //当前采集温度值除16得 实际温度值    zhenshu        xs=temp2*0.0625*10;   //小数位,若为0.5则算为5来显示  xs小数    xiaoshu   } /////////////////////////////////////////////////////////////////////// /****时钟 端口定义******/  sbit wx1=P2^0;  sbit wx2=P2^1;  sbit wx3=P2^2;  sbit wx4=P2^3;  uchar  qian,bai,shi,ge,miao1,miao2,count1,count2;  uchar  n1,n2,z1,z2;//设置闹钟变量  uchar code table1[]={0xc0,0xcf,0xa4,0x86,0x8b,       0x92,0x90,0xc7,0x80,0x82};  ////////////////////////////////////////////  /***************按键调时程序***************/   sbit K1=P3^0;   sbit K2=P3^1;   sbit K3=P3^2;   sbit K4=P3^3;   sbit BEEP=P3^7;    //// 定义蜂鸣器口   uchar K1num,K2num,K3num,K4num,K5num,K6num,K7num;  //////////////////////////////////////////    /**********报警声音**************/   bi(uint t)   {      int c,n;      for(c=0;c

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分