单片机课程设计

时间:2024.3.31

湖南工业大学

课  程  设  计

资  料  袋

                         学院(系、部)    2015~2016     学年第   1     学期

课程名称    单片机系统课程设计              指导教师               职称          

学生姓名       专业班级   电子科学1     学号              

题    目                     出租车计费系统                                              

成    绩                       起止日期 20## 127日~ 20## 12 19

目   录   清   单

                                湖南工业大学

课程设计任务书

                         学院(系、部)    电子科学   专业          班级

课程名称:                   单片机系统课程设计                                                      

设计题目:                   出租车计费系统                                              

完成期限:自  2015  127日至2015 12   19  日共  2 

指导教师(签字):                                   年   月    日

系(教研室)主任(签字):                         年   月    日


校徽基本组合规范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只能显示字符,而不能显示汉字,这是唯一有遗憾的地方。

       在这次课程设计中,经历了多次失败的洗礼,我明白在以后学习和实践中,我要努力掌握知识,多动手,多思考,以免在以后的学习工作中犯同样的错误。

更多相关推荐:
单片机课程设计总结

单片机课程设计心得体会这个学期的单片机课已经早早的上完了但是理论纯属理论没有与实践的结合总让我们学的不踏实感觉没有达到学以致用的效果所庆幸的是在课程介绍考试完之后老师给我们安排了这次单片机课程设计给了我们学以致...

单片机课程设计及个人心得感受

本科课程设计(论文)单片机控制流水灯的正常工作及外部中断控制灯的亮灭学院名称:汽车与交通工程学院专业:汽车服务工程班级:13汽服B学号:*************姓名:*******指导教师姓名:***二〇**…

单片机课程设计小结

单片机课程设计小结单片机课程设计小结一做了两周的课程设计有很多的gt心得体会有关于单片机方面的更多的是关于人与人之间关系方面的我们组一共有三个人但其他两个人是真的神龙见首不见尾除了在最后答辩的时候他们一起坐在了...

20xx单片机课程设计心得体会

20xx单片机课程设计心得体会单片机课程设计心得体会课程设计是大学课堂中常见的课堂模式该模式更好的培养学生的综合能力课程模式主要由选题到定稿从理论到实践组成以下由第一公文网整理关于单片机课程设计的心得单片机课程...

单片机课程设计总结

单片机基础知识单片机的外部结构:1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平…

单片机课程设计

信息与电气工程学院课程设计说明书20xx20xx学年第2学期课程名称单片机应用课程设计题目简易数字计数器设计专业班级自动化1101学生姓名学号110410指导教师设计周数2周设计成绩20xx年7月10日单片机课...

单片机课程设计报告

JINGCHUUNIVERSITYOFTECHNOLOGY电子信息工程学院单片机原理与应用技术课程设计报告电子秒表系统专业班级11电气三班姓名学号指导教师邓鹏提交日期20xx年6月目录一前言311课程设计的目的...

单片机课程设计报告

单片机课程设计报告姓名张磊学号20xx123345班级机制1413一实验课题微型直流电机调速控制二实验原理直流电机即将直流电能转换成机械能直流电动机或将机械能转换成直流电能直流发电机的旋转电机本设计主要是利用单...

单片机课程设计报告

江南大学课程名称设计题目基于单片机的步进电机控制器的设计班级姓名指导教师物联网工程学院课程设计报告单片机原理及应用自动化班学号评分20xx年6月29日一步进电机概述步进电动机又称脉冲电动机或阶跃电动机国外一般称...

单片机课程设计报告

单片机原理及系统课程设计报告单片机原理及系统课程设计专业自动控制班级控1101班姓名陈姣学号20xx05320指导教师李亚宁兰州交通大学自动化与电气工程学院20xx年1月17日基于单片机的汽车转向灯设计1引言在...

单片机课程设计实验报告

单片机课程设计实验报告组员20xx0109题目分析本小车是由一块8位单片机AT89S52开发板作为小车的控制器用两个360舵机作为小车的动力前轮用一个单向滚动小球构成后轮单片机开发板上前端留有一块面包板做为小车...

单片机课程设计实验报告

中国民航大学单片机课程设计报告数字温度计姓名白杨学号专业班级指导老师常美华赵淑舫所在学院航空自动化学院20xx年12月18日1概述11课程设计的意义本次课程设计是在我们学过单片机后的一次实习可增加我们的动手能力...

单片机课程设计小结(42篇)