📄 080630.c
字号:
//*********************************************************************/*
/*DS12CR887高精度万年历 C51程序
编写:wsb
日期:2008-7-7
QQ:576515317
功能:电路采用DS12CR887高精度时钟芯片,用74HC595驱动15个码管
采用模拟串口的方式进行数据的发送。三个独立按键,一个功能
键,一个时间加,一个时间减,组成时间调整功能。
一个DS18B20数字温度传感器实现环境温度的读取。
能够显示的内容有年、月、日、时、分、秒、星期和温度。
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf};
uchar shi,fen,miao,nian,yue,ri,xq,s1num,tt;
uint temp;
bit flag;
//DS12CR887的四个位声明
sbit dscs=P2^5;
sbit dsas=P2^4;
sbit dswr=P2^3;
sbit dsds=P2^2;
sbit tempDS=P2^1; //DS18B20 I/0口定义
sbit s1=P3^0; //功能键
sbit s2=P3^1; //时间加
sbit s3=P3^2; //时间减
sbit rd=P3^7;
sbit SH_CP=P1^4; //移位寄存器时钟脉冲
sbit ST_CP=P1^5; //存储寄存器时钟脉冲输出锁存器控制
sbit d1=P1^3;//双二极管闪烁
sbit DS=P1^7; //串行数据输入
void delay(uint count) //延时子函数
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
/************************
函数名:dsreset()
功能 :DS18B20初始化复位
*************************/
void dsreset(void)
{
uint i;
tempDS=0;
i=103;
while(i>0)i--;
tempDS=1;
i=4;
while(i>0)i--;
}
/************************
函数名:tmpreadbit()
功能:从DS18B20里读一位
*************************/
bit tmpreadbit(void)
{
uint i;
bit dat;
tempDS=0;i++; //i++ for delay 小延时一下
tempDS=1;i++;i++;
dat=tempDS;
i=8;while(i>0)i--;
return (dat);
}
/************************
函数名:tmpread()
功能:从DS18B20里读一个字节
*************************/
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里
}
return(dat); //将一个字节数据返回
}
/************************
函数名:tmpwritebyte()
功能:写一个字节到DS18B20里
*************************/
void tmpwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1 写1部分
{
tempDS=0;
i++;i++;
tempDS=1;
i=8;while(i>0)i--;
}
else
{
tempDS=0; //write 0 写0部分
i=8;while(i>0)i--;
tempDS=1;
i++;i++;
}
}
}
/************************
函数名:tmpchange()
功能:给18B20发送温度转换命令
*************************/
void tmpchange(void)
{
dsreset(); //初始化DS18B20
delay(1); //延时
tmpwritebyte(0xcc); // 跳过序列号命令
tmpwritebyte(0x44); //开始转换
}
/************************
函数名:tmp()
功能:DS18B20获取温度
*************************/
void tmp()
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe); //发送读取数据命令
a=tmpread(); //连续读两个字节数据
b=tmpread();
temp=b;
temp=temp<<8;
temp=temp|a; //两字节合成一个整型变量。
tt=temp*0.0625; //得到真实十进制温度值
temp=tt*10+0.5;
}
////DS12CR887/////
////数据读取/////
uchar read_ds(uchar add)
{
uchar date;
//dscs=0;
dsas=1;
dsds=1;
dswr=1;
dscs=0;
P0=add;
dsas=0;
dsds=0;
P0=0xff;//读取P0口先给P0口全赋个一
date=P0;
dsds=1;
dsas=1;
dscs=1;
return date;
}
///DS12CR887数据写入/////
void write_ds(uchar add,uchar date)
{
//dscs=0;
dsas=1;
dsds=1;
dswr=1;
dscs=0;
P0=add;
dsas=0;
dswr=0;
P0=date;
dswr=1;
dsas=1;
dscs=1;
}
/************************
函数名:write_595byte()
功能:模拟串口给595送数据
*************************/
void write_595byte(uchar shi_s,uchar fen_s,uchar miao_s,nian_s,yue_s,ri_s,xq_s,temp_s)
{
uchar k,shi_ge,shi_shi,fen_ge,fen_shi,miao_ge,
miao_shi,nian_ge,nian_shi,yue_ge,yue_shi,
ri_ge,ri_shi,xq,temp_shi,temp_ge;
shi_ge=table[shi_s%10]; //先把所有数据进行分离
shi_shi=table[shi_s/10];
fen_ge=table[fen_s%10];
fen_shi=table[fen_s/10];
miao_ge=table[miao_s%10];
miao_shi=table[miao_s/10];
nian_ge=table[nian_s%10];
nian_shi=table[nian_s/10];
yue_ge=table[yue_s%10];
yue_shi=table[yue_s/10];
ri_ge=table[ri_s%10];
ri_shi=table[ri_s/10];
xq=table[xq_s];
temp_ge=table[temp_s%100/10];
temp_shi=table[temp_s/100];
for(k=0;k<8;k++)
{
SH_CP=0;
miao_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
miao_shi<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
fen_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
fen_shi<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
shi_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
shi_shi<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
ri_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
ri_shi<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
yue_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
yue_shi<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
nian_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
nian_shi<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
xq<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
for(k=0;k<8;k++)
{
SH_CP=0;
temp_ge<<=1; //将数据左移把最高位移入到了CY当中
DS=CY;
SH_CP=1; //上升沿发生移位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -