求51单片机12864和ds1307时钟程序

求51单片机12864和ds1307时钟程序,第1张

#include <reg51.h>

#include <string.h>

#include "ds1302.h"

#include "menu.h"

#include "lcd12864.h"

#define uchar unsigned char

#define uint unsigned int

sbit led=P3^7

uchar temp,keyval

uchar usern=0   //用户序号

//struct mlist *nuser

uchar disdat[16]

void displaykey()

{

keyval=0xff

P1=0xfe

temp=P1

temp&=0xf0

if(temp!=0xf0)//判断是否有键盘按下,真 为有

{

delay(50)

temp=P1 

temp=temp&0xf0

if(temp!=0xf0)//判断是否有键盘按下,真 为有

{

temp=P1

switch (temp)

{

  case 0xee:keyval='0'break

  case 0xde:keyval='1'break

  case 0xbe:keyval='2'break

  case 0x7e:keyval='3'break

default: break

}

}

}

while((P1&0xf0) != 0xf0)

//判断第二行键盘

P1=0xfd

temp=P1

temp=temp&0xf0

if(temp!=0xf0)

{

delay(50)

temp=P1 

temp=temp&0xf0

if(temp!=0xf0)//判断是否有键盘按下,真早段缺 为有

{

temp=P1

switch (temp)

{

  case 0xed:keyval='4'break

  case 0xdd:keyval='5'break

  case 0xbd:keyval='6'break

  case 0x7d:keyval='7'break

default: break

}

}

}

while((P1&0xf0) != 0xf0)

//判断第三行键盘

P1=0xfb

temp=P1

temp=temp&0xf0

if(temp!=0xf0)

{

delay(50)

temp=P1 

temp=temp&0xf0

if(temp!=0xf0)//判断是否有键盘按下,真 为有

{

temp=P1

switch (temp)

{

  case 0xeb:keyval='8'break

  case 0xdb:keyval='9'break

  case 0xbb:keyval='a'break

  case 0x7b:keyval='b'燃拍break

default:break

}

}

}

while((P1&0xf0) != 0xf0)

//判断第四行键盘

P1=0xf7

temp=P1

temp=temp&0xf0

if(temp!=0xf0)

{

delay(50)

temp=P1 

temp=temp&0xf0

if(temp!=0xf0)//判断是否有键盘按下,真 为有

{

temp=P1

switch (temp)

{

  case 0xe7:keyval='c'break

    case 0xd7:keyval='d'break

case 0xb7:keyval='e'break

  case 0x77:keyval='f'break

default:break

}

}

}

while((P1&0xf0) != 0xf0)

}

void distime(void)

{

uchar *cal="年月日"陆辩

disdat[0]='2'

disdat[1]='0'

disdat[2]='0'+TIME[6]/16      //年

disdat[3]='0'+(TIME[6]&0x0f)

disdat[4]=cal[0]

disdat[5]=cal[1]

disdat[6]='0'+TIME[4]/16      //月

disdat[7]='0'+(TIME[4]&0x0f)

disdat[8]=cal[2]

disdat[9]=cal[3]

disdat[10]='0'+TIME[3]/16      //日

disdat[11]='0'+(TIME[3]&0x0f)

disdat[12]=cal[4]

disdat[13]=cal[5]

disdat[14]=0

displaystr(1,2,disdat)

disdat[0]='0'+TIME[2]/16      //时

disdat[1]='0'+(TIME[2]&0x0f)

disdat[2]=':'

disdat[3]='0'+TIME[1]/16      //分

disdat[4]='0'+(TIME[1]&0x0f)

disdat[5]=':'

disdat[6]='0'+TIME[0]/16      //秒

disdat[7]='0'+(TIME[0]&0x0f)

disdat[8]=0

displaystr(4,4,disdat)

}

void init_timer(void)

{

TMOD=0x20

TH1=0xfd

TL1=0xfd

TR1=1

SCON=0x40

}

main()

{

uchar num

InitLCD()//初始LCD  

Ds1302Init()

init_timer()

ClearScreen(0)

delay(200)

num=0

while(1)

{

Ds1302ReadTime()

distime()  

displaykey()

delay(200)

}

}

/******************************************************************************************************************************/

/* smally 2008.5.20 南阳师范学院*/

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit lcdrs=P2^7

