找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15单片机+1602+ds1302+18b20+串口源程序

[复制链接]
ID:650412 发表于 2020-11-4 20:44 | 显示全部楼层 |阅读模式
使用15单片机+1602+ds1302+18b20+串口。因为是15没有仿真图图,有pro的设计图,可以看一下。引脚的连线在子程序里有。

制作出来的实物图如下:
IMG_20201104_203641.jpg

Proteus画的电路图:
51hei.png

单片机源程序如下:
  1. #include "STC15.h"
  2. #include "LCD1602.h"
  3. #include "ds18b20.h"
  4. #include "ds1302.h"
  5. #include "delay.h"

  6. u16 dispbuf[]={0,0,0,0};                //存放温度值
  7. uchar CNCHAR[6] = "WenDu ";


  8. //函数声明
  9. void temp_dis();       //温度显示
  10. void LcdDisplay();     //时间显示
  11. void LCD1602xianshi();  //屏幕显示
  12. void GPIO();            //端口
  13. void Delay200us();      //延时
  14. void UartInit();          //串口

  15. void main()       //主函数
  16. {
  17.         GPIO();           //串口初始化
  18.         LCD_init();      //屏幕初始化
  19.         UartInit();
  20.         LCD1602xianshi();   //屏幕显示
  21.         while(1)
  22.         {
  23.                 temp_dis();             //显示温度
  24.                 Ds1302ReadTime();      //读取时间
  25.                 Delay200us();
  26.                 LcdDisplay();          //显示时间
  27.         }
  28. }


  29. //温度显示
  30. void temp_dis()
  31. {
  32.         u16 j;
  33.         u8 i;
  34.         j=ReadTemperature();
  35.         for(i=0; i<6; i++)
  36.         {
  37.                  SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器
  38.                 while (!TI);                                 //等待发送数据完成
  39.                 TI = 0;
  40.         }
  41.         if(j<0)
  42.         {
  43.                 dispbuf[0]= j/100;                        //十位
  44.                 dispbuf[1]= j%100/10;                //个位
  45.                 dispbuf[2]= j%100%10;                //取温度小数点1位
  46.                 LCD1602_char(2,3,'-');
  47.                 {SBUF='-';              //将接收到的数据放入到发送寄存器
  48.                 while(!TI);                                 
  49.                 TI=0;}        
  50.                 LCD1602_char(2,4,dispbuf[0]+'0');
  51.                 {SBUF = dispbuf[0]+'0';//将接收到的数据放入到发送寄存器
  52.            while (!TI);                                 
  53.            TI = 0;}
  54.                 LCD1602_char(2,5,dispbuf[1]+'0');
  55.                  {SBUF = dispbuf[1]+'0'; //将接收到的数据放入到发送寄存器
  56.            while (!TI);                              
  57.            TI = 0;}
  58.                 LCD1602_char(2,6,'.');
  59.                 {SBUF='.';              //将接收到的数据放入到发送寄存器
  60.                 while(!TI);                                 
  61.                 TI=0;}
  62.                 LCD1602_char(2,7,dispbuf[2]+'0');
  63.                 {SBUF = dispbuf[2]+'0';//将接收到的数据放入到发送寄存器
  64.            while (!TI);                                
  65.            TI = 0;}
  66.         }
  67.         else
  68.         {
  69.                 dispbuf[0]= j/100;                        //十位
  70.                 dispbuf[1]= j%100/10;                //个位
  71.                 dispbuf[2]= j%100%10;                //取温度小数点1位
  72.                 LCD1602_char(2,3,'+');
  73.                 {SBUF='+';              //将接收到的数据放入到发送寄存器
  74.                 while(!TI);                                 //等待发送数据完成
  75.                 TI=0;}
  76.                 LCD1602_char(2,4,dispbuf[0]+'0');
  77.                 {SBUF = dispbuf[0]+'0';//将接收到的数据放入到发送寄存器
  78.            while (!TI);                                 
  79.            TI = 0;}
  80.                 LCD1602_char(2,5,dispbuf[1]+'0');
  81.                  {SBUF = dispbuf[1]+'0'; //将接收到的数据放入到发送寄存器
  82.            while (!TI);                              
  83.            TI = 0;}
  84.                 LCD1602_char(2,6,'.');
  85.                 {SBUF='.';              //将接收到的数据放入到发送寄存器
  86.                 while(!TI);                                 //等待发送数据完成
  87.                 TI=0;}
  88.                 LCD1602_char(2,7,dispbuf[2]+'0');
  89.                 {SBUF = dispbuf[2]+'0';//将接收到的数据放入到发送寄存器
  90.            while (!TI);                                
  91.            TI = 0;}
  92.         }
  93. }

  94. //时间显示
  95. void LcdDisplay()
  96. {
  97.         LCD1602_char(1,3,'0'+TIME[6]/16);                        //年
  98.         LCD1602_char(1,4,'0'+(TIME[6]&0x0f));
  99.         LCD1602_char(1,5,'0'+TIME[4]/16);                        //月
  100.         LCD1602_char(1,6,'0'+(TIME[4]&0x0f));
  101.         LCD1602_char(1,7,'0'+TIME[3]/16);                        //日
  102.         LCD1602_char(1,8,'0'+(TIME[3]&0x0f));
  103.         
  104.         
  105.         LCD1602_char(1,10,'0'+TIME[2]/16);                                //时
  106.         LCD1602_char(1,11,'0'+(TIME[2]&0x0f));                                 
  107.         LCD1602_char(1,12,'0'+TIME[1]/16);                                //分
  108.         LCD1602_char(1,13,'0'+(TIME[1]&0x0f));        
  109.         LCD1602_char(1,15,'0'+TIME[0]/16);                                //秒
  110.         LCD1602_char(1,16,'0'+(TIME[0]&0x0f));
  111. }


  112. void LCD1602xianshi()      //1602屏幕显示
  113. {
  114.         LCD1602_string(2,1,"Tm");  
  115.   LCD1602_string(1,1,"20");
  116.   LCD1602_char(1,9,'-');
  117.         LCD1602_char(1,14,':');
  118.         Ds1302Init();
  119. }

  120. void GPIO()                   //串口初始化
  121. {
  122.         P0M0=0X00;P0M1=0X00;
  123.         P2M0=0X00;P2M1=0X00;
  124.         P3M0=0X00;P3M1=0X00;
  125.         P4M0=0X00;P4M1=0X00;
  126.         P5M0=0X00;P5M1=0X00;        
  127. }

  128. void Delay200us()                //@11.0592MHz   软件延时200微秒
  129. {
  130.         unsigned char i, j;

  131.         i = 3;
  132.         j = 35;
  133.         do
  134.         {
  135.                 while (--j);
  136.         } while (--i);
  137. }



  138. void UartInit(void)                //9600bps@11.0592MHz串口初始化
  139. {
  140.         PCON &= 0x7F;                //波特率不倍速
  141.         SCON = 0x50;                //8位数据,可变波特率
  142.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  143.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  144.         TMOD &= 0x0F;                //清除定时器1模式位
  145.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  146.         TL1 = 0xDC;                //设定定时初值
  147.         TH1 = 0xDC;                //设定定时器重装值
  148.         ET1 = 0;                //禁止定时器1中断
  149.         TR1 = 1;                //启动定时器1
  150. }
复制代码


1602 18b20 ds1302 串口.zip

141.08 KB, 下载次数: 27, 下载积分: 黑币 -5

电路设计图.zip

16.44 KB, 下载次数: 16, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

ID:102963 发表于 2020-11-5 07:21 | 显示全部楼层
STC15为什么没有仿真图呢?Proteus仿真里面有单片机STC15W4K32S4,8.9版本上可以用的!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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