最近接到一个项目,是位一款出租车计价器设计一套软硬件系统
我用51单片机设计了一个方案,效果还不错,欢迎大家共同留言学习,讨论
废话不多说,先上实物图
AD设计原理图
出租车计价器元件清单
元件名称 单位(只) 型号 参数 备注
单片机 2 AT89S52
整流二极管 20 IN4007
电容 10 30P
电容 10 104
电解电容 8 100UF/50V
电解电容 2 220UF/50V
电解电容 10 10UF/25
微动开关(按钮) 12
74ls164 8
自锁开关 2 (白色,六脚的)
排针 2排
晶振 2 11.0592M
精调电阻 5 103 3296W 10K
排线 1米 20p
稳压管 2 LM7805
稳压管 2 LM7812
焊锡丝 若干
散热片 3 YB-20
三极管 20个 2TY 贴片(PNP)
万能板 3块
掉电保护 2 24c02
L298N 2
七段数码管 8 LG5011BSR
光耦 2 TP521-4
接线端子 8个 2P
管座 5 40P
管座 5 16P
热缩管 1米 直径1.5mm
铜柱 8 长20mm
直流电机 1
电源线 1
变压器 1
深度传感器 3 MOCH26A
驱动 1 L297和L292
C语言代码源程序
#include #include #include #define uchar unsigned char sbit P3_4=P3^4; sbit jia=P2^0;//价格加 sbit jian=P2^1;//价格减 sbit gl=P2^2; //公里 sbit hp=P2^3; //换屏 sbit j=P2^4;//记数 unsigned char keycnt=0; unsigned char cnt=0; bit write=0; //写24C08 的标志; //code uchar tab[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,}; //code uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; code uchar tab[10]={0xbf,0x06,0xdb,0xcf,0x66,0xed,0xfd,0x87,0xff,0xef,}; uchar sz[6]; int yw,ww,qw,bw,sw,gw,a,b,c,d,e,f,g,u,v,w,z; d=46; //单价 e=00; //公里数 f=05; u=12;//时 v=00;//分 w=00;//秒 //jiage=d*e; //金额 /24C08 读写驱动程序 sbit scl=P3^4; // 24c08 SCL sbit sda=P3^5; // 24c08 SDA void delay1(unsigned char x) { unsigned int i; for(i=0;i void flash() { ; ; } void x24c08_init() //24c08 初始化子程序 {scl=1; flash(); sda=1; flash();} void start() //启动(I方C)总线 {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();} void stop() //停止(I方C)总线 {sda=0; flash(); scl=1; flash(); sda=1; flash();} void writex(unsigned char j) //写一个字节 { unsigned char i,temp; temp=j; for (i=0;i<8;i++) {temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();} scl=0; flash(); sda=1; flash(); } unsigned char readx() //读一个字节 { unsigned char i,j,k=0; scl=0; flash(); sda=1; for (i=0;i<8;i++) { flash(); scl=1; flash(); if (sda1) j=1; else j=0; k=(k<<1)|j; scl=0;} flash(); return(k); } void clock() //(I方C)线时钟 { unsigned char i=0; scl=1; flash(); while ((sda1)&&(i<255))i++; scl=0; flash(); } 从24c02 的地址address 中读取一个字节数据/ unsigned char x24c08_read(unsigned char address) { unsigned char i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i=readx(); stop(); delay1(10); return(i); } //向24c02 的address 地址中写入一字节数据info/ void x24c08_write(unsigned char address,unsigned char info) { EA=0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA=1; delay1(50); } /24C08 读写驱动程序完/ void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) {unsigned int i; for(i=0; i<100; i++); tc–;} } / void jishuqi() { if(j0) { cnt++; switch(cnt) { case 30: e++; cnt=0; break; while(hp0); } } } void disp(void) { for(c=5;c>=0;c–) { SBUF=tab[sz[c]]; while(!TI); TI=0; } } /*void KEY() //按键扫描程序 { unsigned char i,j; if(jian==0) { for(i=20;i>0;i–) //延时去干扰 for(j=248;j>0;j–); if(hp==0) { keycnt++; switch(keycnt) //按下次数判断 { case 1: //第一次按下 d=46; break; case 2: //第二次按下 d=12; break; case 3: //第三次按下 d=78; keycnt=0; //重新开始判断键值 break; } while(hp==0); } } }*/ void shizhong(void) { z=TH0*256+TL0; if(z>1) { w++;z=0; } if(w>59) { v++;w=0; } if(v>59) { u++;v=0; } if(u>23) { u=0; } } void led(void) //显示时间 { if(jian0) { u++; } if(gl0) { v++; } if(hp==0) { w++; } qw=sz[0]=u/10%10; bw=sz[1]=u%10; sw=sz[2]=v/10%10; gw=sz[3]=v%10; yw=sz[4]=w/10%10; ww=sz[5]=w%10; } void led1(void) //显示 价格 里程 金额 { //KEY(); if(jian0) { d=46; } if(gl0) { d=78; } if(hp==0) { e=00; f=05; } qw=sz[0]=d/10%10; bw=sz[1]=d%10; sw=sz[2]=e/10%10; gw=sz[3]=e%10; yw=sz[4]=f/10%10; ww=sz[5]=f%10; jishuqi(); x24c08_write(2,e); } void scjs(void)interrupt 3 { TH1=0X3C; TL1=0xB0; a=a+1; if(a12) { a=0; P3_4=!P3_4; if(P3_40) { //b=TH0256+TL0; //f=5; / if(jia==0) {d++;} if(jian==0) {d–;} if(gl==0) {e++;} */ if(e>3) { g=(e-3)*d/10+5; f=g; } shizhong(); if(jia==0) 鉴于篇幅限制,只能写部分代码,
上一篇:扫盲:什么是单片机时序,如何看懂时序图
下一篇:无线充电检测与控制电路
推荐阅读
推荐帖子
- STM32F401RE程序下载问题
- 大家好最新在调试NUCLEO-F401RE开发板自己用keil_v5新建工程简单编写了LED闪烁的程序,用mini-USB连接后Debug单步执行可以看到灯闪烁的效果,下载或是把生成的bin文件拷贝到NODE_F401RE中就不可以,但是通过mbed编译生成的bin文件直接拷贝到NODE_F401RE中就可以正常运行了. 求助有经验的大神,这个是什么原因,是哪里的配置不对吗?谢谢大家 STM32F401RE程序下载问题
-
mininiu5216
stm32/stm8
- AMD K8L资料曝光 加入独立核心电源管理
- 近日于In-Stat微处理器春季论坛上,AMD资深工程师ChuckMoore透露了更多有关K8L微架构的资料,K8L微架构是AMD未来的四核心架构,如同早前台湾某一主机板厂商透露一样,其最主要改善在于共享L3Cache架构,并改用新一代Hyper-Transort传输协议,速度将提升至5.2GB/s。AMD亦会在新一代K8L微架构中改善FloatingPoint浮点运算能力及经常被批评的SSE指令执行效率。ChuckMoore同时透露了K8L架构为了进一步提升省电效果,每颗核心
-
zbz0529
电源技术
- 【好书推荐】《C嵌入式编程设计模式》
- 《C嵌入式编程设计模式》以面向对象的视角,重新审视嵌入式系统,全面总结了嵌入式系统中常见的以及关键的设计模式。《C嵌入式编程设计模式》提出了很多新颖的设计模式,为使用c语言编程的嵌入式系统开发者提供了强有力的工具。通过这些模式,开发者可以用最短的时间设计出性能好、稳定性强、安全性高的嵌入式系统或软件。《C嵌入式编程设计模式》针对嵌人式系统中从内存访问到事件调度,从状态机设计到安全性可靠性保证,对系统的设计以及性能表现的方方面面进行了详细阐述。《C嵌入式编程设计模式》采用uml图形化解释,直观清晰
-
qinkaiabc
编程基础
- USB BLASTER安装成功无法下载程序
- 不知道为什么下载器板子程序在师哥那都行在我在JTAG就提示Can’taccessJTAGchain USBBLASTER安装成功无法下载程序
-
ROYALLC
FPGA/CPLD
- pcb布局问题
- 请教高手,我用的是Altiumdesigner6.9,原理图已经添加到pcb里,对器件布局的时候,突然所有的器件都变成了绿色,怎样才能恢复原样?pcb布局问题
-
403091588
微控制器 MCU
- ATSAMD51 依靠例程输出了HelloWorld
- 太费劲了 MPLABXIDE根据例程输出为/0 没办法想用KEIL 可是一直找不到Packet 终于在求助帖下找到 两篇回复 遇到的问题有 Keil编译报错LicentErro 降低为Keil5 没有Erro 带Warning烧录 显示 ATSAMD51依靠例程输出了HelloWorld
-
程英茂
Microchip MCU