|
这是我做的一个51单片机设计,使用18b20实现温度采集,使用HMC5883实现磁场的检测,可以判断准确的方位,使用ds1302制作了万年历,并可以测速并累计里程,所有数据使用12864显示,附件里包含源码及仿真。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- #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)
|
|