找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2522|回复: 1
收起左侧

51单片机蓝牙调节的时钟源程序设计

[复制链接]
ID:281174 发表于 2018-1-31 15:29 | 显示全部楼层 |阅读模式
51单片机的时钟设计,可以调节年月日 星期 和 时间。
内有源程序,在单片机板子上使用无误。还加上了蓝牙调节,可以通过蓝牙直接调节时间。

单片机源程序如下:
  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #include"ds1302.h"
  4. sbit K1=P3^2;
  5. sbit K2=P3^3;
  6. sbit K3=P3^4;
  7. unsigned char i;
  8. unsigned char buff;
  9. unsigned char receivedata;
  10. void keep();
  11. void lanya();
  12. void Int0Configuration();
  13. void LcdDisplay();
  14. unsigned char SetState,SetPlace;
  15. void Delay10ms(void);   //误差 0us
  16. void main()
  17. {

  18.         Int0Configuration();
  19.         LcdInit();
  20.         Ds1302Init();
  21.         while(1)
  22.         {       
  23.                 if(SetState==0)
  24.                 {
  25.                         Ds1302ReadTime();
  26.                 }
  27.                 else
  28.                 {
  29.                         lanya();
  30.                         keep();
  31.                                 }
  32.                  LcdDisplay();       
  33.                 }
  34.         }       
  35. void LcdDisplay()//1602显示
  36. {
  37.         LcdWriteCom(0x80+0X40);
  38.         LcdWriteData('0'+TIME[2]/16);                                //时
  39.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  40.         LcdWriteData('-');
  41.         LcdWriteData('0'+TIME[1]/16);                                //分
  42.         LcdWriteData('0'+(TIME[1]&0x0f));       
  43.         LcdWriteData('-');
  44.         LcdWriteData('0'+TIME[0]/16);                                //秒
  45.         LcdWriteData('0'+(TIME[0]&0x0f));

  46.         LcdWriteCom(0x80);
  47.         LcdWriteData('2');
  48.         LcdWriteData('0');
  49.         LcdWriteData('0'+TIME[6]/16);                        //年
  50.         LcdWriteData('0'+(TIME[6]&0x0f));
  51.         LcdWriteData('-');
  52.         LcdWriteData('0'+TIME[4]/16);                        //月
  53.         LcdWriteData('0'+(TIME[4]&0x0f));
  54.         LcdWriteData('-');
  55.         LcdWriteData('0'+TIME[3]/16);                        //日
  56.         LcdWriteData('0'+(TIME[3]&0x0f));
  57.         LcdWriteCom(0x8D);
  58.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                         
  59. }


  60. void Int0Configuration()//定时器
  61. {
  62.           TMOD = 0x20;
  63.     SCON = 0x50;
  64.     TH1 = 0xFD;
  65.     TL1 = TH1;
  66.     PCON = 0x00;
  67.     EA = 1;
  68.     ES = 1;
  69.     TR1 = 1;
  70. }
  71. //串口中断
  72. void Int0() interrupt 4          
  73. {
  74.          TH1=0xFD;
  75.          TL1=TH1;
  76.          Delay10ms();
  77.           if(receivedata==0x00)//进入时钟模式
  78.           {
  79.                 SetState=~SetState;
  80.                 SetPlace=0;
  81.                 Ds1302Init();               
  82.           }
  83.           if(RI)//在返回发送数字到手机上
  84.     {
  85.     RI = 0;
  86.                 }
  87.           receivedata=SBUF;
  88.     SBUF=receivedata;
  89.                 while(!TI);
  90.         TI = 0;
  91.                 Delay10ms();
  92.                 if(K3==0)
  93.         {
  94.                 SetState=~SetState;
  95.                 SetPlace=0;
  96.                 Ds1302Init();       
  97.         }
  98. }
  99. /********************************************************************************
  100. 蓝牙控制时间
  101. *****************************************************************************/
  102. void lanya()
  103. {
  104.                                 if(receivedata==0x01)//选择位置,可调节的数字位 从时间秒开始
  105.                                 {
  106.                                         SetPlace++;
  107.                                         if(SetPlace>=7)
  108.                                         SetPlace=0;                                       
  109.                                 }
  110.                                 buff=receivedata;//不加会使得数字一直加
  111.                                 if(buff==0x02)//加一
  112.                                 {
  113.                                         receivedata++;
  114.                                         TIME[SetPlace]=TIME[SetPlace]+1;
  115.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  116.                                         {
  117.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  118.                                         }
  119.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  120.                                         {
  121.                                                 TIME[SetPlace]=0;
  122.                                         }
  123.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  124.                                         {
  125.                                                 TIME[SetPlace]=0;
  126.                                         }
  127.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  128.                                         {
  129.                                                 TIME[SetPlace]=0;       
  130.                                         }
  131.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  132.                                         {
  133.                                                 TIME[SetPlace]=0;
  134.                                         }       
  135.                                         if((TIME[SetPlace]>=0x07)&&(SetPlace==5))                //周只能到7
  136.                                         {
  137.                                                 TIME[SetPlace]=1;
  138.                                         }
  139. }
  140.                                 }
  141. /****************************************************************************
  142. 按键控制时间                               
  143. ***************************************************************************/
  144. void keep()
  145. {
  146.         if(K1==0)                //检测按键K1是否按下
  147.                         {
  148.                                 Delay10ms();        //消除抖动
  149.                                 if(K1==0)
  150.                                 {
  151.                                         SetPlace++;
  152.                                         if(SetPlace>=7)
  153.                                                 SetPlace=0;                                       
  154.                                 }
  155.                                 while((i<50)&&(K1==0))         //检测按键是否松开
  156.                                 {
  157.                                         Delay10ms();
  158.                                         i++;
  159.                                 }
  160.                                 i=0;
  161.                         }
  162.                         if(K2==0)                //检测按键K2是否按下
  163.                         {
  164.                                 Delay10ms();        //消除抖动
  165.                                 if(K2==0)
  166.                                 {
  167.                                         TIME[SetPlace]++;
  168.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  169.                                         {
  170.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  171.                                         }
  172.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  173.                                         {
  174.                                                 TIME[SetPlace]=0;
  175.                                         }
  176.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  177.                                         {
  178.                                                 TIME[SetPlace]=0;
  179.                                         }
  180.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  181.                                         {
  182.                                                 TIME[SetPlace]=0;       
  183.                                         }
  184.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  185.                                         {
  186.                                                 TIME[SetPlace]=0;
  187. ……………………

  188. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
单片机实验2.zip (68.73 KB, 下载次数: 33)
回复

使用道具 举报

ID:102963 发表于 2018-3-1 10:10 | 显示全部楼层
内容太少,只有个程序,没有电路图,没有蓝牙部分介绍!做事情不够认真!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表