找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4467|回复: 5
打印 上一主题 下一主题
收起左侧

IAP15W4k58S4单片机DS1302在LCD1602显示

[复制链接]
跳转到指定楼层
楼主
ID:228755 发表于 2018-9-3 12:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IAP15W4k58S4 DS1302在LCD1602显示

单片机源程序如下:
  1. /************************************************************************************
  2. Copyright,  LCE STUDIO   
  3. 程序名称:1602显示屏测试程序   (晶振频率12MHz)
  4. 功能说明: 通过1602显示屏显示字符            
  5. 程序版本:1.0 (2015/06)
  6. ************************************************************************************/


  7. #include "stc15f2k60s2.h"            // 单片机STC15F2K60S2头文件,可以不再加入reg51.h
  8. #include <intrins.h>                            // 加入此头文件后,可使用_nop_库函数
  9. #include "delay.h"                        // 延时函数头文件
  10. #include "1602.h"                          // 1602显示屏驱动程序头文件
  11.                        
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14.        
  15. //DS1302引脚定义
  16. sbit RST=P0^0;
  17. sbit IO=P0^1;
  18. sbit SCK=P0^2;
  19. //DS1302地址定义
  20. #define ds1302_sec_add                        0x80                //秒数据地址
  21. #define ds1302_min_add                        0x82                //分数据地址
  22. #define ds1302_hr_add                        0x84                //时数据地址
  23. #define ds1302_date_add                        0x86                //日数据地址
  24. #define ds1302_month_add                0x88                //月数据地址
  25. #define ds1302_day_add                        0x8a                //星期数据地址
  26. #define ds1302_year_add                        0x8c                //年数据地址
  27. #define ds1302_control_add                0x8e                //控制数据地址
  28. #define ds1302_charger_add                0x90                                          
  29. #define ds1302_clkburst_add                0xbe
  30. /********************************************************************/
  31. uchar dis_time_buf[16]={0};
  32. uchar time_buf[8] = {0x20,0x18,0x09,0x02,0x18,0x52,0x00,0x07};//初始时间2010年6月1号23点59分55秒 星期二
  33. uint t;
  34. /*单字节写入一字节数据*/
  35. //DS1302初始化函数
  36. void ds1302_init(void)
  37. {
  38.         RST=0;                        //RST脚置低
  39.         SCK=0;                        //SCK脚置低
  40. }
  41. //向DS1302写入一字节数据
  42. void ds1302_write_byte(uchar addr, uchar d)
  43. {
  44.         uchar i;
  45.         RST=1;                                        //启动DS1302总线       
  46.         //写入目标地址:addr
  47.         addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读
  48.         for (i = 0; i < 8; i ++) {
  49.                 if (addr & 0x01) {
  50.                         IO=1;
  51.                         }
  52.                 else {
  53.                         IO=0;
  54.                         }
  55.                 SCK=1;      //产生时钟
  56.                 SCK=0;
  57.                 addr = addr >> 1;
  58.                 }       
  59.         //写入数据:d
  60.         for (i = 0; i < 8; i ++) {
  61.                 if (d & 0x01) {
  62.                         IO=1;
  63.                         }
  64.                 else {
  65.                         IO=0;
  66.                         }
  67.                 SCK=1;    //产生时钟
  68.                 SCK=0;
  69.                 d = d >> 1;
  70.                 }
  71.         RST=0;                //停止DS1302总线
  72. }

  73. //从DS1302读出一字节数据
  74. uchar ds1302_read_byte(uchar addr) {

  75.         uchar i,temp;       
  76.         RST=1;                                        //启动DS1302总线
  77.         //写入目标地址:addr
  78.         addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读
  79.         for (i = 0; i < 8; i ++) {
  80.                 if (addr & 0x01) {
  81.                         IO=1;
  82.                         }
  83.                 else {
  84.                         IO=0;
  85.                         }
  86.                 SCK=1;
  87.                 SCK=0;
  88.                 addr = addr >> 1;
  89.                 }       
  90.         //输出数据:temp
  91.         for (i = 0; i < 8; i ++) {
  92.                 temp = temp >> 1;
  93.                 if (IO) {
  94.                         temp |= 0x80;
  95.                         }
  96.                 else {
  97.                         temp &= 0x7F;
  98.                         }
  99.                 SCK=1;
  100.                 SCK=0;
  101.                 }       
  102.         RST=0;                                        //停止DS1302总线
  103.         return temp;
  104. }
  105. //向DS302写入时钟数据
  106. void ds1302_write_time(void)
  107. {
  108.         ds1302_write_byte(ds1302_control_add,0x00);                        //关闭写保护
  109.         ds1302_write_byte(ds1302_sec_add,0x80);                                //暂停时钟
  110.         //ds1302_write_byte(ds1302_charger_add,0xa9);            //涓流充电
  111.         ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
  112.         ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
  113.         ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
  114.         ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
  115.         ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
  116.         ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
  117.         ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
  118.         ds1302_write_byte(ds1302_control_add,0x80);                        //打开写保护     
  119. }
  120. //从DS302读出时钟数据
  121. void ds1302_read_time(void)  
  122. {
  123.         time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
  124.         time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
  125.         time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
  126.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //时
  127.         time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
  128.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
  129.         time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周        
  130. }
  131. void Display(void)
  132. {
  133.    
  134.    LCD_write_char(3,0,dis_time_buf[0]+'0');
  135.    
  136.    LCD_write_char(4,0,dis_time_buf[1]+'0');
  137.    
  138.    LCD_write_char(5,0,dis_time_buf[2]+'0');
  139.    
  140.    LCD_write_char(6,0,dis_time_buf[3]+'0');

  141.    LCD_write_char(7,0,'/');
  142.    
  143.    
  144.    LCD_write_char(8,0,dis_time_buf[4]+'0');
  145.    
  146.    LCD_write_char(9,0,dis_time_buf[5]+'0');

  147.    LCD_write_char(10,0,'/');

  148.    
  149.    LCD_write_char(11,0,dis_time_buf[6]+'0');
  150.    
  151.    LCD_write_char(12,0,dis_time_buf[7]+'0');
  152.    
  153.    
  154.    LCD_write_char(15,0,dis_time_buf[14]+'0');
  155.    //第2行显示  
  156.    
  157.    LCD_write_char(3,1,dis_time_buf[8]+'0');
  158.   
  159.    LCD_write_char(4,1,dis_time_buf[9]+'0');

  160.    LCD_write_char(5,1,':');

  161.   
  162.    LCD_write_char(6,1,dis_time_buf[10]+'0');
  163.    
  164.    LCD_write_char(7,1,dis_time_buf[11]+'0');

  165.    LCD_write_char(8,1,':');

  166.    
  167.    LCD_write_char(9,1,dis_time_buf[12]+'0');
  168.    
  169.    LCD_write_char(10,1,dis_time_buf[13]+'0');
  170. }

  171. void main(void)
  172. {
  173.        
  174.         P0M0=0X00;
  175.         P0M1=0X00;
  176.         P2M0=0X00;
  177.         P2M1=0X00;
  178.         P4M0=0X00;
  179.         P4M1=0X00;
  180.         P5M0=0X00;
  181.         P5M1=0X00;       
  182.         DelayMS(50);
  183.        
  184.         AUXR |= 0x80;                //定时器时钟1T模式
  185.         TMOD &= 0xF0;                //设置定时器模式
  186.         TL0 = 0x00;                        //设定定时器初值
  187.         TH0 = 0xDC;                        //设定定时器初值
  188.         EA  = 1;        //总中断打开
  189.         ET0 = 1;        //定时器0中断打开  
  190.         TF0 = 0;                                //清楚TF0标志
  191.         TR0 = 1;                                //定时器0开始计时
  192.        
  193.         lcd_init();
  194.         lcd_clear();
  195.         ds1302_init();
  196.         ds1302_write_time(); //写入初始值
  197.         while(1)
  198.         {
  199.                        
  200.                 Display();
  201.         }
  202. }
  203. void tm0_isr() interrupt 1           //中断入口
  204. {
  205.    
  206.    
  207.     TL0 = 0x00;                        //设定定时器初值
  208.         TH0 = 0xDC;                        //设定定时器初值
  209.   //每500us进行中断,输出取反,即1ms周期的方波
  210.           t++;
  211.          if(t==400)               //间隔200ms(50ms*4)读取一次时间
  212.   {

  213.    t=0;
  214.    ds1302_read_time();  //读取时间
  215.    dis_time_buf[0]=(time_buf[0]>>4); //年   
  216.    dis_time_buf[1]=(time_buf[0]&0x0f);
  217.    
  218. ……………………

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

所有资料51hei提供下载:
13. 1602显示屏测试 (12MHz).zip (591.93 KB, 下载次数: 48)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-9-3 17:41 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:228755 发表于 2018-9-4 10:18 | 只看该作者
admin 发表于 2018-9-3 17:41
补全原理图或者详细说明一下电路连接即可获得100+黑币

时钟芯片的RST引脚接单片机P0.0引脚,DAT接P0.1引脚,SCK接P0.2引脚,DAT有可能出现信号不稳的情况,可接上拉电阻,1602的RS接P5.5,RW接P5.4,EN接P5.3数据引脚接P4,可通过改变组织调整背光度

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:228755 发表于 2018-9-4 10:21 | 只看该作者

1602的RS引脚接P5.5,RW接P5.4,EN接P5.3,数据引脚接P4,可通过调整电阻调整背光度,DS1302模块的RST的引脚接P0^0;IO接P0^1;SCK接P0^2;IO引脚可根据具体情况选择上拉电阻

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:422925 发表于 2018-11-9 15:12 来自手机 | 只看该作者
用的单片机是iap15w4k58s4,LQFP48-JX吗
回复

使用道具 举报

6#
ID:422925 发表于 2018-11-9 15:13 来自手机 | 只看该作者
是实现数字时钟的程序吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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