摘
设计基单片机AT89S52出租车动计费设计附复位电路时钟电路键盘电路等复位电路单片机初始化操作正常初始化外摆脱困境通复位电路重新开始时钟电路采12MHz晶振作系统时钟源具较高准确性
电时字符型液晶1602显示初起步价里程收费等时间收费三种收费通键调整起步价里程收费等时间收费通键模拟出租车运行暂停停止1602液晶显示运行时间运行时暂停时间通计算出总费总路程里AT89S52单片机核心控制器P0口接1602液晶显示模块P1口接键通键输入
关键字 AT89S521602液晶出租车计费器
ABSTRACT
The design is based on a monolithic integrated circuit AT89S52 taxi billing design with reset circuit clocking circuit keyboard circuit Reset circuit is initialized besides the normal operation of the initial dilemma as a foreigner through the reset circuit can start again 12MHz adopts the clock circuit as a system of crystal oscillator higher clock source
The characters in the crystal that the initial 1602 charges fees mileage waiting time three buttons can be adjusted by charging fees just waiting time mileage Through the simulation of the taxi buttons stop Suspension In the liquid crystal display can run 1602 operation time when suspension can be obtained by the computation of the total costhere is mainly for the core controller AT89S52 SCM P0 mouth after 1602 LCD module P1 mouth after the keys through the keystroke
Keyword: AT89S521602 LCDTaxi devices
目 录
1 课程设计书·······················································································3
11 课程设计务············································································3
12 功求···················································································3
13 课程设计方案············································································3
2 硬件电路设计····················································································5
21 振荡电路设计············································································4
22 复位电路设计·············································································4
23 键盘接口电路·············································································6
24 显示电路···················································································6
25 直流电机电路·············································································7
26 单片机引脚功说明································································7
27 L2981602液晶简介·····························································9
3 软件设计·························································································13
31 单片机资源··············································································13
32 单片机模块··············································································13
33 系统程序流程框图····································································16
4 proteus调试····················································································17
41 proteus介绍··············································································17
42 proteus界面介绍·······································································17
43 proteus简单····································································18
44 仿真结果···················································································20
心体会······························································································21
参考文献······························································································22
致谢····································································································23
附录1 元件清单···················································································24
附录2 程序清单···················································································25
附录3 原理图······················································································33
1 课程设计务书
11 课程设计务
设计出租车动计费器计费包括起步价行车里程计费等时间计费三部分1602液晶 显示总金额运行时间暂停时间值999元起步价50元3Km起步价计费超3Km设速度100ms10s增加13元(1KM增加13元)等时间单价分钟15元液晶显示总里程时液晶显示等时间运行花费时间
设计求:
计费功
费计算行驶里程收费设起步价500元
1里程<3km时起价计算费
2里程>3km时公里13元计费
3等累计时间>2min时15元min计费
二显示功
1显示行驶里程:四位数字显示显示方式XXXX单位km计程范围099km精确1km
2显示等候时间:两位数字显示显示方式XX单位min计时范围059min精确1min
3显示总费:四位数字显示显示方式XXXX单位元计价范围09999元精确01元
12 功求
出租车动计费电显示初起步价里程计费单价等时间计费单价通键调节起步价里程计费单价等时间计费单价时具运行暂停停止等状态显示运行时间时显示暂停时间具累加功暂停运行时间暂停运行前次状态计时出租车停止够显示行驶总费
13 课程设计方案
方案:采数字电子技术利555定时芯片构成谐振荡器采外围晶振电路作时钟脉信号采计数芯片脉心脉计数分频通译码电路数进行译码译码数送数码显示该方案流程框图方案图11示:
图11方案
案二:采EDA技术根层次化设计理该设计问题顶分分频模块控制模块 计量模块译码动态扫描显示模块系统框图图12示:
图12方案二
方案三:采MCU技术通单片机作控器利1602字符液晶作显示电路采外部晶振作时钟脉通键方便调节方案三系统流程图方案必须数字电路较熟悉成高方案图图13示:
图13方案三
方案总结:通方案较次采方案三控制简单成低廉设计电路简单
2硬件电路设计
21 振荡电路
单片机部高增益反相放器输入端芯片引脚XTAL1输出端引脚XTAL2通两引脚芯片外接石英晶体振荡器两电容(电容般取33pF)样构成稳定激振荡器 振荡电路脉二分频作系统时钟信号二分频基础三分频产生ALE信号时信号时机器周期信号振荡电路图21示:
图21振荡电路
22 复位电路设计
复位操作两种基形式:种电复位种键复位键复位具电复位功外复位图中RESET键电源VCC电阻R1R2分压RESET端产生复位高电电复位电路求接通电源通外部电容充电实现单片机动复位操作电瞬间RESET引脚获高电着电容充电RERST引脚高电逐渐降RERST引脚高电保持足够时间(2机器周期)单片机进行复位操作键复位电路图图22示
图22复位电路
23 键盘接口电路
(1) 独立式键盘:独立式键盘中键占根IO口线键电路相独立IO口通键相连IO口拉电阻键时引脚端高电键时引脚电拉低IO口部拉电阻时外部接拉电阻键盘接口电路图23示:
图23键盘接口电路
24 显示电路
现实电路采数码采液晶显示液晶分字符型点阵型液晶字符型液晶带字符库需查找代码英文字符液晶电路时果发现液晶亮调节连接液晶点位器改变液晶亮度显示电路图24示:
图24显示电路
25 直流电机电路
该直流电机通驱动芯片L298驱动款芯片时驱动2直流电机直流电PWM脉波驱动第57脚控制电机正反转接负电压接正电压第6脚ENA控制电机转速通PWM控制转速里高电直流电机电路图25示:
图25直流电机电路
26 单片机引脚功说明
AT89S52电路图图26示:
VCC:供电电压GND:接P0口:P0口8位漏级开路双IO口脚吸收8TTL门流P1口脚第次写1时定义高阻输入P0够外部程序数存储器定义数址第八位FIASH编程时P0 口作原码输入口FIASH进行
校验时P0输出原码时P0外部必须拉高
P1口:P1口部提供拉电阻8位双IO口P1口缓器接收输出4TTL门电流 图26AT89S52
P1口脚写入1部拉高作输入P1口外部拉低电时输出电流部拉缘FLASH编程校验时P1口作第八位址接收
P2口:P2口部拉电阻8位双IO口P2口缓器接收输出4TTL门电流P2口写1时脚部拉电阻拉高作输入作输入时P2口脚外部拉低输出电流部拉缘P2口外部程序存储器16位址外部数存储器进行存取时P2口输出址高八位出址1时利部拉优势外部八位址数存储器进行读写时P2口输出特殊功寄存器容P2口FLASH编程校验时接收高八位址信号控制信号
P3口:P3口脚8带部拉电阻双IO口接收输出4TTL门电流P3口写入1部拉高电作输入作输入外部拉低电P3口输出电流(ILL)拉缘P3口作AT89S52特殊功口表21示
表21 AT89S52特殊功口
脚
备选功
P30 RXD
(串行输入口)
P31 TXD
(串行输出口)
P32 INT0
(外部中断0)
P33 INT1
(外部中断1)
P34 T0
(记时器0外部输入)
P35 T1
(记时器1外部输入)
P36 WR
(外部数存储器写选通)
P37 RD
(外部数存储器读选通)
P3口时闪烁编程编程校验接收控制信号
RST:复位输入振荡器复位器件时保持RST脚两机器周期高电时间
ALEPROG:访问外部存储器时址锁存允许输出电锁存址位字节FLASH编程期间引脚输入编程脉时ALE端变频率周期输出正脉信号频率振荡器频率16作外部输出脉定时目然注意:作外部数存储器时跳ALE脉想禁止ALE输出SFR8EH址置0时 ALE执行MOVXMOVC指令ALE起作外该引脚略微拉高果微处理器外部执行状态ALE禁止置位效
PSEN:外部程序存储器选通信号外部程序存储器取指期间机器周期两次PSEN效访问外部数存储器时两次效PSEN信号出现
EAVPP:EA保持低电时期间外部程序存储器(0000HFFFFH)否部程序存储器注意加密方式1时EA部锁定RESETEA端保持高电时间部程序存储器FLASH编程期间引脚施加12V编程电源(VPP)
XTAL1:反振荡放器输入部时钟工作电路输入
XTAL2:反振荡器输出
27 L2981602液晶简介
271 字符液晶1602介绍
字符型液晶1602技术参数表22示:
表22 字符型液晶1602技术参数
显示容量:
16*2字符
芯片工作电压:
45—55V
工作电流:
20mA(50V)
模块佳工作电压:
50V
字符尺寸:
295*435(W*H)mm
接口信号说明表23示:
表23 1602接口信号说明
编号
符号
引脚说明
编号
符号
引脚说明
1
Vss
电源
9
D2
DataIO
2
VDD
电源正极
10
D3
DataIO
3
VL
液晶显示偏压信号
11
D4
DataIO
4
Rs
数命令选择端(HL)
12
D5
DataIO
5
RW
读写选择端(HL)
13
D6
DataIO
6
E
信号
14
D7
DataIO
7
D0
DataIO
15
BLA
背光源正极
8
D1
DataIO
16
BLK
背光源负极
控制器接口说明(HD44780兼容芯片)
1 基操作时序
a 读状态:输入:RsL RwH EH 输出:D0—D7状态字
b 写指令:输入:RsL RwL D0—D7指令码 输出:
E高脉
C 读数:输入:RsH RwL EH 输出:D0—D7数
d 写数:输入:RsH RwL D0—D7数 输出:
E高脉
状态字说明表24示:
表24状态字说明(a)
STA7
D7
STA6
D6
STA5
D5
STA4
D4
STA3
D3
STA2
D2
STA1
D1
STA0
D0
表25 状态字说明(b)
STA06
前数址指针数值
STA7
读写操作
1:禁止 0:允许
注:控制器进行读写操作前必须进行读写检测确保STA70
RAM址映射图
控制器部带80*8位(80字节)RAM缓区应关系图26示:
表26 RAM址映射图LCD16字*2行
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
…
27
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
…
67
指令说明
初始化设置
显示模式设置表27示:
表27 显示模式设置
指令码
功
0
0
1
1
1
0
0
0
设置16*2显示5*7点阵8位数接口
显示开关光标设置表28示:
表28 显示开关光标设置
指令码
功
0
0
0
0
1
D
C
B
D1 开显示 D0 关显示
C1 显示光标 C0 显示光标
B1 光标闪烁 B0 光标显示
0
0
0
0
0
1
N
S
N1 读写字符址指针加光标加
N0 读写字址指针减光标减
S1 写字符整屏显示左移(N1)右移(N0)光标移动屏幕移动效果
S0 写字符整屏显示移动
数控制
控制器部没数址指针户通访问部全部80字节RAM
数指针设置表29示
表29 数指针设置(a)
指令码
功
80H+址码(0—27H 40—67H)
设置数址指针
读数:见c
写数:见d
设置表210示
表210 数指针设置(b)
指令码
功
01H
显示清屏:1数指针清零
2显示清零
02H
显示回车:1数指针清零
供电电路图27示:
单电源 (字符型模块)
双电源 (字符图形型模块)
图27 供电电路
272 L298驱动芯片简介
L298驱动芯片脚图图28示:
3 软件设计
图28 L298芯片图
1脚:电流监测端A 2脚:输出端
3脚:输出端 4脚:功率电源电压(+12V)
5脚:输入端 6脚:时端(通电阻接)
7脚:输入端 8脚:GND接
9脚:逻辑电源电压端(+5V) 10脚:输入端
11脚:端 12脚:输入脚
13脚:输出端 14脚:输出端
15脚:电流监测端B
3软件设计
31 单片机资源
次设计中电路键盘P1口中P10P14口作键盘输
入直流电机电路控制线P2口线P30P31P32分led信号控制脚显示电路P0P2口P0口液晶数口
32 单片机软件模块设计
321 中断子函数
中断程序定时器计数满会产生中断50ms中断次计20次秒钟加1秒钟计满分钟加分钟加99时全部清零中断子函数流程图图31示:
图31中断子程序流程图
322 判键子函数
独立式键盘判键首先键果键延时会判断否真键果确实键判键释放执行键功程序判键子函数流程框图图32示:
图32判键子程序流程图
323 显示子程序
1602液晶字符型液晶部带字符库写两行字符时行写40字符写显示程序时候先写命令设定字符显示写数写次命令数需判断液晶否忙液晶显示程序流程图图33示:
33显示子程序流程图
33 总程序流程框图
整体程序流程框图图34示:
图34整体程序流程框图
4 protues简介
41 Protues介绍
Proteus软件[10]英国Labcenter electronics公司EDA工具软件组合高级原理布图混合模式SPICE仿真PCB设计动布线实现完整电子设计系统系统受益15年持续开发电子世界PCB设计系统较文章中评产品—The Route to PCB CADProteus 产品系列包含革命性VSM技术户基微控制器设计连周围电子器件起仿真户甚实时采诸LEDLCD键盘RS232终端等动态外设模型设计进行交互仿真
功模块—易功强ISIS原理布图工具PROSPICE混合模型SPICE仿真ARES PCB设计PROSPICE 仿真器扩展PROTEUS VSM便包括相关器件基微处理器设计协仿真外结合微控制器软件动态键盘开关钮LEDs甚LCD显示CPU模型支持许通微控制器PICAVRHC118051新支持ARM交互装置模型包括:LEDLCD显示RS232终端通键盘I2CSPI器件强调试工具包括寄存器存储器断点单步模式IAR CSPY Keil uVision2等开发工具源层调试应特殊模型DLL界面提供关元件库全部文件
42 proteus界面介绍
Proteus ISIS [11]工作界面种标准Windows界面图41示包括:标题栏菜单标准工具栏绘图工具栏状态栏象选择钮预览象方位控制钮仿真进程控制钮预览窗口象选择器窗口图形编辑窗口
图41 Proteus 窗口界面图
43 Protues简单
(1) 新建原理图
启动protues软件单击file菜单new弹出图示窗口选择纸张示意图图42示:
图42新建原理图示意图
(2)寻找元件
启动Proteus软件单击挑选元件钮P元件库中选出需元器件出现图43示窗口输入器件关键词选取元件连线
图43 选取元件库中元件示意图
(2)系统调试
双击单片机出现图示画面44Program File栏中选取仿真项目源程序代码点击OK
图44 加载程序图
单击Play钮进入仿真状态仿真钮44示中钮1开始运行钮2step钮3暂停钮4停止
图45 仿真钮示意图
44 Protues仿真结果
通仿真电时液晶显示起步价里程单价等单价(分钟单位)键1选择调整起步价里程价等单价键3进入运行状态键4运行暂停停止时显示运行时间等时间总金额数键5退出重新计费30s钟液晶显示起步价30s开始计价等价1分钟收费次
心体会
出租车计费器系统设计已全部完成预期效果进行模拟汽车启动停止暂停等功够通LCD显示车费数目款出租车计价器包括单价输出单价调整显示前系统时间等功外功出租车计价器具性电路简单成低实性强等特点加优化程序高智化水
月努力基完成设计求容系统行性分析原理图设计等方面作许实际工作取成绩时遇问题存足月学工作觉理知识方面动手力方面进步中受益匪浅次设计前学理知识应实践认识理知识实践间定差距通断努力学实践理知识应实践中通断实践理知识理解
通次设计仅学会查找相关资料更重通查找资料翻阅书籍学少知识扩知识面提高知识水单元设计系统设计巩固前学专业知识真正认识理联系实际重性学工作提供价值验通次设计仅增强动脑力动手力提高思考问题分析问题解决问题力更重学会工程化思想解决问题前学程中学短短三月时间完成设计容程度益老师帮助
次设计认真认识完整严谨科学分析问题解决问题思想重拥科学态度设计出产品外通次设计认识理知识应力欠缺需学中进步提高
参考文献
[1] 李广弟朱月秀冷祖祁单片机基础[M]第3版北京航空航天学出版社2007年1月
[2]李华MCS51系列单片机实接口技术[M]北京航空航天学出版社1996
[3] 马忠梅张凯马岩单片机C语言应程序设计[M]北京:北京航空航天学出版社200311
[4] 胡辉单片机原理应设计—21世纪高等院校规划教材[M]水利水电出版社20057
[5] 刘守义单片机应技术[M]西安:西安电子科技学出版社19968
致谢
文XX老师悉心指导完成老师渊博学识丰富验留深刻印象老师里学仅专业知识实际问题科学解决方法更重勤奋严谨治学精神学生认真负责老师谆谆教诲受益匪浅老师表示衷心感谢致崇高敬意感谢家予学业生活支持顾时感谢予帮助位老师学朋友
附录1 元件件清单
表51元器件清单
名称
规格
数量
备注
电阻
200
1
1K
1
10K
5
100
2
电容
33pF
2
22μF
2
极性电容
发光二极
3
键
6
直流电机
1
晶振
12MHz
1
排阻
102
1排
芯片
AT89S52
1块
L298
1块
1602液晶
1块
带字符库
附录2 程序清单
*******************************************
日期:201059
姓名:XX
名称:出租车动计费器
公司XX学院
*******************************************
#include
#define uchar unsigned char
#define uint unsigned int
sbit rwP2^1读写
sbit rsP2^0
sbit enP2^2读写时控制端
sbit bP0^7液晶判断忙标志位
void lcd_init()
void wr_com(uchar command)液晶写命令
void wr_data(uchar data0)写数
void lcd_clear()液晶清屏
void lcd_set()设置液晶起始位置
void busy()液晶判忙函数
void display()显示
void printstring(uchar *s)直接写字符
void display1()
void key1()
sbit KP1^0
sbit K1P1^1
sbit K2P1^2
sbit K3P1^3
sbit K4P1^4
sbit gP2^7
sbit aaP2^3
sbit bbP2^4
sbit ccP2^5
sbit led_runP3^0
sbit led_awaitP3^1
sbit led_stopP3^2
bit f_start开始标志位
bit jump_in跳入开始标志位
bit jump_out跳出标志位
void key()
uchar code table[]{0x300x310x320x330x340x350x360x370x380x390x70}字符1230
uchar dispbuf[]{000000000000000}
uchar dispbuf1[]{000000000000000}
uchar vv1键次数累加变量
uchar i
void init()
void chuli()
void chuli1()
void delay(uchar t)
void clear()
void set(uchar x)
void set1(uchar y)
uchar command
uchar countcount1
uchar secondminitesecond1minite1
unsigned int tttt1
unsigned char value150value225value315起始价运行价等价
unsigned int money金额变量
*******************************************
void main()
{
init()
lcd_init()
while(1)
{
key1()
chuli()
display()
if(jump_in1)
{
jump_in0
lcd_init()
while(1)
{
key()
chuli1()
display1()
if(jump_out1)
{
lcd_init()
jump_out0
clear()
break
}
}
}
}
}
*******************************************
void clear()跳出次
{
TR00
TR10
money0
second0
second10
minite0
minite10
value150
value225
value315
led_run1
led_await1
led_stop1
v0
v10
for(i0i<15i++)
{
dispbuf[i]0
dispbuf1[i]0
}
}
*******************************************
void init()定时器初始化
{
TMOD0x11
TH0(6553650000)256
TL0(6553650000)256
TH1(6553650000)256
TL1(6553650000)256
ET01
ET11
EA1
TR00
TR10
}
*******************************************
void t0_(void) interrupt 1 using 0定时器0中断
{
count++
if(count20)
{
count0
second++
if(second60)
{
second0
minite++
if(minite99)
{
minite0
}
}
}
TH0(6553650000)256
TL0(6553650000)256
dispbuf1[0]minite10
dispbuf1[1]minite10
dispbuf1[2]second10
dispbuf1[3]second10
}
*******************************************
void t1_(void) interrupt 3 using 3定时器1中断
{
count1++
if(count120)
{
count10
second1++
if(second160)
{
second10
minite1++
if(minite199)
{
minite10
}
}
}
TH1(6553650000)256
TL1(6553650000)256
dispbuf1[4]minite110
dispbuf1[5]minite110
dispbuf1[6]second110
dispbuf1[7]second110
}
*******************************************
void lcd_init()液晶初始化
{
wr_com(0x3c)
wr_com(0x06)
wr_com(0x0c)
wr_com(0x01)
}
*******************************************
void wr_com(uchar command)液晶写命令
{
busy()
rs0
rw0
P0command
en1
en0
}
*******************************************
void wr_data(uchar data0)液晶写数
{
busy()
rs1
rw0
P0data0
en1
en0
}
*******************************************
void busy()液晶判忙
{
while(1)
{
en0
rs0
rw1
P00xff
en1
if(b1)break
}
en0
}
*******************************************
void chuli()数值处理
{
dispbuf[0]value110010
dispbuf[1]value11010
dispbuf[2]value110
dispbuf[3]value210010
dispbuf[4]value21010
dispbuf[5]value210
dispbuf[6]value310010
dispbuf[7]value31010
dispbuf[8]value310
}
*******************************************
void display()
{
set(0)
printstring(step )
wr_data(table[dispbuf[0]])
wr_data(table[dispbuf[1]])
printstring()
wr_data(table[dispbuf[2]])
set(16)
printstring(mileage )
wr_data(table[dispbuf[3]])
wr_data(table[dispbuf[4]])
printstring()
wr_data(table[dispbuf[5]])
set1(0)
printstring(await )
wr_data(table[dispbuf[6]])
wr_data(table[dispbuf[7]])
printstring()
wr_data(table[dispbuf[8]])
*
set1(16)
printstring(run )
wr_data(table[dispbuf1[0]])
wr_data(table[dispbuf1[1]])
printstring()
wr_data(table[dispbuf1[2]])
wr_data(table[dispbuf1[3]])
*
}
*******************************************
void chuli1()
{
if(f_start1)
{
ttminite*60+second总时间
tt1minite1等时间
moneyvalue1+value2*01*tt+value3*tt1起始价+公里价*时间*速度+等价*等时间
}
else if(f_start0)
{
money0
}
dispbuf1[8]money10010
dispbuf1[9]money1010
dispbuf1[10]money10
}
*******************************************
void display1()
{
set(0)
printstring(run )
wr_data(table[dispbuf1[0]])
wr_data(table[dispbuf1[1]])
printstring()
wr_data(table[dispbuf1[2]])
wr_data(table[dispbuf1[3]])
set(14)
printstring(await)
wr_data(table[dispbuf1[4]])
wr_data(table[dispbuf1[5]])
printstring()
wr_data(table[dispbuf1[6]])
wr_data(table[dispbuf1[7]])
set1(0)
printstring(sum is )
wr_data(table[dispbuf1[8]])
wr_data(table[dispbuf1[9]])
printstring()
wr_data(table[dispbuf1[10]])
}
*******************************************
void printstring(uchar *s)行字符函数
{
while(*s)
wr_data(*s++)
}
*******************************************
void key()
{
if(K30)
{
delay(50)
if(K30)
{
while(K30)
v1++
if(v14) v10
}
}
switch(v1)
{
case 1f_start1TR01TR10led_run0led_await1led_stop1aa1bb0cc1break
case 2TR00TR11led_run1led_await0led_stop1aa0cc0break
case 3TR00TR10led_run1led_await1led_stop0break
}
if(K40)
{
delay(50)
if(K40)
{
while(K40)
jump_out1
}
}
}
*******************************************
void delay(uchar t)
{
while(t)
}
*******************************************
void set(uchar x)
{
command0x80+x
wr_com(command)
}
*******************************************
void set1(uchar y)
{
command0xc0+y
wr_com(command)
}
*******************************************
void key1()
{
if(K0)
{
delay(100)
if(K0)
{
while(K0)
v++
if(v4) v0
}
}
switch(v)
{
case 0break
case 1if(K10){while(K10)value1value1+10}break起步价加10
case 2if(K10){while(K10)value2value2+5}break单价加5
case 3if(K10){while(K10)value3value3+5}break停止加5
}
if(K20)
{
delay(50)
if(K20)
{
while(K20)
jump_in1
}
}
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档