电子时钟.docx
- 文档编号:23363847
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:43
- 大小:22.36KB
电子时钟.docx
《电子时钟.docx》由会员分享,可在线阅读,更多相关《电子时钟.docx(43页珍藏版)》请在冰豆网上搜索。
电子时钟
sbita0=ACC^0;
sbita1=ACC^1;
sbita2=ACC^2;
sbita3=ACC^3;
sbita4=ACC^4;
sbita5=ACC^5;
sbita6=ACC^6;
sbita7=ACC^7;
sbitDQ=P3^3;//18B20接口
sbitspeaker=P3^6;//蜂鸣器
sbitMODE=P1^4;//模式键
sbitINC=P1^5;//增加键
sbitDEC=P1^6;//减少键
sbitOK=P1^7;//OK键
#defineLCD1602_DATAP0//8位数据并行口
#defineLCD1602_RSP2_0//指令OR数据寄存器选择
#defineLCD1602_RWP2_1//读写控制
#defineLCD1602_ENP2_2//使能控制
#defineLCD1602_CLR0x01//清屏
#defineLCD1602_MODE0x38//8位数据,双列显示,5*7字形
#defineLCD1602_ON0x0c//开显示,关光标,光标不闪烁
#defineLCD1602_ADDR_MODE0x06//地址递增
#defineDS1302_SCLKP1_0//1302时钟线
#defineDS1302_IOP1_1//1302数据线
#defineDS1302_RSTP1_2//1302复位线
volatileuint8datatimedata[7];//时间值
volatileuint8datadisplay_buffer1[16];//显示缓冲区1
volatileuint8datadisplay_buffer2[16];//显示缓冲区2
volatileuint8datatemdata[5];//存放温度值
volatileuint16datatdat;//温度值变量
volatileuint8datatflag;//温度正负值标志
volatileint8self_pos=0;//自定义三角形标志显示位置变量
volatileuint8OK_VALUE=0;//OK键键值变量
volatilebitbdataDIS_ON=1;//显示开关位1==on0==off
volatilebitbdataSCAN_ON=0;//按键扫描开关位,由定时器每20MS刷新
volatiledataMODE_ON=0;//模式键按下后显示菜单的开关位
volatiledataINC_VALUE=0;
volatiledataDEC_VALUE=0;
volatilebitbdataALARM_VALUE=0;//闹钟标志位
volatilebitbdataALARM_ON=1;//闹钟响时关闭标志位
volatileuint8dataread_1=1,read_2=1,read_3=1,read_4=1;
volatileuint8datastopwatch_count=0;
volatileuint8datastopwatch_second=0;
volatileuint8datastopwatch_minute=0;
volatilebitbdataSTOPWATCH_START=0;
uint8codeself_table1[]={
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年
0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,//日
0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志
0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10};//三角形符号
/**********************************************************
蜂鸣器
************************************************************/
voiddelay_ms(uint16count)//延时时间count*1ms
{uint16i;
for(;count>0;count--)
{
for(i=0;i<110;i++)
{
nop;
}
}
}
voidspeakers(uint8speak_count)
{
for(;speak_count>0;speak_count--)
{
speaker=0;
delay_ms
(1);
speaker=1;
delay_ms(3);
}
}
/***********************************************************
忙检测
************************************************************/
voidLCD1602_check_busy(void)
{
LCD1602_DATA=0xff;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_EN=1;
while(LCD1602_DATA&0x80);
LCD1602_EN=0;
}
/**********************************************************
写指令
************************************************************/
voidLCD1602_write_cmd(uint8cmd)
{
LCD1602_check_busy();
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DATA=cmd;
LCD1602_EN=1;
LCD1602_EN=0;
}
/***********************************************************
写数据
*************************************************************/
voidLCD1602_write_data(uint8dat)
{
LCD1602_check_busy();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DATA=dat;
LCD1602_EN=1;
LCD1602_EN=0;
}
/***********************************************************
1602初始化
************************************************************/
voidLCD1602_init(void)
{
uint8i;
LCD1602_write_cmd(0x40);//CGRAM起始地址
for(i=0;i<40;i++)
LCD1602_write_data(self_table1[i]);//写入自定义字符
LCD1602_write_cmd(LCD1602_MODE);
LCD1602_write_cmd(LCD1602_ON);
LCD1602_write_cmd(LCD1602_ADDR_MODE);
LCD1602_write_cmd(LCD1602_CLR);
}
/************************************************************
设置显示坐标
************************************************************/
voidLCD1602_set_postion(uint8x,uint8y)
{
if(y<2)
{
y&=0x01;//y值限定在0~1之间
x&=0x0f;//x值限定在0~15之间
if(y==0)
x|=0x40;//如果显示是在第二行,则x的值加0x40
x|=0x80;//获得x的值
LCD1602_write_cmd(x);//写入坐标值到LCD
}
}
/************************************************************
指定位置写字符
*************************************************************/
voidLCD1602_write_char(uint8x,uint8y,uint8chardata)
{
LCD1602_set_postion(x,y);
LCD1602_write_data(chardata);
}
/************************************************************
指定位置写字符串
*************************************************************/
voidLCD1602_write_string(uint8x,uint8y,uint8*string)
{
LCD1602_set_postion(x,y);
while((*string)!
='\0')
{
LCD1602_write_data(*string);
string++;
}
}
/***************************************************************
指定位置显示自定义字符
**************************************************************
uint8LCD1602_display_self(uint8count)
{
switch(count)
{
case0:
sele_count=0;break;
case1:
sele_count=1;break;
case2:
sele_count=2;break;
case3:
sele_count=3;break;
default:
break;
}
return(self_count);
}*/
/****************************************************************
底层驱动函数(输入)
*****************************************************************/
voidDS1302_input(uint8inputdata)
{
ACC=inputdata;
DS1302_IO=a0;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a1;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a2;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a3;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a4;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a5;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a6;DS1302_SCLK=1;DS1302_SCLK=0;
DS1302_IO=a7;DS1302_SCLK=1;DS1302_SCLK=0;
}
/****************************************************************
底层驱动函数(输出)控制位的第七位必须为1
*****************************************************************/
uint8DS1302_output(void)
{
DS1302_IO=1;
a0=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a1=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a2=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a3=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a4=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a5=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a6=DS1302_IO;
DS1302_SCLK=1;DS1302_SCLK=0;a7=DS1302_IO;
return(ACC);
}
/****************************************************************
底层驱动函数(指定地址写一个字节的数据)
*****************************************************************/
voidDS1302_write_byte(uint8cmd,uint8dat)
{
DS1302_SCLK=0;
DS1302_RST=0;
DS1302_RST=1;
DS1302_input(cmd);
DS1302_input(dat);
DS1302_RST=0;
DS1302_SCLK=1;
}
/****************************************************************
底层驱动函数(指定地址读取一字节的数据)
*****************************************************************/
uint8DS1302_read_byte(uint8cmd)
{
uint8receivedata=0;
DS1302_SCLK=0;
DS1302_RST=0;
DS1302_RST=1;
DS1302_input(cmd);
receivedata=DS1302_output();
DS1302_RST=0;
DS1302_SCLK=1;
return(receivedata);
}
/********************************************************
设置1302的初始时间
*********************************************************/
voidDS1302_init()
{
if(DS1302_read_byte(0xc9)!
=0xf0)
{
DS1302_write_byte(0x8e,0x00);//允许写操作
DS1302_write_byte(0xc8,0xf0);//写入初始化标志,系统上电后检测此标志,即此子函数只会在第一次初始化一次。
DS1302_write_byte(0x8c,0x08);//年
DS1302_write_byte(0x8a,0x05);//星期
DS1302_write_byte(0x88,0x09);//月
DS1302_write_byte(0x86,0x19);//日
DS1302_write_byte(0x84,0x12);//时
DS1302_write_byte(0x82,0x00);//分
DS1302_write_byte(0x80,0x00);//秒
DS1302_write_byte(0x90,0xa5);//充电
DS1302_write_byte(0x8e,0x80);//禁止写操作
}
}
/********************************************************
读取时间数据并放在timedata[]中
*********************************************************/
voidDS1302_read_time()
{
timedata[0]=DS1302_read_byte(0x8d);//年
timedata[1]=DS1302_read_byte(0x89);//月
timedata[2]=DS1302_read_byte(0x87);//日
timedata[3]=DS1302_read_byte(0x85);//时
timedata[4]=DS1302_read_byte(0x83);//分
timedata[5]=DS1302_read_byte(0x81);//秒
timedata[6]=DS1302_read_byte(0x8b);//星期
}
/***********************************************************
DS18B20相关函数
*************************************************************/
voiddelay_18b20(uint16sum)//短暂延时
{
while(sum--);
}
voidrst_18b20()//18B20复位
{//ucharflag;
DQ=1;
delay_18b20(8);
DQ=0;
delay_18b20(80);
DQ=1;
delay_18b20(13);
//flag=DQ;
//return(flag);
//delay_18b20(20);
}
voidwr_18b20(uint8dat)//写一个字节的数据
{
uint8i=8;
for(;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18b20(5);
DQ=1;
dat>>=1;
}
}
uint8rd_18b20()//读一个字节的内容
{
uint8dat=0,i=8;
for(;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18b20(4);
}
return(dat);
}
uint16rd_temperature()//读取温度值
{
uint8a=0,b=0;
uint16t=0;
floattt=0;
rst_18b20();//复位
wr_18b20(0xcc);//跳过ROM
wr_18b20(0x44);//启动温度转换
rst_18b20();//再次对18B20操作时,需要重新复位一次
wr_18b20(0xcc);//跳过ROM
wr_18b20(0xbe);//读取内部RAM的内容
a=rd_18b20();//读温度值低位(内部RAM的第0个字节)
b=rd_18b20();//读温度值高位(内部RAM的第1个字节)
t=b;
t<<=8;//温度值的高8位放在t的高8位
t=t|a;//温度值的低8位放在t的低8位
if(t<0x0fff)//判断温度值得正负值
tflag=0;//tflag=0温度值为正
else
{
t=~t+1;//温度值为负,负值以补码形式存放,这里要将其还原成原码
tflag=1;//tflag=1温度值为负
}
tt=t*0.0625;
t=tt*100;
return(t);
}
//***********************************************//
voidtem_conv()//温度转换
{
uint8flagdat;//定义温度值符号
if(tflag==0)
temdata[4]=flagdat=0x20;//温度为正不显示符号
else
temdata[4]=flagdat=0x2d;//负温度显示负号:
-
temdata[0]=tdat/1000+0x30;//温度十位
temdata[1]=tdat%1000/100+0x30;//温度个位
temdata[2]=tdat%100/10+0x30;//小数十位
temdata[3]=tdat%10+0x30;//小数百位
/*if(temdata[0]==0x30)
{temdata[0]=0x20;//?
?
?
?
?
0,?
?
?
if(temdat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 时钟