【完整版】自行车简易数字里程表设计毕业论文设计 下载本文

*

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