|
這是我做的一個51單片機設計,使用18b20實現溫度采集,使用HMC5883實現磁場的檢測,可以判斷準確的方位,使用ds1302制作了萬年歷,并可以測速并累計里程,所有數據使用12864顯示,附件里包含源碼及仿真。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
0.png (22.14 KB, 下載次數: 156)
下載附件
2017-6-14 18:01 上傳
0.png (30.02 KB, 下載次數: 139)
下載附件
2017-6-14 18:02 上傳
0.png (61.68 KB, 下載次數: 150)
下載附件
2017-6-14 18:01 上傳
單片機源程序如下:
- #include<reg52.h>
- #include"lcd12864.h"
- #include"ds18b20b.h"
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned char UINT8;
- typedef unsigned int UINT16;
- #define GPIO_DIG P0
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- //unsigned char code DIG_CODE[]={
- //0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- ////0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
- unsigned char code licheng_CharCode[]="里程:";
- unsigned char code jine_CharCode[]="金額:";
- unsigned char code qibujia_CharCode[]="起步價:";
- unsigned char code shijian_CharCode[]="時間:";
- unsigned char code shizi_CharCode[]="0123456789";
- unsigned char code wuyuan_CharCode[]="元";
- unsigned char code fen_CharCode[]="分";
- unsigned char code mi_CharCode[]="米";
- unsigned char code qianmi_CharCode[]="千米";
- unsigned char code dian_CharCode[]=".";
- unsigned char code error_CharCode[]="無法顯示";
- unsigned char code erdianwu_CharCode[]="二點六千";
- unsigned char code liuyuan_CharCode[]="六";
- unsigned char code wu_CharCode[]="五";
- unsigned char code shi_CharCode[]="十一";
- unsigned char code shiwu_CharCode[]="十五";
- uint num,num2,_10ms,_1s,_1m,_1h,flag,quan,quan2,distancex,distancex2,distancex3;
- void delayms(unsigned int n) //延時10×n毫秒程序
- {
- unsigned int i,j;
- for(i=0;i<n;i++)
- for(j=0;j<10;j++);
- }
- /*******************************************************************************
- * 函 數 名 : TimerConfiguration
- * 函數功能 : 定時器初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void TimerConfiguration()
- {
- TMOD=0x51;//選擇為定時器0模式,工作方式2,僅用TRX打開啟動。
- TH0=0XD8; //給定時器賦初值,定時100us
- TL0=0XF0;
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- }
- /*******************************************************************************
- * 函 數 名 : DigDisplay
- * 函數功能 : 使用數碼管顯示
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- //void DigDisplay(uchar wei,uchar duan)
- //{
- // unsigned char i,j;
- //// for(i=0;i<8;i++)
- //// {
- //// GPIO_DIG=0x00;//消隱
- // switch(wei) //位選,選擇點亮的數碼管,
- // {
- // case(0):
- // LSA=0;LSB=0;LSC=0; break;
- // case(1):
- // LSA=1;LSB=0;LSC=0; break;
- // case(2):
- // LSA=0;LSB=1;LSC=0; break;
- // case(3):
- // LSA=1;LSB=1;LSC=0; break;
- // case(4):
- // LSA=0;LSB=0;LSC=1; break;
- // case(5):
- // LSA=1;LSB=0;LSC=1; break;
- // case(6):
- // LSA=0;LSB=1;LSC=1; break;
- // case(7):
- // LSA=1;LSB=1;LSC=1; break;
- // }
- // GPIO_DIG=DIG_CODE[duan];
- //// duan++;
- // if(duan>7)
- // duan=0;
- //// j=10; //掃描間隔時間設定
- //// while(j--)
- //// Delay50us();
- //// GPIO_DIG=0x00;//消隱
- //// }
- //}
- void exit_init()
- {
- TMOD=0x50;
- TH1=0;
- TL1=0;
- TR1=1;
- }
- uint read()
- {
- uchar t1,th1,th2;
- uint val;
- while(1)
- {
- th1=TH1;
- t1=TL1;
- th2=TH1;
- if(th1==th2) break;
- }
- val=th1*256+t1;
- return val;
- }
- void time_display()
- {
- uint a=0,b,c,price,find_price;
- LCD12864_SetWindow(3, 6);
- LCD12864_WriteData(shizi_CharCode[_1s/10]);
- LCD12864_SetWindow(3, 7);
- LCD12864_WriteData(shizi_CharCode[_1s%10]);
- LCD12864_SetWindow(3, 3);
- LCD12864_WriteData(shizi_CharCode[_1m/10]);
- LCD12864_SetWindow(3, 4);
- LCD12864_WriteData(shizi_CharCode[_1m%10]);
- LCD12864_SetWindow(3, 5);
- while(fen_CharCode[a]!='\0')
- {
- LCD12864_WriteData(fen_CharCode[a]);
- a++;
- }
- if(distancex<10000)
- {
- LCD12864_SetWindow(0, 3);
- LCD12864_WriteData(shizi_CharCode[distancex/1000]);
- LCD12864_SetWindow(0, 4);
- LCD12864_WriteData(shizi_CharCode[distancex%1000/100]);
- LCD12864_SetWindow(0, 5);
- LCD12864_WriteData(shizi_CharCode[distancex%1000%100/10]);
- LCD12864_SetWindow(0, 6);
- LCD12864_WriteData(shizi_CharCode[distancex%1000%100%10]);
- LCD12864_SetWindow(0, 7);
- while(mi_CharCode[b]!='\0')
- {
- LCD12864_WriteData(mi_CharCode[b]);
- b++;
- }
- }
- else
- {
- LCD12864_SetWindow(0, 3);
- while(error_CharCode[c]!='\0')
- {
- LCD12864_WriteData(error_CharCode[c]);
- c++;
- }
- }
-
- if(distancex<=5)
- {
- LCD12864_SetWindow(1, 3);
- LCD12864_WriteData(shizi_CharCode[0]);
- LCD12864_SetWindow(1, 4);
- LCD12864_WriteData(shizi_CharCode[0]);
- LCD12864_SetWindow(1, 5);
- LCD12864_WriteData(shizi_CharCode[2]);
- }
- else
- {
- price=distancex-5;
- price=price/10;
- find_price=1*price+2;
- LCD12864_SetWindow(1, 5);
- LCD12864_WriteData(shizi_CharCode[find_price%100%10]);
- LCD12864_SetWindow(1, 4);
- LCD12864_WriteData(shizi_CharCode[find_price%100/10]);
- LCD12864_SetWindow(1, 3);
- LCD12864_WriteData(shizi_CharCode[find_price/100]);
- }
- if( distancex>9999)
- {
- LCD12864_SetWindow(0, 3);
- while(error_CharCode[c]!='\0')
- {
- LCD12864_WriteData(error_CharCode[c]);
- c++;
- }
- }
-
-
- // LCD12864_SetWindow(3, 5);
- // LCD12864_WriteData(shizi_CharCode[_1s%10]);
- // LCD12864_SetWindow(3, 5);
- // LCD12864_WriteData(shizi_CharCode[_1s%10]);
- }
- void distance()
- {
- distancex=quan*0.222+quan2*65535*0.222;
-
- }
- void main()
- {
- unsigned char i,j,k,l,m,p,q,r,s,t,u;
-
- exit_init();
- TimerConfiguration();
- LCD12864_Init();
- LCD12864_SetWindow(0, 0);
- // LCD12864_WriteData(licheng_CharCode[i]);
- while(licheng_CharCode[i]!='\0')
- {
- LCD12864_WriteData(licheng_CharCode[i]);
- i++;
- }
- LCD12864_SetWindow(1, 0);
- while(jine_CharCode[j]!='\0')
- {
- LCD12864_WriteData(jine_CharCode[j]);
- j++;
- }
- LCD12864_SetWindow(2, 0);
- while(qibujia_CharCode[k]!='\0')
- {
- LCD12864_WriteData(qibujia_CharCode[k]);
- k++;
- }
- LCD12864_SetWindow(2, 5);
- LCD12864_WriteData(shizi_CharCode[5]);
- LCD12864_SetWindow(2, 4);
- LCD12864_WriteData(shizi_CharCode[0]);
- LCD12864_SetWindow(2, 6);
- while(wuyuan_CharCode[m]!='\0')
- {
- LCD12864_WriteData(wuyuan_CharCode[m]);
- m++;
- }
- LCD12864_SetWindow(1, 6);
- while(wuyuan_CharCode[p]!='\0')
- {
- LCD12864_WriteData(wuyuan_CharCode[p]);
- p++;
- }
-
- LCD12864_SetWindow(3, 0);
- while(shijian_CharCode[l]!='\0')
- {
- LCD12864_WriteData(shijian_CharCode[l]);
- l++;
- }
- LCD12864_SetWindow(0, 3);
- while(erdianwu_CharCode[q]!='\0')
- {
- LCD12864_WriteData(erdianwu_CharCode[q]);
- q++;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
12864計程計費.zip
(1.02 MB, 下載次數: 81)
2017-6-14 17:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|