#include<reg52.h>
#include"DS18B20.H"
#include"DS1302.H"
#include"LCD1602.H"
#define uchar unsigned char
#define uint unsigned int
#define Cir_dat 50 //周长(单位:cm)
sbit KEY_TIM_SET=P3^3; //时间设置按键
sbit KEY_Hlim_SET=P3^4; //定时时间设置按键
sbit KEY_ADD=P3^5; //时间设置加
sbit KEY_MIN=P3^6; //时间设置减
sbit KEY_LOOK=P3^7; //查看总路程按键
sbit LED1=P1^3;
sbit LED2=P1^4;
sbit BEEP=P1^5;
uchar SET_TIM_FLAG=0; //时间设置标志位
bit SET_Hlim_FLAG=0; //速度上限设置标志位
bit Again_flag=1; //更新时间标志位
bit Updat_flag=0;
bit Look_flag=0;
uchar Tim_red_tab[6]={0}; //记录年月日时分秒和系统状态信息
uchar Speed_lim=80;
uint EX_Time=0;
uint R_dat=0;
uchar Speed_dat=0;
uint SpeedM=0;
uint Dis_dat=0; //路程数据 (单位0.1Km)
uchar time_num1=0;
/************************************
延时子程序
延时时间(xms*1)ms
*************************************/
void delayms(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void KEYSCAN()
{
uchar i=0;
if(!KEY_TIM_SET&&SET_Hlim_FLAG==0)
{
delayms(10);
if(!KEY_TIM_SET)
{
SET_TIM_FLAG++;
if(SET_TIM_FLAG>5)
{
SET_TIM_FLAG=0;
Again_flag=1;
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止写保护
WRITE_DS1302(WRITE_DS1302_YEAR,Tim_red_tab[0]); //年
WRITE_DS1302(WRITE_DS1302_MONTH,Tim_red_tab[1]); //月
WRITE_DS1302(WRITE_DS1302_DAY,Tim_red_tab[2]); //日
WRITE_DS1302(WRITE_DS1302_HOUR,Tim_red_tab[3]); //时
WRITE_DS1302(WRITE_DS1302_MINUTE,Tim_red_tab[4]); //分
WRITE_DS1302(WRITE_DS1302_SECOND,0); //秒
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护
}
while(!KEY_TIM_SET);
}
}
else if(!KEY_Hlim_SET&&SET_TIM_FLAG==0)
{
delayms(10);
if(!KEY_Hlim_SET)
{
if(SET_Hlim_FLAG==0)
{
SET_Hlim_FLAG=1;
}
else
{
SET_Hlim_FLAG=0;
}
}
}
else if(!KEY_ADD)
{
delayms(10);
if(!KEY_ADD)
{
switch(SET_TIM_FLAG)
{
case 0:
if(SET_Hlim_FLAG)
{
if(Speed_lim<99)
Speed_lim++;
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止写保护
WRITE_DS1302(WRITE_DS1302_Timing_Hour1,Speed_lim);
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护
}
break;
case 1:
Tim_red_tab[0]++;
if(Tim_red_tab[0]>99)
Tim_red_tab[0]=0;
break;
case 2:
Tim_red_tab[1]++;
if(Tim_red_tab[1]>12)
Tim_red_tab[1]=1;
break;
case 3:
Tim_red_tab[2]++;
if(Tim_red_tab[2]>31)
Tim_red_tab[2]=1;
break;
case 4:
Tim_red_tab[3]++;
if(Tim_red_tab[3]>23)
Tim_red_tab[3]=0;
break;
case 5:
Tim_red_tab[4]++;
if(Tim_red_tab[4]>59)
Tim_red_tab[4]=0;
break;
default: break;
}
while(!KEY_ADD);
}
}
else if(!KEY_MIN)
{
delayms(10);
if(!KEY_MIN)
{
switch(SET_TIM_FLAG)
{
case 0:
if(SET_Hlim_FLAG)
{
if(Speed_lim>0)
Speed_lim--;
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止写保护
WRITE_DS1302(WRITE_DS1302_Timing_Hour1,Speed_lim);
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护
}
else if(Look_flag)
{
Dis_dat=0;
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止写保护
WRITE_DS1302(WRITE_DS1302_Timing_Hour2,Dis_dat/256);
WRITE_DS1302(WRITE_DS1302_Timing_Min2,Dis_dat%256);
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护
WRITE_LCD1602_COM(0x80+0x40+8);
if(Dis_dat/10000>0)
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat/10000]);
else
WRITE_LCD1602_DAT(' ');
if(Dis_dat/1000>0)
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%10000/1000]);
else
WRITE_LCD1602_DAT(' ');
if(Dis_dat/100>0)
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%1000/100]);
else
WRITE_LCD1602_DAT(' ');
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%100/10]);
WRITE_LCD1602_DAT('.');
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%10]);
WRITE_LCD1602_DAT('K');
WRITE_LCD1602_DAT('m');
}
break;
case 1:
if(Tim_red_tab[0]==0)
Tim_red_tab[0]=100;
Tim_red_tab[0]--;
break;
case 2:
if(Tim_red_tab[1]==1)
Tim_red_tab[1]=13;
Tim_red_tab[1]--;
break;
case 3:
if(Tim_red_tab[2]==1)
Tim_red_tab[2]=32;
Tim_red_tab[2]--;
break;
case 4:
if(Tim_red_tab[3]==0)
Tim_red_tab[3]=24;
Tim_red_tab[3]--;
break;
case 5:
if(Tim_red_tab[4]==0)
Tim_red_tab[4]=60;
Tim_red_tab[4]--;
break;
default: break;
}
while(!KEY_MIN);
}
}
else if(!KEY_LOOK&&SET_TIM_FLAG==0&&SET_Hlim_FLAG==0)
{
delayms(10);
if(!KEY_LOOK)
{
Look_flag=~Look_flag;
if(Look_flag)
{
WRITE_LCD1602_COM(0x80);
for(i=0;i<16;i++)
WRITE_LCD1602_DAT(DIS_SET_TIM[i]);
WRITE_LCD1602_COM(0x80+0x40);
for(i=0;i<16;i++)
WRITE_LCD1602_DAT(DIS_THE_TIM[i]);
WRITE_LCD1602_COM(0x80+0x40+8);
if(Dis_dat/10000>0)
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat/10000]);
else
WRITE_LCD1602_DAT(' ');
if(Dis_dat/1000>0)
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%10000/1000]);
else
WRITE_LCD1602_DAT(' ');
if(Dis_dat/100>0)
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%1000/100]);
else
WRITE_LCD1602_DAT(' ');
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%100/10]);
WRITE_LCD1602_DAT('.');
WRITE_LCD1602_DAT(LCD1602_Table[Dis_dat%10]);
WRITE_LCD1602_DAT('K');
WRITE_LCD1602_DAT('m');
}
else
{
init_1602();
Again_flag=1;
}
while(!KEY_LOOK);
}
}
}
void Main_Display()
{
static uchar Year=0,Month=0,Day=0,Hour=0,Min=0,Sec=0;
static uchar i;
i++;
if(i>10)
i=0;
if(Again_flag)
{
Again_flag=0;
Year=0;Month=0;Day=0;Hour=0;Min=0;Sec=0;
}
if(SET_TIM_FLAG==0)
{
Tim_red_tab[0]=READ_DS1302(READ_DS1302_YEAR);
Tim_red_tab[1]=READ_DS1302(READ_DS1302_MONTH);
Tim_red_tab[2]=READ_DS1302(READ_DS1302_DAY);
Tim_red_tab[3]=READ_DS1302(READ_DS1302_HOUR);
Tim_red_tab[4]=READ_DS1302(READ_DS1302_MINUTE);
Tim_red_tab[5]=READ_DS1302(READ_DS1302_SECOND);
if(Year!=Tim_red_tab[0])
{
Year=Tim_red_tab[0];
WRITE_LCD1602_COM(0x80+2); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]/10]); //年
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]%10]); //年
}
if(Month!=Tim_red_tab[1])
{
Month=Tim_red_tab[1];
WRITE_LCD1602_COM(0x80+5); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]/10]); //月
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]%10]); //月
}
if(Day!=Tim_red_tab[2])
{
Day=Tim_red_tab[2];
WRITE_LCD1602_COM(0x80+8); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]/10]); //日
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]%10]); //日
}
if(Hour!=Tim_red_tab[3])
{
Hour=Tim_red_tab[3];
WRITE_LCD1602_COM(0x80+11); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[3]/10]); //时
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[3]%10]); //时
}
if(Min!=Tim_red_tab[4])
{
Min=Tim_red_tab[4];
WRITE_LCD1602_COM(0x80+14); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]/10]); //分
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]%10]); //分
}
WRITE_LCD1602_COM(0x80+13); //指定显示字�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源内容概要: 这是基于51单片机的自行车测速里程记忆1602液晶显示设计,包含了 C语言程序源代码(keil软件打开) 。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
13、51单片机自行车测速里程记忆1602液晶显示.rar (15个子文件)
13、51单片机自行车测速里程记忆1602液晶显示
MAIN 35KB
MAIN.hex 11KB
DS1302.H 6KB
MAIN.uvproj 13KB
MAIN.uvopt 66KB
MAIN.LST 28KB
MAIN_uvopt.bak 66KB
DS18B20.H 3KB
MAIN.C 12KB
MAIN_uvproj.bak 0B
MAIN.plg 534B
LCD1602.H 1007B
MAIN.lnp 40B
MAIN.M51 37KB
MAIN.OBJ 41KB
共 15 条
- 1
资源评论
>行者<
- 粉丝: 253
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功