查看: 762|回复: 0

MSP430单片机的OLED实时时钟制作 附源程序

[复制链接]

该用户从未签到

发表于 2020-11-18 17:27:25 | 显示全部楼层 |阅读模式
分享到:

在学习MSP430,将以前学习的常用模块移植过来,由于MSP430F149没有iic接口,自己模拟了一个,用到的模块为:DS1302、DS18B20、OLED(IIC接口)。可通过按键切换AD及温度显示(红外程序也包含其中,有兴趣的朋友可以稍微改一下就能实现红外控制)

制作出来的实物图如下:

6.jpg

  1. #define  main_c
  2. #include "msp430x14x.h"
  3. #include"main.h"
  4. #include"iic.h"
  5. #include"ds1302.h"
  6. #include "ds18b20.h"
  7. #include"adc12.h"
  8. #include "IrRed.h"
  9. #include"key.h"
  10. struct sTime BufTime;
  11. struct sTime SetBuf;
  12. uchar ddd=0x55;
  13. uchar Temp_TH=35,Temp_TL=25;
  14. void System_Init()
  15. {
  16.      uchar i;
  17.      BCSCTL1&=~XT2OFF; //打开XT2振荡器
  18.      do
  19.      {
  20.            IFG1&=~OFIFG;        //清除故障标志
  21.            for(i=0xff;i>0;i--); //延时
  22.      }while(IFG1&OFIFG);         //等待无故障
  23.      BCSCTL2|=SELM_2+SELS;       //主时钟及子系统时钟使用XT2
  24. }
  25. void TimeA_Init()
  26. {
  27.      TACTL|= TASSEL_1+ ID_3+ MC_1;    //时钟选择ACLK  8分频  增计数模式
  28.      CCTL0|= CCIE;                   //开中断
  29.      CCR0=103;                       //0.25s中断
  30. }
  31. void Get_Time()     //使用结构体    获取及显示
  32. {
  33.      static  uchar s=0;
  34.      Get_DS1302_Time(&BufTime);
  35.      OLED_ShowString(0, 2, "WEEK:",16);
  36.      OLED_ShowString(0, 0, "20",16);
  37.      OLED_ShowChar(33, 0, '-',16);
  38.      OLED_ShowChar(57, 0, '-',16);
  39.      OLED_ShowChar(78, 2,':',16);
  40.      OLED_ShowChar(102, 2,':',16);
  41.      if(ddd!=BufTime.sec)
  42.      {
  43.             OLED_DS1302_Num(17,0,BufTime.year,16);
  44.             OLED_DS1302_Num(41,0,BufTime.mon,16);
  45.             OLED_DS1302_Num(65,0,BufTime.day,16);
  46.             OLED_DS1302_Num(62,2,BufTime.hour,16);
  47.             OLED_DS1302_Num(86,2,BufTime.min,16);
  48.             OLED_DS1302_Num(110,2,BufTime.sec,16);
  49.             OLED_ShowChar(41,2,(BufTime.week&0x0f)+0x30,16);
  50.             OLED_ShowBattery(110,0,s);
  51.             s++;
  52.             if(s>4)s=0;
  53.             ddd=BufTime.sec;
  54.     }
  55. }
复制代码
  1. void DS1302_Time()
  2. {
  3.                   static uchar s=0;
  4.                   DS1302BurstRead(time); //得到数据
  5.                         if(psec != time[0])
  6.                         {
  7.                                 str[0] = '2';
  8.                                 str[1] = '0';
  9.                                 str[2] = (time[6] >> 4) + 0x30;
  10.                                 str[3] = (time[6] & 0x0F) + 0x30;
  11.                                 str[4] = '-';
  12.                                 str[5] = (time[4] >> 4) + 0x30;
  13.                                 str[6] = (time[4] & 0x0F) + 0x30;
  14.                                 str[7] = '-';
  15.                                 str[8] = (time[3] >> 4) + 0x30;
  16.                                 str[9] = (time[3] & 0x0F) + 0x30;
  17.                                 str[10] = '\0';
  18.                                 OLED_ShowString(0, 0, str,16);
  19.                         OLED_ShowBattery(110,0,s);
  20.                         s++;
  21.                         if(s>4)s=0;
  22.                                 str[0] = (time[5] & 0x0F) + 0x30;
  23.                                 str[1] = '\0';
  24.                                 OLED_ShowString(0, 2, "WEEK:",16);
  25.                                 OLED_ShowString(41, 2, str,16);

  26.                                 str[0] = (time[2] >> 4) + 0x30;
  27.                                 str[1] = (time[2] & 0x0F) + 0x30;
  28.                                 str[2] = ':';
  29.                                 str[3] = (time[1] >> 4) + 0x30;
  30.                                 str[4] = (time[1] & 0x0F) + 0x30;
  31.                                 str[5] = ':';
  32.                                 str[6] = (time[0] >> 4) + 0x30;
  33.                                 str[7] = (time[0] & 0x0F) + 0x30;
  34.                                 str[8] = '\0';
  35.                                 OLED_ShowString(62, 2, str,16);
  36.                                 psec = time[0];
  37.                         }
  38. }