sbit lcden=P2^6

sbit rtscl=P2^1

sbit rtsda=P2^2

sbit da_18b20=P2^0

uchar code table[]="0123456789"

uchar table1[8]

uchar convert_begin

uint t_click,tp

//*****************************************/

/如坦/1602 *** 作相关函数

//缺岁*****************************************/

void wait() //上电后延时 *** 作,等待各芯片准备好 //avoid error

{

uint i=60000

while(i>0)i--

}

void delay()// *** 作之间的时间间隔

{

uchar i=200

while(i>0)i--

}

void write_com(uchar com) //写命令到1602

{

lcdrs=0

P0=com

lcden=1

delay()

lcden=0

}

void write_dat(uchar dat) //写数据到1602

{

lcdrs=1

P0=dat

lcden=1

delay()

lcden=0

}

void init_1602()//初始渣扮桐化1602

{

lcden=0

write_com(0x01)delay()

write_com(0x80)delay()

write_com(0x38)delay()

write_com(0x0c)delay()

write_com(0x06)delay()

}

//**********************************************

//over

//**********************************************

//********************************************/

//ds1307相关 *** 作函数//传送与接收数据都是先高位

//********************************************/

void rt_delay() // *** 作延时,等待信号稳定

{

uchar i=10

while(i>0)i--

}

void init_1307() //初始化1307

{

rtscl = 1rt_delay()rtsda = 1rt_delay()

}

void start_1307() // 开始信号

{

rtsda = 1rtscl = 1rt_delay()rtsda = 0rt_delay()

}

void stop_1307() // 结束信号

{

rtsda = 0rtscl = 1rt_delay()rtsda = 1rt_delay()

}

void write_1307(uchar d ) //写1307

{

uchar i,jrtscl = 0

for(i = 0i <8i++)

{

rtsda = (d >>7)

rtscl = 1

rt_delay()

d = d <<1

rtscl = 0

}

rtsda = 1

rtscl = 1

while((rtsda == 1) &&(j <255))j++

rtscl=0

}

uchar read_1307(uchar b) //读1307

{

uchar d ,i

rtsda = 1rtscl = 0

for(i = 0i <8i++)

{

rtscl = 1

rt_delay()

d = d <<1

d = d | rtsda

rtscl=0

}

rtsda = b

rt_delay()

rtscl = 0

rtscl = 1

return d

}

read_8byte_1307()

{

uchar i

start_1307( )

write_1307( 0xd0 )

write_1307( 0x00 )

stop_1307( )

for(i = 0i <8i++)

{

start_1307()

write_1307(0xd1)

table1[i]=read_1307(1)

stop_1307()

}

}

//**********************************************

//over

//**********************************************

//**********************************************

//18b20 *** 作相关函数

//**********************************************

void reset_time_18b20() //延时640us

{

uint i

i=80

while(i>0)i--

}

void wrbyte(uchar b) //写一个字节

{

uchar i,j

bit btmp

for(j=1j<=8j++)

{

btmp=b&0x01

b=b>>1

if(btmp)

{

da_18b20=0

i++i++

da_18b20=1

i=40 //写1时,15us内拉高数据线,总时间时隙不低于60us

while(i>0)i--

}

else

{

da_18b20=0

i=40 //写0时,拉低至少60us

while(i>0)i--

da_18b20=1

}

}

}

bit rdbit()//读取18b20的一位

{

uchar i

uchar b

da_18b20=0

i++i++i++i++i++

da_18b20=1

i=10 //上升沿15us后读有效

while(i>0)i--

b=da_18b20

i=30

while(i>0)i--///总时间不低于60us

return(b)

}

uchar rdbyte() //读取18b20的一字节

{

uchar i,j,byte

for(i=1i<=8i++)

{

j=rdbit()

byte=(j<<7)|(byte>>1)

}

return(byte)

}

uchar init_18b20() //初始化18b20

{

uint j=0

da_18b20=0

reset_time_18b20()

da_18b20=1

while((da_18b20==1)&&(j<250))j++

if(da_18b20) return 0

else

{

while(!da_18b20)

return 1

}

}

void restore()

