湖南工业大学
课 程 设 计
资 料 袋
理 学院(系、部) 2015~2016 学年第 1 学期
课程名称 单片机系统课程设计 指导教师 职称
学生姓名 管 专业班级 电子科学1 学号
题 目 出租车计费系统
成 绩 起止日期 20## 年 12月7日~ 20## 年 12 月 19 日
目 录 清 单
湖南工业大学
课程设计任务书
理 学院(系、部) 电子科学 专业 班级
课程名称: 单片机系统课程设计
设计题目: 出租车计费系统
完成期限:自 2015 年12月7日至2015 年 12 月 19 日共 2 周
指导教师(签字): 年 月 日
系(教研室)主任(签字): 年 月 日
附件三
(单片机应用系统)
设计说明书
起止日期: 20## 年 12 月 7 日 至 2015 年 12 月 19日
电气与信息工程学院
20##年 12 月19 日
一、设计任务:
1.1 外部脉冲自动计数,自动显示。
1.1.1设计一个255计数器:0-255计数,计满后自动清0,重新计数(在数码管中显示)。
1.1.2设计一个50000计数器:0-50000计数,计满后自动清0,重新计数(在数码管中显示)。
1.2 设计一个出租车计费系统:
起步价为5元(2km以内),2km后,0.8元/0.5km;要求每500m刷新计费一次,在8位数码管中,前3位显示数码管显示里程数,后3位数码管显示价钱(角,元,十元)或者用lcd1602显示
二、设计原理及思路
1.设计一个255计数器:0-255计数,计满后自动清0,重新计数(在数码管中显示)。
这个用C语言比较简单。
首先我确定用的是外部中断0,1,外部中断0用来计数,来一个脉冲,计数器加1,直到加到255,然后清零。外部中断1用来暂停/开始计数,来一个外部脉冲,暂停计数,再来一个脉冲,开始计数。用138译码器数码管进行显示0到255,到了255,自动到0.
2.设计一个50000计数器:
0-50000计数,计满后自动清0,重新计数(在数码管中显示)。这个用C语言和255一样的原理,只要将255计数器中的字符类型,改为int型就可以了
用138译码器数码管进行显示0到50000,到了50000,自动到0.
3.设计一个出租车计费系统:
起步价为5元(2km以内),2km后,0.8元/0.5km;要求每500m刷新计费一次,在8为数码管中,前3为显示数码管显示里程数,后3位数码管显示价钱(角,元,十元)
用lcd1602显示器显示。
三、硬件电路图
1.255计数器
Proteus电路图:
开发板图
2.50000计数器
Proteus电路图
开发板电路图
3.出租车计费器(用数码管显示)
(1).(小于2KM),第一个按键是开始功能,右边的开关是暂停/继续功能
开发板电路图
(2).(大于两千米时)proteus中电路如图所示
开发板电路显示
(3)用lcd1602显示
开发板电路图:
四.源程序
1.255(C语言)
#include<reg51.h>
unsigned char code sz[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0到9
unsigned char m=0,stop=0;
void delay(unsigned int a)//延迟程序
{
unsigned char b;
while(a--)
{
for(b=0;b<120;b++);
}
}
void main()
{
unsigned char i,n,j;
EA=1;//打开总中断
EX0=1;//打开外部中断0
IT0=1;//外部中断0为下降沿触发
EX1=1;//打开外部中断1
IT1=1;//外部中断1为下降沿触发
PX1=1;//外部中断1优先级
while(1)
{
i=m/100;//百位
n=m%100/10;//十位
j=m%10;//个位
P1=sz[i];//赋百位的断码
P2=0xe3;
delay(2);
P1=0x00;//消隐
P1=sz[n];// 赋十位的断码
P2=0xe7;
delay(2);
P1=0x00; ;//消隐
P1=sz[j];// 赋个位的断码
P2=0xeb;
delay(2);
P1=0x00; ;//消隐
}
}
void lsd() interrupt 0//外部中断0
{
static unsigned char x=0;
x++;
if(x<=255)
m=x;
else {x=0;m=0;}
}
void lsd1() interrupt 2///外部中断1
{
unsigned char stop1;
stop++;
stop1=stop%2;//标志为0与1
if(stop1==1)
EX0=0;//停止计数
else
EX0=1;// 开始计数
}
2.50000(C语言),用共阴极数码管
#include<reg51.h>
unsigned char code sz[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0到9
unsigned int m=0;
unsigned char stop=0;
void delay(unsigned int a)//延迟程序
{
unsigned char b;
while(a--)
{
for(b=0;b<100;b++);
}
}
void main()
{
unsigned char i,n,j,a,b;
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//外部中断0为下降沿触发
EX1=1;//开外部中断1
IT1=1;//外部中断1为下降沿触发
PX1=1;//外部中断1优先级高于外部中断0
while(1)
{
while(m<50000)
{
i=m/10000;//万位
n=m%10000/1000;//千位
j=m%1000/100;//百位
a=m%100/10;//十位
b=m%10;//个位
P1=0x00;//消隐
P1=sz[i];//赋万位
P2=0xe3;
delay(2);
P1=0x00;// 消隐
P1=sz[n];// 赋千位
P2=0xe7;
delay(2);
P1=0x00;// 消隐
P1=sz[j];// 赋百位
P2=0xeb;
delay(2);
P1=0x00;// 消隐
P1=sz[a];// 赋十位
P2=0xef;
delay(2);
//P1=0x00;// 消隐
P2=0xff;
P1=sz[b];// 赋个位
P2=0xf3;
}
}
}
void lsd() interrupt 0
{
static int x=0;
if(x<50000)
m=x++;
else
m=x=0;
}
void lsd1() interrupt 2
{
unsigned char stop1;
stop++;
stop1=stop%2;//标志为0与1
if(stop1==1)
EX0=0;//停止计数
else
EX0=1;//开始计数
}
3.1出租车计费器用数码器显示(C语言)
#include<reg51.h>
unsigned int meter=0;
unsigned int money=0;
unsigned int temp=0;
unsigned char stop=0;
unsigned char code sz[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0到9
void delay(unsigned char a)//延迟程序
{
int b;
while(a--)
{
for(b=0;b<80;b++);
}
}
void main()
{
unsigned char g,s,b,q,x;
unsigned char i,j,m,n;
EA=1;//开总中断
EX0=1;//开外部中段0
EX1=1;//开外部中断1
IT0=1;//外部中断0为下降沿
IT1=0;// 外部中断1为下降沿
PX1=1;// 外部中断1优先级高于外部中断0
while(1)
{
temp=meter*5;
q=temp/1000;//里程的百位
b=temp/100%10;// 里程的十位
s=temp/10%10;// 里程的个位
g=temp%10;// 里程的小数位
i=money/1000;//金钱的百位
j=money/100%10;// 金钱的十位
m=money/10%10;// 金钱的个位
n=money%10;// 金钱的小数位
P1=sz[q];
P2=0xe3;
delay(1);
P1=0X00;//
P1=sz[b];
P2=0xe7;
delay(1);
P1=0x00;
P1=(sz[s]|0x80);
P2=0xeb;
delay(1);
P1=0x00;//
P1=sz[g];
P2=0xef;
delay(2);
P1=0x00;
P1=sz[i];
P2=0xf2;
delay(1);
P1=0x00;
P1=sz[j];
P2=0xf7;
delay(1);
P1=0x00;
P1=(sz[m]|0x80);
P2=0xf9;
delay(1);
P1=0x00;
P1=sz[n];
P2=0xff;
delay(2);
P1=0x00;
}
}
void lsd() interrupt 0
{
meter++;
if(meter<=4)
money=50;
else
money=50+8*(meter-4);
}
void lsd1() interrupt 2
{
unsigned char stop1;
stop++;
stop1=stop%2;
if(stop1)
EX0=0;
else
EX0=1;
}
3.2出租车计费器用lcd1602显示(C语言)
#include<reg51.h>
sbit rs=P2^6;//数据/命令选择
sbit rw=P2^5;//读/写选择
sbit e=P2^7;//使能端
unsigned int meter=0;
unsigned int money=0;
unsigned char stop=0;
unsigned char temp=0;
unsigned char show0[6]={'m','e','t','r','e',':'};
unsigned char show1[10]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char show2[6]={'m','o','n','e','y',':'};
void delay(unsigned char a)//延迟程序
{
unsigned char b;
while(a--)
for(b=0;b<40;b++);
}
void lcd_write_com(unsigned char com1) //写命令
{
rs=0;
rw=0;
e=0;
P0=com1;
delay(5);
e=1;
delay(5);
e=0;
}
void lcdreset( ) //初始化
{
delay(10);
lcd_write_com(0x38);//设置显示模式
lcd_write_com(0x0c);//开显示,不显示光标,光标不显示
lcd_write_com(0x06);//写一个指针加1
lcd_write_com(0x01);//清屏
}
void lcd_write_data(unsigned char data1) //写数据
{
rs=1;
rw=0;
e=0;
P0=data1;
delay(5);
e=1;
delay(5);
e=0;
}
void main()
{
unsigned char i,j;
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
PX1=1;
delay(5);
lcdreset( );
while(1)
{
temp=meter*5;
lcd_write_com(0x80);
i=0;
while(i<=5)
{
lcd_write_data(show0[i]);
delay(1);
i++;
}
lcd_write_data(show1[temp/1000%10]);
lcd_write_data(show1[temp/100%10]);//
delay(1);
lcd_write_data(show1[temp/10%10]);//
delay(1);
lcd_write_data('.');//小数点
delay(1);
lcd_write_data(show1[temp%10]);//
delay(1);
lcd_write_com(0x80+0x40);
j=0;
while(j<=5)
{
lcd_write_data(show2[j]);
j++;
}
lcd_write_data(show1[money/1000%10]);
lcd_write_data(show1[money/100%10]);
delay(1);
lcd_write_data(show1[money/10%10]);
delay(1);
lcd_write_data('.');
delay(1);
lcd_write_data(show1[money%10]);
delay(1);
}
}
void lsd() interrupt 0
{
meter++;
if(meter<=4)
money=50;
else
money=50+8*(meter-4);
}
void lsd1() interrupt 2
{
unsigned char stop1;
stop++;
stop1=stop%2;
if(stop1)
EX0=0;
else
EX0=1;
}
五、心得体会
在本次课程设计中,重新巩固了单片机理论课时,加强了实践,增加了动手能力,感觉到的内容很多,知识点很杂、很繁琐。通过自己的努力也更进一步掌握了单片机的内容构造和工作原理,以及接外部电路的情况。当然光有理论知识那只是“纸上谈兵”,还需实际动手去实践。真正把所学的用到日常生活中,理论联系实际,做出实物模型。这次单片机课程设计,我们设计的是简易255计数器,50000计数器,出租车计费系统设计,通过这次课程设计我感觉到要想做成功,必须花时间多做准备,查阅大量资料,每个过程都很繁琐,都要认真地分析每一步每一个模块要实现大的功能,然后分步进行编写调试,最后整合成在一起。
在255计数器的过程中,主要是数码管的动态显示问题,参考了许多书目,其他数码管动态显示的例题,在错误中进步,直到实验的正确,其次就是中断问题,在这个实验中,加深了对中断的理解,以及中断的优先级;在5000的计数器中实验原理与255计数器差不多,主要是在255计数器中,使用的是char字符类型,而char最大只能显示255,所以在5000计数器中,将char字符类型改为int型。
在出租车计费系统中,首先的思想是用数码管的动态显示以及使用lcd1602液晶屏显示,数码管的显示原理和前面一样,而使用lcd显示的原理,一点都不懂,这需要自己观看视频教程以及书本,在经过多次的调试后,有很多地方是因为自己编程的不小心,浪费了许多时间,终于让自己的lcd显示了,我想要结果,但lcd1602只能显示字符,而不能显示汉字,这是唯一有遗憾的地方。
在这次课程设计中,经历了多次失败的洗礼,我明白在以后学习和实践中,我要努力掌握知识,多动手,多思考,以免在以后的学习工作中犯同样的错误。