复制代码
  1. void DS18b20_Temp()          //获取温度及oled显示
  2. {
  3.     uchar ack;
  4.     uchar num0,num1,num2;
  5.     int temp=0;
  6.     ack=GetTemp(&temp);
  7.     if(ack==0)
  8.     {
  9.         num1=temp>>4;
  10.         num2=temp&0x0f;
  11.         num0=num1/10+0x30;
  12.         num1=num1%10+0x30;
  13.         num2=num2%10+0x30;
  14.         OLED_ShowHz(0,5,2,16);
  15.         OLED_ShowChar(32,5,':',16);
  16.         OLED_ShowChar(40,5,num0,16);
  17.         OLED_ShowChar(48,5,num1,16);
  18.         OLED_ShowChar(56,5,'.',16);
  19.         OLED_ShowChar(64,5,num2,16);
  20.         OLED_ShowChar(72,5,' ',16);

  21.     }
  22.     else
  23.     {
  24.          OLED_ShowString(40,5,"ERROR",16);
  25.     }
  26.     DS_Start();
  27. }
  28. void AD_Oled()        //ad转换显示
  29. {
  30.     OLED_ShowString(16, 4, "AD1",16);
  31.     OLED_ShowString(78, 4, "AD2",16);
  32.     //OLED_ShowString(45, 4, "℃",16);
  33.     HexDec(10,6,average0,buffer0);
  34.     HexDec(72,6,average1,buffer1);
  35. }
  36. #pragma vector= TIMERA0_VECTOR
  37. __interrupt void  Time_A()
  38. {
  39.      //T250MSfg=1;
  40.      Key_Scan();
  41.      T25MSfg++;
  42.      if(T25MSfg>20)
  43.      {
  44.          T250MSfg=1;
  45.          flash++;
  46.          T25MSfg=0;
  47.      }
  48. }
复制代码
  1. #pragma vector =ADC12_VECTOR
  2. __interrupt void ADC_Get()
  3. {
  4.      static uchar index=0;
  5.      uchar i;
  6.      result0[index++]=ADC12MEM0;   //保存数据,中断标志清零
  7.      result1[index++]=ADC12MEM1;
  8.      if(index==NUM)
  9.      {
  10.          for(i=0;i<NUM;i++)
  11.          {
  12.             average0+=result0;
  13.             average1+=result1;
  14.          }
  15.          index=0;
  16.          average0>>=3;
  17.          average1>>=3;
  18.      }
  19. }
  20. #pragma vector =PORT1_VECTOR      //红外接收程序
  21. __interrupt void Ir_Get()
  22. {
  23.       if(P1IFG&BIT5)
  24.       {
  25.             switch(Ir_Num)
  26.             {
  27.             case 0:
  28.                     Ir_Num=1;
  29.                     Start_time();
  30.                     P1IFG&=~BIT5;
  31.                     break;
  32.             case 1:
  33.                     Stop_time();
  34.                     timer=TBR;
  35.                     Start_time();
  36.                     if(timer>13000)
  37.                     {
  38.                        Ir_Num=2;
  39.                        //P2OUT^=0x01;
  40.                     }
  41.                     else
  42.                     {
  43.                         Ir_Num=0;
  44.                     }
  45.                     P1IFG&=~BIT5;
  46.                     break;
  47.             case 2:
  48.                     Stop_time();
  49.                     timer=TBR;
  50.                     Start_time();
  51.                     if((timer>=800)&&(timer<=1500))
  52.                     {
  53.                         data=data<<1;
  54.                         count++;
  55.                     }
  56.                     else if((timer>=1600)&&(timer<=3000))
  57.                     {
  58.                         data=(data<<1)|0x0001;
  59.                         count++;
  60.                     }
  61.                     else
  62.                     {
  63.                         Ir_Num=0;
  64.                         count=0;
  65.                         data=0;
  66.                         P1IFG&=~BIT5;
  67.                         break;
  68.                     }
  69.                     if(count==32)
  70.                     {
  71.                         Ir_ok=1;
  72.                         Ir_Num=0;
  73.                         count=0;

  74.                         //P2OUT^=0x08;
  75.                     }
  76.                     P1IFG&=~BIT5;
  77.                     break;


  78.             default:
  79.                     Ir_Num=0;
  80.                     break;


  81.             }
  82.       }
  83. }
复制代码

基于MSP430的OLED实时时钟.zip (93.51 KB, 下载次数: 1)

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-22 03:28 , Processed in 0.108796 second(s), 16 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.