{

if(t_click==0)

{

if(init_18b20())

{

ET0=0

while(ET0) ////////// *** 作命令时关闭中断,以免影响时序

wrbyte(0xcc)//////////skip rom命令

wrbyte(0x44)//////////convert 命令

ET0=1 ////////// *** 作命令后再打开中断

convert_begin=1

}

}

}

void read_18b20()

{

uchar tplsb,tpmsb

if(t_click>100)

{

convert_begin=0t_click=0

if(init_18b20())

{

ET0=0

while(ET0) ////////// *** 作命令时关闭中断,以免影响时序

wrbyte(0xcc)//////////skip rom命令

wrbyte(0xbe)//////////读暂存器

tplsb=rdbyte()

tpmsb=rdbyte()

ET0=1 ////////// *** 作命令后再打开中断

tp=tpmsb*256+tplsb

}

}

}

//**********************************************

//over

//**********************************************

//**********************************************

//1602显示函数

//**********************************************

void display()

{

uint nian

write_com(0x80)delay()

write_dat('D')delay()write_dat('a')delay()

write_dat('t')delay()write_dat(':')delay()

//显示日期信息

nian=table1[7]/16*10+table1[7]%16

write_dat('2')delay()

write_dat(table[(table1[6]/100)])delay()

write_dat(table[(table1[6]%100/10)])delay()

write_dat(table[(table1[6]%10)])delay()

//间隔符号'-'

write_dat('-')delay()

//显示月份

write_dat(table[table1[5]/16%2])delay()

write_dat(table[table1[5]%16])delay()

//间隔符号'-'

write_dat('-')delay()

//显示日期

write_dat(table[table1[4]/16%4])delay()

write_dat(table[table1[4]%16])delay()

//星期

write_dat(' ')delay()

write_dat(table[table1[3]%16])delay()

//LCD第二行

write_com(0x80+0x40)delay()

write_dat('T')delay()write_dat('i')delay()

write_dat('m')delay()write_dat(':')delay()

//显示小时

write_dat(table[table1[2]/16%4])delay()

write_dat(table[table1[2]%16])delay()

//间隔符号'-'

write_dat('-')delay()

//显示分钟

write_dat(table[table1[1]/16%8])delay()

write_dat(table[table1[1]%16])delay()

//间隔符号'-'

write_dat('-')delay()

//显示秒

write_dat(table[table1[0]/16%8])delay()

write_dat(table[table1[0]%16])delay()

//显示温度

write_dat(' ')delay()

if((tp>>11)==0)

{write_dat('+')delay()

write_dat(table[(tp>>4)/10])delay()

write_dat(table[(tp>>4)%10])delay()

}

else

{write_dat('-')delay()

write_dat(table[((~(tp-1))>>4)/10])delay()

write_dat(table[((~(tp-1))>>4)%10])delay()

}

}

//**********************************************

//over

//**********************************************

//**********************************************

//main主函数

//**********************************************

void main()

{

TMOD=0x01

TH0=(65536-1000)/256

TL0=(65536-1000)%256 //定时器初始化

EA=1

ET0=1

TR0=1

wait()//上电前预热

init_1602()

init_1307()

if(init_18b20())

{

ET0=0

while(ET0) ////////// *** 作命令时关闭中断,以免影响时序

wrbyte(0xcc)//////////skip rom命令

wrbyte(0x4E)//////////写暂存器命令

wrbyte(0x01)//////////设置上限温度

wrbyte(0x00)//////////设置下限温度

wrbyte(0x1f)//////////设置分辨率TM/R1/R0/1/1/1/1/1

wrbyte(0x43)//////////复制暂存器

ET0=1 ////////// *** 作命令后再打开中断

}

start_1307()

write_1307(0xd0)

write_1307(0x00)

write_1307(0x00)

write_1307(0x59)

write_1307(0x12)

write_1307(0x05)

write_1307(0x03)

write_1307(0x07)

write_1307(0x09)

stop_1307()

while(1)

{

restore()

read_18b20()

read_8byte_1307()

display()

}

}

//****************************************************************

//over

//***************************************************************

//***************************************************************

//中断服务子程序

//***************************************************************

void time0() interrupt 1 using 1

{

TH0=(65536-1000)/256

TL0=(65536-1000)%256

if(convert_begin)t_click++

}

//****************************************************************

//over

//****************************************************************

//**********************************************that's alll*******************************************************************//


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12540765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存