#include<reg52.h>
#include "intrins.h" //包含 左移、右移及空指令
#define uchar unsigned char
#define uint unsigned int
sbit dsclk=P1^4; //1302时钟线
sbit dsio=P1^3; //1302数据线
sbit dsce=P1^2; //1302复位、片选线
//sbit gaobao=P1^0;
//sbit xiaxian=P1^1;
sbit led1=P1^0;
sbit led2=P1^1;
//sbit jdq=P1^0;
sbit beep=P1^5;
sbit s1=P3^0; //设置
sbit s2=P3^1; //向上
sbit s3=P3^2; //向下
sbit s4=P3^3; //确定
sbit s5=P1^6; //停止j2
sbit dq=P2^0; //18B20
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit rs=P2^4; //1602寄存选择,1数据0指令
sbit rw=P2^5; //1602读写线,1读,0写
sbit en=P2^6; //1602使能端,下降沿使能
float tt; //温度带小数变量
bit zf=0; //温度正负标志
bit dw; //温控标志
bit flag5=0;
uchar s1num,year,month,day,week;//s1按下次数,年月日天星期
uchar sec,min,hour; //秒分时
uchar t0num; //T0中断次数
uchar year1602,month1602,day1602,hour1602,min1602,sec1602;
uchar yc,mc,dc,hc,fc,sc; //年月日时分秒定时参数
uchar who,wmo,wso,whc,wmc,wsc; //时分秒周循环定时参数
bit w1,w2,w3,w4,w5,w6,w7; //周循环定时参数
char ontemp,offtemp;//温度设定参数
void gbtz(uchar date);
void stoptime();
void key1scan(); //选择模式 按键1
void timeset(); //关于1302
void twobcd(); //时间转换
void timemode(); //温度上下限设置
void tempmode(); //温度上下限控制
void addkey(uchar addnum); //加1
void deckey(uchar decnum); //减1
void initime(); //初始化时间为10-12-31
void read1302ram();
void temptest();
uchar weeknum(uchar y,uchar m,uchar d);
void delay(uint z)//1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //写1602指令
{
rs=0; //选择指令寄存器
rw=0; //写
P0=com; //传指令到单片机P0口
delay(5);
en=1; //使能端高脉冲
delay(5);
en=0; //下降沿写指令到1602
}
void write_date(uchar date)//写1602数据
{
rs=1; //选择数据寄存器
rw=0; //写
P0=date; //传指令到P0口
delay(5);
en=1; //使能端高脉冲
delay(5);
en=0; //使能端下降沿写数据到时1602
}
uchar read1602_date(uchar add)
{
uchar zhi;
write_com(add);
rs=1;
rw=1;
en=1;
delay(5);
zhi=P0;
delay(5);
en=0;
return zhi;
}
void ini1602()//初始化1602
{
write_com(0x38);//设置16*2显示,5*7点阵,8位数据口
write_com(0x0c);//开显示,不显示光标,光标不闪烁
write_com(0x06);//读写字符后地址指针加1,光标加1
write_com(0x01);//数据指针清0,显示清0
}
void write1302_byte(uchar add,uchar date)
{ //1302指定地址写数据
uchar i;
dsce=0;
dsclk=0;
dsce=1;
ACC=add;
for(i=8;i>0;i--)
{
dsio=ACC0; //sbit
dsclk=1;
dsclk=0;
ACC=ACC>>1;
}
ACC=date;
for(i=8;i>0;i--)
{
dsio=ACC0; //sbit
dsclk=1;
dsclk=0;
ACC=ACC>>1;
}
dsclk=1;
dsce=0;
}
uchar read1302_byte(uchar add)
{ //1302指定地址读数据
uchar i;
dsce=0;
dsclk=0;
dsce=1;
ACC=add;
for(i=8;i>0;i--)
{
dsio=ACC0; //sbit
dsclk=1;
dsclk=0;
ACC=ACC>>1;
}
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=dsio;
dsclk=1;
dsclk=0;
}
dsclk=1;
dsce=0;
return(ACC);
}
void lock_1302(uchar t)//1302写保护
{
if(t==1)
write1302_byte(0x8e,0x80);//开写保护
if(t==0)
write1302_byte(0x8e,0x7f);//去写保护
}
void initime() //初始化时间10-12-31 23:59 周5
{ //长按s4才启动
lock_1302(0); //去写保护
write1302_byte(0x80,0x55); //sec
write1302_byte(0x82,0x59); //min
write1302_byte(0x84,0x23); //hour
write1302_byte(0x86,0x31); //day
write1302_byte(0x88,0x12); //month
write1302_byte(0x8a,0x04); //week
write1302_byte(0x8c,0x10); //year
write1302_byte(0xc0,0); //ontemp
write1302_byte(0xc2,0); //offtemp
write1302_byte(0xc4,0); //yc
write1302_byte(0xc6,0); //mc
write1302_byte(0xc8,0); //dc
write1302_byte(0xca,0); //hc
write1302_byte(0xcc,0); //fc
write1302_byte(0xce,0); //sc
write1302_byte(0xd0,0); //w1
write1302_byte(0xd2,0); //w2
write1302_byte(0xd4,0); //w3
write1302_byte(0xd6,0); //w4
write1302_byte(0xd8,0); //w5
write1302_byte(0xda,0); //w6
write1302_byte(0xdc,0); //w7
write1302_byte(0xe0,0); //who
write1302_byte(0xe2,0); //wmo
write1302_byte(0xe4,0); //wso
write1302_byte(0xe6,0); //whc
write1302_byte(0xe8,0); //wmc
write1302_byte(0xea,0); //wsc
write1302_byte(0xec,0); //dw,温控标志
lock_1302(1); //开写保护
}
void gettime()
{
year=read1302_byte(0x8d); //1302读时间
week=read1302_byte(0x8b);
month=read1302_byte(0x89);
day=read1302_byte(0x87);
hour=read1302_byte(0x85);
min=read1302_byte(0x83);
sec=read1302_byte(0x81);
}
void disptime()
{
uchar shi,ge; //BCD 十位个位
gettime();
write_com(0x80+3); //1602首行
write_date('2'); //写一个字符
write_date('0');
shi=((year>>4)&0x0f);
ge=(year&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date('-');
shi=((month>>4)&0x01);
ge=(month&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date('-');
shi=((day>>4)&0x03);
ge=(day&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_com(0x80+0x40); //第二行
shi=((hour>>4)&0x03);
ge=(hour&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date(':');
shi=((min>>4)&0x07);
ge=(min&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date(':');
shi=((sec>>4)&0x07);
ge=(sec&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
}
void t0() interrupt 1 //定时器0中断入口函数
{
TH0=(65536-50000)/256;// T0定时器初值
TL0=(65536-50000)%256;//
if(s4==0)
{
t0num++;
if(t0num>100)//修改此参数更改长按s4初始化1302时间
{
t0num=0;
TR0=0; //T0停止
while(s4==0);
initime(); //初始化1302
}
}
else TR0=0; //T0停止
}
void init0()
{
TMOD=0X01; //T0,方式1 ,16位定时器
TH0=(65536-50000)/256;//50MS T0定时器初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //T0 暂停
}
void delay1(uchar count) //微秒级及延时
{
while(count>0) count--;
}
void reset(void) //初始化1820
{
dq=0;
delay1(100);
dq=1;
delay1(200);
}
bit read_bit(void) //1820读1位
{
bit temp;
dq=0;
_nop_();
dq=1;
_nop_();
temp=dq;
delay1(200);
return temp;
}
uchar read1820_byte(void) //1820读1字节
{
uchar i,byte=0;
bit j;
for(i=0;i<8;i++)
{
byte=_cror_(byte ,1);//byte=byte>>1;
j=read_bit(); //读1位
if(j==0) byte=byte|0x00;
else byte=byte|0x80;//从高位开始写入byte
}
return byte;
}
void write1820_byte(uchar command) //1820写1字节
{
uchar i;
for(i=0;i<8;i++)
{
if((command & 0x01)==0) //command最低位为0
{
dq=0;
delay1(8); //写0
dq=1;
_nop_();
}
else
{
dq=0;
_nop_();
dq=1;
delay1(8);//写1
}
command=_cror_(command,1); //command=command>>1 移除最低1位
}
}
void tmpchange(void) // begin change
{
reset(); //1820初始化
write1820_byte(0xcc); //跳过检测1820 ROM 直接操作1820 RAM
write1820_byte(0x44); //启动1820进行温度转换
}
uint tmp() //读取温度
{
uint temp; //温度整数变量,16位
float tt;//带小数温度
uchar a,b;//温度低位、高位
reset();
write1820_byte(0xcc); //跳过检测1820 ROM 直接操作1820 RAM
write1820_byte(0xbe); //读取温度寄存器的温度值
a=read1820_byte();//读低八位
b=read1820_byte();//读高八位
temp=b;
temp<<=8; //注意temp为16位整形
temp=temp|a; //合并高低位
if(temp>>11!=0) //判断是否是负数 if(b>(b&0x7f))
{
zf=1;
temp=~temp;//补码取反加1 转换为原码
temp=temp+1;
}
else zf=0;
tt=temp*0.0625;//tt最小单位0.0625度
temp=tt*10+0.5;//十分位变个位,舍掉百分位,转为整型
return temp;
}
void display_temp()
{
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源内容概要: 这是基于51单片机的时钟温度显示设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(excel表格打开)。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
106、基于51单片机时钟温度显示电路图及proteus仿真及程序.rar (37个子文件)
106、基于51单片机时钟温度显示电路图及proteus仿真及程序
proteus仿真
time.DSN 106KB
time.PWI 1KB
Last Loaded time.DBK 106KB
程序代码
time 52KB
time_Uv2.Bak 2KB
程序 53KB
time.plg 190B
程序.M51 64KB
time.opt.bak 1021B
time.uvopt 55KB
程序_Uv2.Bak 0B
time.OBJ 61KB
程序.hex 14KB
time.LST 61KB
程序.Uv2 2KB
程序.plg 198B
程序.Opt 976B
time_uvopt.bak 55KB
time_Opt.Bak 1013B
time.lnp 40B
程序_Opt.Bak 971B
time.c 23KB
time.M51 63KB
程序.lnp 40B
time.uvproj 13KB
time.Uv2.bak 2KB
PCB电路图
PCB1.PcbDoc 5.41MB
__Previews
PCB1.PcbDocPreview 42KB
Sheet1.SchDocPreview 65KB
PCB_Project1.PrjPCBStructure 48B
History
Sheet1.SchDoc 161KB
PCB_Project1.PrjPCB 50KB
PCB1.PcbDoc.htm 6KB
PCB1 PCB ECO 2010-8-22 21-29-35.LOG 6KB
PCB_Project1.OutJob 3KB
PCB1.pcbdoc_viewstate 2KB
Sheet1.pdf 232KB
共 37 条
- 1
资源评论
>行者<
- 粉丝: 205
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功