本次出租車計(jì)價(jià)器設(shè)計(jì)以AT89C52單片機(jī)為中心,采用AMPIRE28*64液晶屏顯示出租車計(jì)價(jià)單價(jià)、里程數(shù)和金額;采用時(shí)鐘芯片DS1302來顯示時(shí)間和在系統(tǒng)需要時(shí)進(jìn)行計(jì)時(shí)。其中有三個(gè)按鍵代表“開始/暫!薄ⅰ扒辶恪焙驮O(shè)置“白天/黑夜”。
實(shí)驗(yàn)要求 基本功能 1)顯示: 可以顯示 單價(jià)、里程、總金額 2)停車計(jì)費(fèi)功能:中途因故停車超過5分鐘后每分鐘按當(dāng)時(shí)單價(jià)的50%收費(fèi) 3)自動(dòng)分時(shí)計(jì)費(fèi)功能:白天和夜間應(yīng)能自動(dòng)更換單價(jià) 4)性能 里程誤差小于2% 擴(kuò)展功能 1)可增加時(shí)鐘功能 2)可增加數(shù)據(jù)掉電保護(hù)功能 已完成顯示、分時(shí)計(jì)費(fèi)、時(shí)鐘三個(gè)功能,另外增添了暫停和清零功能。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī).png (131.18 KB, 下載次數(shù): 81)
下載附件
原理圖
2020-10-18 11:46 上傳
AMPIRE128*64液晶顯示屏
單片機(jī)1.png (25.65 KB, 下載次數(shù): 77)
下載附件
2020-10-18 12:15 上傳
按鍵電路的設(shè)計(jì)
單片機(jī)2.png (22.09 KB, 下載次數(shù): 80)
下載附件
2020-10-18 12:15 上傳
話不多說,直接上單片機(jī)代碼 - #include<reg52.h>
- #include<intrins.h>
- #include"lcd12864.c"
- #include"code.h"
- #include"ds1302.c"
- #include"display.c"
- sbit P34=P3^4; //按鈕
- sbit P33=P3^3; //按鈕
- sbit P12=P1^2; //燈
- float p,price,distance_km,money; //路程,金額
- unsigned int b,n;
- bit flag=1;
- voidmain(void) //主函數(shù)
- {
- init_lcd(); //液晶顯示屏
- clearscreen(0); //清屏
- setline(0); //起始行
- TMOD=0x01; //方式1 定時(shí)功能
- TH0=0x3c; //00111100
- TL0=0xaf; //10101111 50ms計(jì)數(shù)一次
- IE=0x87;
- IT0=1;
- IP=0x01;
- distance_km=0; //路程=0
- Init_DS1302(); //時(shí)鐘芯片
- while(1)
- {
- if(flag)
- {
- TR0=0;
- P12=1;
- price=p;
- display(price);
- display1(distance_km); //顯示路程
- display2(money); //顯示金額
- }
- else
- {
- TR0=1; //T0中斷
- P12=0; //燈亮
- price=p;
- display(price);
- display1(distance_km); //顯示路程
- display2(money); //顯示金額
- }
- displayc(1,0,0*16,dan); //顯示“單”
- displayc(1,0,1*16,jia); //顯示“價(jià)”
- displaye(1,0,4*8,num,15); //顯示“:”
- displayc(1,3,0*16,li); //顯示“里”
- displayc(1,3,1*16,chen); //顯示“程”
- displayc(1,3,2*16,shu); //顯示“數(shù)”
- displaye(1,3,6*8,num,15); //顯示“:”
- displayc(1,6,0*16,jin); //顯示“金”
- displayc(1,6,1*16,e); //顯示“額”
- displaye(1,6,4*8,num,15); //顯示“:”
- }
- }
- void timer1(void)interrupt 1 //定時(shí)器0中斷
- {
- TH0=0x3c; //00111100
- TL0=0xaf; //10101111 50ms計(jì)數(shù)一次
- b++;
- if(b==10)
- {
- if(P34==1)
- {
- p=1.5;
- distance_km+=0.1; //路程+0.1
- if(distance_km<=3)money=5; //小于3km,計(jì)價(jià)5元
- elsemoney=4.9+(distance_km-3)*p; //大于3km部分1.5元每km
- b=0;
- }
- else
- {
- p=2;
- distance_km+=0.1; //路程+0.1
- if(distance_km<=3)money=6; //小于3km,計(jì)價(jià)6元
- elsemoney=5.9+(distance_km-3)*p; //大于3km部分2元每km
- b=0;
- }
- }
- }
- void timer0(void)interrupt 0 //外部中斷0 按鍵1
- {
- flag=~flag;
- }
- void timer2(void)interrupt 2 //外部中斷1 按鍵2
- {
- distance_km=0; //路程=0
- money=0;
- price=p;
- }
- LCD12864.C
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit cs1=P2^0;
- sbit cs2=P2^1;
- sbit EN=P2^2;
- sbit RW=P2^3;
- sbit RS=P2^4;
- void delay(uchar i)
- {
- while(i--); //延時(shí)
- }
- void readbusy() //忙碌
- {
- P0=0x00; //00000000
- RS=0;
- RW=1; //讀出忙標(biāo)志(BF)及地址記數(shù)器(AC)的狀態(tài)
- EN=1; //讀寫使能,下降沿鎖定數(shù)據(jù)
- while(P0&0x80); //當(dāng)BF=0,while(0),當(dāng)BF=1,while(1)
- EN=0; //EN=1-0,配合RW寫數(shù)據(jù)或指令
- }
- void lcd_wcmd(uchar cmd)
- {
- readbusy(); //判斷忙碌
- RS=0;
- RW=0; //MPU寫指令到指令暫存器
- P0=cmd;
- EN=1; //配合RS進(jìn)行讀數(shù)據(jù)或指令
- _nop_(); //延時(shí)2個(gè)指令周期
- _nop_();
- EN=0; //EN=1-0,配合RW寫數(shù)據(jù)或指令
- }
- void lcd_wdat(uchar dat)
- {
- readbusy(); //判斷忙碌
- RS=1;
- RW=0; //MPU寫數(shù)據(jù)到數(shù)據(jù)暫存器
- P0=dat;
- EN=1; //配合RS進(jìn)行讀數(shù)據(jù)或指令
- _nop_(); //延時(shí)2個(gè)指令周期
- _nop_();
- EN=0; //EN=1-0,配合RW寫數(shù)據(jù)或指令
- }
- void setpage(uchar page)
- {
- page=0xb8|page; //起始頁 10111000
- lcd_wcmd(page); //寫指令
- }
- void setline(uchar line)
- {
-
- line=line&0x3f; //最終行 00000111
- line=line|0xc0; //起始行 11000000
- lcd_wcmd(line); //寫指令
- }
- void setcolumn(uchar column)
- {
- column=column&0x3f; //最終列 00111111
- column=column|0x40; //起始列 01000000
- lcd_wcmd(column); //寫指令
- }
- void setonoff(uchar onoff)
- {
- onoff=0x3e|onoff; //00111110
- lcd_wcmd(onoff); //寫指令
- }
- void selectscreen(uchar screen) //選擇屏幕
- {
- switch(screen)
- {
- case0:cs1=0;delay(2);cs2=0;delay(2);break; //全屏
- case1:cs1=0;delay(2);cs2=1;delay(2);break; //左屏
- case2:cs1=1;delay(2);cs2=0;delay(2);break; //右屏
- default:break;
- }
- }
- void clearscreen(uchar screen) //清屏
- {
- uchari,j;
- selectscreen(screen); //選屏
- for(i=0;i<8;i++)
- {
- setpage(i); //0-7頁
- setcolumn(0); //起始行
- for(j=0;j<64;j++)
- {
- lcd_wdat(0x00); //寫數(shù)據(jù) 0-63
- }
- }
- }
- void init_lcd()
- {
- readbusy();
- selectscreen(0); //全屏
- setonoff(0); //關(guān)
- selectscreen(0); //全屏
- setonoff(1); //開
- selectscreen(0); //全屏
- clearscreen(0); //清屏
- setline(0); //起始行
- }
- Code.h
- unsigned char code dan[]={0x00,0x00,0x00,0xf8,0x4b,0x4e,0x4c,0xf8,0x4c,0x4e,0x4b,0xf8,0x00,0x00,0x00,0x00,
- 0x00,0x08,0x08,0x0b,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,0x0a,0x0b,0x08,0x08,0x00,0x00};
- unsigned char code jia []={0x00,0x20,0x30,0x18,0xfc,0x07,0x20,0x30,0xf8,0x0c,0x07,0x0c,0xf8,0x30,0x20,0x00,
- 0x00,0x00,0x00,0x00,0xff,0x00,0xf0,0x1c,0x07,0x00,0x00,0x00,0xff,0x00,0x00,0x00};
- unsigned char code li []={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
- 0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00};
- unsigned char code chen []={0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0x3E,0x22,0x22,0x22,0x22,0x22,0x3E,0x00,0x00,
- 0x08,0x06,0x01,0xFF,0x01,0x06,0x40,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x41,0x00};
- unsigned char code shu []={0x90,0x52,0x34,0x10,0xFF,0x10,0x34,0x52,0x80,0x70,0x8F,0x08,0x08,0xF8,0x08,0x00,
- 0x82,0x9A,0x56,0x63,0x22,0x52,0x8E,0x00,0x80,0x40,0x33,0x0C,0x33,0x40,0x80,0x00};
- unsigned char code jin []={0x00,0x80,0x80,0x40,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x20,0x40,0x80,0x80,
- 0x00,0x40,0x40,0x42,0x4A,0x72,0x42,0x42,0x7F,0x42,0x42,0x62,0x5A,0x42,0x40,0x40};
- unsigned char code e []={0x00,0x00,0x8C,0x44,0xB5,0x26,0xA4,0x64,0x0C,0x02,0xF2,0x1A,0xD6,0x12,0xF2,0x02,
- 0x00,0x10,0x08,0xFC,0x4A,0x49,0x4A,0xFC,0x08,0x80,0x4F,0x30,0x0F,0x10,0x2F,0xC0};
- unsigned char code gong []={0x00,0x00,0x80,0x40,0x20,0x18,0x06,0x80,0x00,0x07,0x18,0x20,0x40,0x80,0x00,0x00,
- 0x00,0x01,0x00,0x20,0x70,0x28,0x26,0x21,0x20,0x20,0x24,0x38,0x60,0x00,0x01,0x01};
- unsigned char code yuan []={0x00,0x20,0x20,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x20,0x20,
- 0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78};
- unsigned int code num[16][16]=
- {
- {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, //0
- {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, //1
- {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, //2
- {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}, //3
- {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}, //4
- {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00}, //5
- {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}, //6
- {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}, //7
- {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}, //8
- {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}, //9
- {0x00,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7F,0x48,0x0C,0x53,0x61,0x41}, //k
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x7F,0x41,0x01,0x7F,0x41,0x01,0x7E}, //m
- {0x00,0x00,0x00,0x80,0xe0,0x38,0x0f,0x00,0x00,0xf0,0x1c,0x07,0x00,0x00,0x00,0x00}, // /
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, // -
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00}, // .
- {0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x61,0x00,0x00,0x00}}; // :
- Display.c
- void displayc(unsigned char screen,unsignedchar page,unsigned char column,unsigned char table[]) //寫漢字
- //選擇屏幕,頁,列,數(shù)組
- {
- unsignedchar i;
- selectscreen(screen); //選擇屏幕
- setpage(page); //選擇頁
- setcolumn(column); //選擇列
- for(i=0;i<16;i++)//上半部分
- {
- lcd_wdat(table);_nop_(); //寫數(shù)據(jù) 0-15
- }
- setpage(page+1); //頁+1
- setcolumn(column); //選擇列
- for(i=0;i<16;i++)//下半部分
- {
- lcd_wdat(table[i+16]);_nop_(); //寫數(shù)據(jù) 16-31
- }
- }
- void displaye(unsigned char screen,unsignedchar page,unsigned char column,unsigned int table[][16],unsigned char n) //寫數(shù)字
- //選擇左右屏幕,頁,列,數(shù)組,數(shù)字/漢字
- {
- unsignedchar i;
- selectscreen(screen); //選擇屏幕
- setpage(page); //選擇頁
- setcolumn(column); //選擇列
- for(i=0;i<8;i++) //上半部分
- {
- lcd_wdat(table[n]);_nop_(); //選擇第n行,i 0-7循環(huán)顯示一個(gè)數(shù)字
- }
- setpage(page+1); //頁+1
- setcolumn(column); //選擇列
- for(i=0;i<8;i++) //下半部分
- {
- lcd_wdat(table[n][i+8]);_nop_(); //選擇第n行,i 8-15循環(huán)顯示一個(gè)數(shù)字
- }
- }
- void display(float price) //單價(jià)
- {
- unsignedchar x,y,n;
- n=(int)(price);
- x=n;
- y=(price-n)*10;
- displaye(1,0,6*8,num,x);
- displaye(1,0,7*8,num,14);
- displaye(2,0,0*8,num,y);
- displayc(2,0,1*8,yuan);
- displaye(2,0,3*8,num,12);
- displayc(2,0,2*16,gong);
- displayc(2,0,3*16,li);
- }
- void display1(float distance_km) //顯示路程
- {
- unsignedchar counta,countb,countc,countd,n;
- n=(int)(distance_km); //強(qiáng)行轉(zhuǎn)換成整型
- counta=n/100;
- countb=n%100/10;
- countc=n%10;
- countd=(distance_km-n)*10;
- displaye(1,3,7*8,num,counta);
- displaye(2,3,0*8,num,countb);
- displaye(2,3,1*8,num,countc);
- displaye(2,3,2*8,num,14);
- displaye(2,3,3*8,num,countd);
- displayc(2,3,2*16,gong);
- displayc(2,3,3*16,li);
- }
- void display2(float money) //金額
- {
- unsignedchar a,b,c,d,n;
- n=(int)(money);
- a=n/100;
- b=n%100/10;
- c=n%10;
- d=(money-n)*10;
- displaye(2,6,1*8,num,a);
- displaye(2,6,2*8,num,b);
- displaye(2,6,3*8,num,c);
- displaye(2,6,4*8,num,14);
- displaye(2,6,5*8,num,d);
- displayc(2,6,3*16,yuan);
- }
復(fù)制代碼
單片機(jī)綜合實(shí)驗(yàn)51hei.docx
(554.39 KB, 下載次數(shù): 101)
2020-10-18 12:00 上傳
點(diǎn)擊文件名下載附件
實(shí)驗(yàn)報(bào)告 下載積分: 黑幣 -5
protect和keil源文件.rar
(91.61 KB, 下載次數(shù): 186)
2020-10-18 12:11 上傳
點(diǎn)擊文件名下載附件
源文件 下載積分: 黑幣 -5
|