电子科技制作设计论文
自行车里程表 Designed by Jason
(1)AT89S52单片机简介
AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
(2)1602LCD液晶显示模块
液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
本里程表使用常见的1602字符型LCD模块。1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、E三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。
(3)干簧管
干式舌簧管简称干簧管,是利用磁场信号来控制的一种线路开关元件。干式舌簧管以其结构固有的特点,目前已被广泛应用到各种自动化和微型化的自动控制零件及通讯检测设备中,作为灵敏而快速的开闭及转换电路的执行工件。
在本里程表中,干簧管安装在自行车贴近辐条的支架上,磁钢安装在辐条上。当磁钢远离干簧管时,干簧管断开,单片机外部中断0(P3.2)保持高电平。当磁钢靠近干簧管时,干簧管闭合,送一个下降沿信号给单片机的外部中断0,产生一次中断。
【系统调试过程简述】
自行车里程表的原理比较简单,我编好一个比较简单但是核心的程序(只计算里程和速度)在Keil C上仿真,经过短暂的调试就成功了,这证明我关于里程表的最核心的想法是正确的,这给了我后面的制作和调试很大的信心。
紧接着是在单片机上搭建硬件,重点是按键防抖动。我的模式选择按钮是接到单片机的外部中断的,一开始我按照普通按钮的防抖动的方法测试,没有成功。于是在中断服务程序的开始关闭中断,末尾再开中断,还是不行。后来在中断服务程序的末尾加了这样一句:
IE1=0;
其作用就是清除中断标志。因为即使单片机的外部中断是关闭的,但只要在中断服务程序执行期间按键抖动,中断标志又会置1,若没有清除中断标志,退出中断服务程序后又会执行一次服务程序,这样按一次按键就会执行两次中断
- 6 -
电子科技制作设计论文
自行车里程表 Designed by Jason
服务程序。
我的里程表的最初版本是利用串行LED数码管显示作为显示模块的(简介请参阅附录二)。但制成后发现体积太大,而且功耗比较高,不适合用于要求小巧、坚固、耐用的自行车里程表上。
后来改用1602LCD,里程表体积大幅度减小,经测试,背光开启时电流为45mA左右,背光关闭时为25mA左右,2500mah AA×4的电池组供电最多可达100小时,可以满足使用要求。
附录 程序流程图及程序代码
- 7 -
电子科技制作设计论文
自行车里程表 Designed by Jason
开始 显示欢迎信息 检测按钮 处理时钟设置 检测按钮 处理直径设置 初始化 设置特殊寄存器、置定时常数、开中断、清屏等 等待中断 T0 INT0 INT1 刷新累计行驶时刷新里程、速度改变屏幕显示内间及时钟 等 容 程序代码
- 8 -
电子科技制作设计论文
自行车里程表 Designed by Jason #include
/**************************************************************** 引脚定义:
P20=SW1 时钟设置时更改“时”,直径设置时更改十位 P21=SW2 时钟设置时更改“分”的十位,直径设置时更改个位 P22=SW3 时钟设置时更改“分”的个位 P23=Enter 确认更改设置
P32=Disp 正常工作时更改显示模式
****************************************************************************/ sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; sbit P32=P3^2; sbit RS=P3^7; sbit RW=P3^6; sbit E=P3^5; sbit busy=P1^7;
/**************************************************************** 变量定义: i 延时变量
qsls 圈数临时变量,用于判断里程显示选用m还是km作为单位 qs 圈数
sj 累计行驶时间,单位为秒 totallc
累计里程
pjsd 平均速度
ssji 定时器T1 20ms中断次数,用于计算速度等 sji 本次速度对应的20ms中断次数 sjiold 上次速度对应的20ms中断次数 aa
加速度
sd2 当前速度 mxsd 用于更新最大速度 mxsd2 最大速度对应的20ms次数 tc 轮胎周长 *s
字符串显示子程序字符指针 line 字符串显示子程序列数 row 字符串显示子程序行数 com 写控制字 dat 显示码字
gw
累计里程、当前速度、累计时间、最大速度、平均速度、加速度的个位
- 9 -
电子科技制作设计论文
自行车里程表 Designed by Jason sw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的十位 bw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的百位 qw 累计里程、当前速度、累计时间、最大速度、平均速度、加速度的千位 ww 累计里程、累计时间的万位 sww 累计里程、累计时间的十万位 ssj 定时器T0 50ms中断次数,每20次sj加1
cgw 当前时间(时钟)的个位 csw 当前时间(时钟)的十位 cbw 当前时间(时钟)的百位 cqw 当前时间(时钟)的千位 cww 当前时间(时钟)的万位 csww 当前时间(时钟)的十万位
cww2 当前时间(时钟)的辅助万位 MODE 显示模式
tr1 轮胎设置变量1(十位) tr2 轮胎设置变量2(个位)
****************************************************************************/ unsigned int i,qsls;
unsigned long qs,sj,totallc,pjsd,ssji,sji,sjiold,aa,sd2,mxsd,mxsd2,tc;
uchar *s,line,row,com,dat,gw,sw,bw,qw,ww,sww,ssj,cgw,csw,cbw,cqw,cww,csww,cww2,MODE,tr1,tr2;
/***********************************void wait()***************************** 该函数的作用是对LCD进行检测,看LCD是否处于忙的状态.当bflag=1时表示忙, 此时不可以向LCD进行读写操作.而当busy=0时,表示可以向它读写数据.
****************************************************************************/ void wait() {P1=0xff;
RW=1; RS=0; do{E=0;E=1;}while(busy==1); }
/**************************************void dispone()******************************* 该函数的作用是向LCD写入数据并显示出来.
***********************************************************************************/ void dispone(dat) {P1=dat;
RW=0; RS=1; E=0; E=1; wait(); }
/**********************************void wrcom()******************************* 该函数的作用是向LCD写入控制字.
- 10 -

