*
void write_com(uchar com) { i =0; e=0; rs=0; rw=0; P0=com; delay_uint(3); e=1;
delay_uint(25); e=0;
}
******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无
***********************************************************************
void write_data(uchar dat) { i =0; e=0; rs=1; rw=0;
P0=dat;
delay_uint(3); e=1;
delay_uint(25); e=0;
}
******************************************************************** * 名称 : write_sfm2(uchar value; 返回读出来的数据
}
*************把要的时间 年月日 都读出来*************** void read_time() { miao = read_ds1302(read_add[0]); 读秒
fen = read_ds1302(read_add[1]); 读分
shi = read_ds1302(read_add[2]); 读时
ri = read_ds1302(read_add[3]); 读日
yue = read_ds1302(read_add[4]); 读月
nian = read_ds1302(read_add[5]);
读年
21
week = read_ds1302(read_add[6]); 读星期
}
*************把要写的时间 年月日 都写入ds1302里*************** void write_time() { write_ds1302(0x8e,0x00); 打开写保护
write_ds1302(write_add[0],miao); 写秒
write_ds1302(write_add[1],fen); 写分
write_ds1302(write_add[2],shi); 写时
write_ds1302(write_add[3],ri); 写日
write_ds1302(write_add[4],yue); 写月
write_ds1302(write_add[5],nian); 写星期
write_ds1302(write_add[6],week); 写年
write_ds1302(0x8e,0x80);
关闭写保护
}
*************把数据保存到ds1302 RAM中**0-31*************
void write_ds1302ram(uchar add,uchar dat) {
add <<= 1; 地址是从第二位开
始的
add &= 0xfe; 把最低位清零 是
写的命令
add |= 0xc0; 地址最高两位为 1 write_ds1302(0x8e,0x00); write_ds1302(add,dat); write_ds1302(0x8e,0x80);
}
*************把数据从ds1302 RAM读出来**0-31*************
uchar read_ds1302ram(uchar add) {
add <<= 1; 地址是从第二位开
始的
add |= 0x01; 把最高位置1 是读
命令 add |= 0xc0; 地址最高两位为 1 return(read_ds1302(add));
}
*************初始化ds1302时间***************
void init_ds1302() { uchar i;
rst = 0;
第一次读写数据时要把
IO品拿低 clk = 0; io = 0;
i = read_ds1302ram(30); if(i != 3) { i = 3;
write_ds1302ram(30,i);
write_ds1302(0x8e,0x00);
打开写保护 for(i=0;i<7;i++)
write_ds1302(write_add[i],init_
ds[i]); 把最高位值0 允许ds1302工作
write_ds1302(0x8e,0x80);
关写保护 }
write_sfm2(1,0,i);
}
void init_ds1302_io() {
rst = 0;
第一次读写数据时要把
IO品拿低 clk = 0;
io = 0;
}
*************定时器0初始化程序***************
void init_1602_ds1302() { write_sfm2_ds1302(2,3,nian);
write_sfm2_ds1302(2,6,yue); write_sfm2_ds1302(2,9,ri); write_sfm2_ds1302(1,11,shi); write_sfm2_ds1302(1,14,fen);
write_sfm2_ds1302(1,14,miao);
write_sfm1(1,14,week);
}
***********外部中断0初始化程序**************** void init_int0() {
EX0=1;
允许外部中断0
中断 EA=1; 开总中断
IT0 = 1;
外部中断0负跳
变中断 }
*************定时器0初始化程序*************** void time_init()
定时器0初始化
23
程序 { EA = 1; 开总中断
TMOD = 0X11;
定时器0、工作
方式1 ET0 = 1; 开定时器0中断 TR0 = 1;
允许定时器0定
时 ET1 = 1; 开定时器1中断 TR1 = 1;
允许定时器1定
时 }
***********
计
算
速
度
函
数
**************
void menu_dis() 计算速度函数 { static uchar value; if(menu_1 == 0) { if(flag_1s == 1) { flag_1s = 0;
if(flag_en == 0) { value ++;
if(value >= 3) 2秒 {
speed_km = 0; 速
度为0
shudu
=
(uint)speed_km;
value = 0;
} }
if((flag_en == 1)) { value = 0; flag_en = 0;
1s = 1 1000000us;
1ms=0.001km除以13600h=3.6km; 按键值
void key() 独立按键程序 {
static uchar key_new;
key_can
=
20;
按键值还原
P3
|=
0x78;
对应的按键IO口输出为1
if((P3 & 0x78) != 0x78)
按键
按下 {
delay_1ms(1); 按键
消抖动
if(((P3 & 0x78) != 0x78) &&
(key_new == 1))
{
确认
是按键按下
key_new = 0; switch(P3 & 0x78) {
case 0x70: key_can
{
menu_2 = 1;
write_string(1,0,\\
= 4; break; 得到按键值
case 0x68: key_can = 3; break; 得到按键值
case 0x58: key_can = 2; break; 得到按键值
case 0x38: key_can = 1; break; 得到按键值
}
write_sfm2(1,0,key_can);
显示按键值 }
} else
key_new = 1; }
**********************设置函数************************ void key_with() { if(key_can == 1) 设置键 { menu_1++;
if(menu_1 == 1) 设置时间
write_string(2,0,\
- \ }
if(menu_1 == 2) 设置报警速
度 {
menu_2 = 1;
write_string(1,0,\
2) 选择键 {
if(menu_1 == 1)
设置时
间
{ menu_2 ++; if(menu_2 > 7)
menu_2 = 1;
}
if(menu_1 == 2) 设置
{
menu_2 ++; if(menu_2 > 2)
menu_2 = 1;
}
25