基于VS2017和单片机 C#串口通信(时间、温度)

阅读: 评论:0

基于VS2017和单片机 C#串口通信(时间、温度)

基于VS2017和单片机 C#串口通信(时间、温度)

选用单片机芯片51单片机 AT89S52
函数功能:串口通信下位机程序,用来读取DS1302时钟和DS18B20温度数据,并发给上位机用于显示。
注意:代码里有DS1302调时和两种工作方式的代码,可根据需要更改,满足自己需求。(现在是:掉电后时钟继续走,每次上电都初始化时间)。
C#上位机程序见下个博客。

/*******************************************************************
函数功能:串口通信下位机程序,用来读取DS1302时钟和DS18B20温度数据,
并发给上位机用于显示。
作者:Crazy Wind      
日期:2020.12.11
version:1.0.0
日期:2020.12.01
version:1.1.0
*增加了液晶显示模块代码
********************************************************************/
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int/*****************************************************
函数功能:ms延时
******************************************************/
void delayms(uint ms) 
{uchar i,j;for(i=0;i<ms;i++){for(j=115;j>0;j--);}
}/*****************************************************
函数功能:微秒延时
入口参数:n
*****************************************************/ 
void delayus(uchar n)
{uchar i;for(i=0;i<n;i++);
}/************************************************************************/
/*****************************DS1302操作程序*****************************/
/************************************************************************/
sbit SCLK=P1^0;   //位定义1302芯片的接口,时钟输出端口定义在P1.0引脚
sbit DATA=P1^1;   //位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbit RST=P1^2;    //位定义1302芯片的接口,复位端口定义在P1.2引脚
uchar sec=0,min=13,hour=18,day=1,month=12,year=20,week=2;		//定义时间
/*****************************************************
函数功能:向1302写一个字节数据
入口参数:dat
*****************************************************/
void Write1302(uchar dat)
{uchar j; SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备delayus(2);        //稍微等待,使硬件做好准备for(j=0;j<8;j++)   //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302  低位在前,高位在后delayus(2);    //稍微等待,使硬件做好准备SCLK=1;        //!!上升沿!!写入数据delayus(2);    //稍微等待,使硬件做好准备SCLK=0;        //重新拉低SCLK,形成脉冲dat>>=1;       //将dat的各数据位右移1位,准备写入下一个数据位}	
}/*****************************************************
函数功能:向1302写命令和一个字节数据
入口参数:Cmd:命令  dat:数据
*****************************************************/
void WriteSet1302(uchar Cmd,uchar dat)
{	  RST=0;           //禁止数据传递SCLK=0;          //确保写数居前SCLK被拉低RST=1;           //启动数据传输delayus(2);      //稍微等待,使硬件做好准备Write1302(Cmd);  //写入命令字Write1302(dat);  //写数据SCLK=1;          //将时钟电平置于高电平状态RST=0;           //禁止数据传递
}/*****************************************************
函数功能:从1302读一个字节数据
*****************************************************/ 
uchar Read1302(void)
{uchar i,dat;delayus(2);        //稍微等待,使硬件做好准备for(i=0;i<8;i++)   //连续读8个二进制位数据{	 dat>>=1;if(DATA==1)   //如果读出的数据是1dat|=0x80;    //将1取出,写在dat的最高位SCLK=1;       //将SCLK置于高电平,为下降沿读出delayus(2);   //稍微等待SCLK=0;       //!!下降沿!!读出数据delayus(2);   //稍微等待}	 return dat;        //将读出的数据返回
}  /*****************************************************
函数功能:向1302写命令和从1302读一个字节数据
入口参数:Cmd:命令
*****************************************************/
uchar ReadSet1302(uchar Cmd)
{uchar dat;RST=0;               //拉低RSTSCLK=0;              //确保写数居前SCLK被拉低RST=1;               //启动数据传输Write1302(Cmd);      //写入命令字dat=Read1302();      //读出数据SCLK=1;              //将时钟电平置于已知状态RST=0;               //禁止数据传递return dat;          //将读出的数据返回
}/*****************************************************
函数功能:初始化DS1302
*****************************************************/
void Init_DS1302(void)
{/*******掉电后时钟继续走,只初始化一次时间*******//*uchar flag;flag=ReadSet1302(0x81);		//读秒寄存器,81Hif(flag&0x80)				//读出CH,判断时钟芯片是否关闭(CH=0时时钟开始运行){WriteSet1302(0x8E,0x00);                 	  //写寄存器命令,WP写入不保护指令(WP=0,允许写操作) WriteSet1302(0x80,((sec/10)<<4|(sec%10)));    //写秒寄存器命令,写入秒的初始值WriteSet1302(0x82,((min/10)<<4|(min%10)));    //写分寄存器命令,写入分的初始值WriteSet1302(0x84,((hour/10)<<4|(hour%10)));  //写时寄存器命令,写入时的初始值WriteSet1302(0x86,((day/10)<<4|(day%10)));    //写日寄存器命令,写入日的初始值WriteSet1302(0x88,((month/10)<<4|(month%10)));//写月寄存器命令,写入月的初始值WriteSet1302(0x8c,((year/10)<<4|(year%10)));  //写年寄存器命令,写入年的初始值WriteSet1302(0x8a,(week%10)); 				  //写星期寄存器命令,写入星期的初始值WriteSet1302(0x90,0xa5);                 	  //打开充电功能 选择2K电阻充电方式WriteSet1302(0x8E,0x80);			     	  //写寄存器命令,写入保护指令(WP=1,禁止写操作)}*//*******掉电后时钟继续走,每次上电都初始化时间*******/WriteSet1302(0x8E,0x00);                 	      //写寄存器命令,WP写入不保护指令(WP=0,允许写操作) WriteSet1302(0x80,((sec/10)<<4|(sec%10)));        //写秒寄存器命令,写入秒的初始值WriteSet1302(0x82,((min/10)<<4|(min%10)));        //写分寄存器命令,写入分的初始值WriteSet1302(0x84,((hour/10)<<4|(hour%10)));      //写时寄存器命令,写入时的初始值WriteSet1302(0x86,((day/10)<<4|(day%10)));        //写日寄存器命令,写入日的初始值WriteSet1302(0x88,((month/10)<<4|(month%10)));    //写月寄存器命令,写入月的初始值WriteSet1302(0x8c,((year/10

本文发布于:2024-02-03 01:38:18,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170689549447796.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:串口   单片机   温度   通信   时间
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23