附录1 电路原理图
第21页
附录2 程序清单
#include
#define uchar unsigned char #define uint unsigned int
#define DataPort P0 //LCD1602数据端口
sbit SCL=P1^5; //IIC时钟引脚定义; sbit SDA=P1^4; //IIC数据引脚定义 uchar code table_num[]=\
/* *********** LCD1602设置 *************/
sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit e =P1^2; //片选信号 下降沿触发 /* ***********清零按键设置 ********/ sbit key1 = P1^6; sbit key2 = P1^7; sbit key3 = P1^3;
#define SlaveAddress 0xA6 /*定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A*/ long bushu,zong; //步数
uchar BUF[8]; //接收数据缓存区 uchar ge,shi,bai,qian,wan; //显示变量 int dis_data; //变量 int c; int s;
int h=30.5;
void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据 #define RdCommand 0x01 //定义ISP的操作命令 #define PrgCommand 0x02 #define EraseCommand 0x03 #define Error 1 #define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间 sfr ISP_DATA=0xe2; //寄存器申明 sfr ISP_ADDRH=0xe3; sfr ISP_ADDRL=0xe4; sfr ISP_CMD=0xe5; sfr ISP_TRIG=0xe6; sfr ISP_CONTR=0xe7; uchar a_a;
/**************打开 ISP,IAP 功能 ********* */ void ISP_IAP_enable(void) {
第22页
EA = 0; //关中断 ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000 ISP_CONTR = ISP_CONTR | WaitTime; // 写入硬件延时 ISP_CONTR = ISP_CONTR | 0x80; // ISPEN=1 }
/************** 关闭 ISP,IAP 功能 *************** */ void ISP_IAP_disable(void) { ISP_CONTR = ISP_CONTR & 0x7f; // ISPEN = 0 ISP_TRIG = 0x00; EA = 1; // 开中断 }
/*****************公用的触发代码********* */ void ISPgoon(void) { ISP_IAP_enable(); //打开 ISP,IAP 功能 ISP_TRIG = 0x46; //触发ISP_IAP命令字节1 ISP_TRIG = 0xb9; //触发ISP_IAP命令字节2 _nop_(); }
/**********字节读 *********** */
unsigned char byte_read(unsigned int byte_addr) { EA = 0; ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 地址赋值 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; //清除低3位 ISP_CMD = ISP_CMD | RdCommand; // 写入读命令 ISPgoon(); //触发执行 ISP_IAP_disable // 关闭ISP,IAP功能 EA = 1; return (ISP_DATA); // 返回读到的数据 }
/************ 扇区擦除*********** */ void SectorErase(unsigned int sector_addr) { unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); // 取扇区地址 ISP_ADDRH = (unsigned char)(iSectorAddr >> 8); ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; //清空低3位 ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3 ISPgoon(); //触发执行 ISP_IAP_disable(); //关闭ISP,IAP功能 }
第23页
/********** 字节写 ******* */
void byte_write(unsigned int byte_addr, unsigned char original_data) { EA = 0;
// SectorErase(byte_addr); ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 取地址 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; // 清低3位 ISP_CMD = ISP_CMD | PrgCommand; //写命令2 ISP_DATA = original_data; //写入数据准备 ISPgoon(); //触发执行 ISP_IAP_disable(); //关闭IAP功能 EA =1; }
/**********把数据保存到单片机内部eeprom中**************/ void write_eeprom() //保存数据 { SectorErase(0x2000); byte_write(0x2000, bushu); byte_write(0x2001, bushu >> 8); byte_write(0x2002, bushu >> 16); byte_write(0x2003, zong); byte_write(0x2004, zong >> 8); byte_write(0x2005, zong >> 16); byte_write(0x2055, a_a); }
/******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() //读出保存数据 { bushu = byte_read(0x2002); bushu <<= 8; bushu |= byte_read(0x2001); bushu <<= 8; bushu |= byte_read(0x2000); zong = byte_read(0x2005); zong <<= 8; zong |= byte_read(0x2004); zong <<= 8; zong |= byte_read(0x2003); a_a = byte_read(0x2055); }
/**************开机自检eeprom初始化*****************/ void init_eeprom() //开始初始化保存的数据
第24页
{ read_eeprom(); //读出保存数据 if(a_a != 14) //新的单片机初始单片机内问eeprom { zong = 0; bushu = 0; a_a = 14; write_eeprom(); //保存数据 } }
void conversion(uint temp_data) {
wan=temp_data/10000+0x30 ;
temp_data=temp_data000; //取余运算 qian=temp_data/1000+0x30 ;
temp_data=temp_data00; //取余运算 bai=temp_data/100+0x30 ;
temp_data=temp_data0; //取余运算 shi=temp_data/10+0x30 ;
temp_data=temp_data; //取余运算 ge=temp_data+0x30; }
void delay_1ms(uint q) { uint i,j; for(i=0;i void delay_uint(uint q) { while(q--); } void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(25); e=1; delay_uint(100); e=0; } void write_data(uchar dat) { 第25页