硬件原理圖如下
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
硬件原理圖和PCB圖
01.硬件設(shè)計(jì).rar
(615.62 KB, 下載次數(shù): 47)
2018-7-15 20:55 上傳
點(diǎn)擊文件名下載附件
AD設(shè)計(jì)的
單片機(jī)程序
02.軟件設(shè)計(jì).rar
(92.62 KB, 下載次數(shù): 41)
2018-7-15 20:56 上傳
點(diǎn)擊文件名下載附件
KEIL開發(fā)
單片機(jī)源程序如下:
- #include "reg52.h"
- #include "stdio.h"
- #include "LCD12864.h"
- #include "DS1302.h"
- #define UpdataTimer(Timer) (Timer = Timer0Count) //刷新定時(shí)計(jì)數(shù)宏定義
- sbit KEY_SET = P3^4; //設(shè)置鍵
- sbit KEY_ADD = P3^5; //加一鍵
- sbit KEY_DEC = P3^7; //減一鍵
- sbit Speaker = P2^3; //蜂鳴器
- uchar m_nIndexSet; //菜單選擇項(xiàng)
- uint m_Speed; //速度(0.1km/h)
- uint m_Mileage; //總里程(0.1km)
- uint m_RideSize; //騎行里程(米)
- uchar m_RideTime[2]; //騎行時(shí)間(秒)
- uchar Set_Speed; //預(yù)設(shè)速度(km/h) [0]
- uint Set_Girth; //輪胎周長(zhǎng)(毫米) [1,2]
- uchar Set_DelayTime; //騎行停頓時(shí)間(秒)[3]
- bit time500ms_flag; //0.5秒標(biāo)志位
- uint Timer0Count; //基準(zhǔn)定時(shí)計(jì)數(shù)
- uint Mileage_Buf[3]; //里程計(jì)算緩存,0:毫米;1:米;2:千米 [456789]
- uint RideTimer;
- uint SpeedTimeBuf[2];
- void Sys_Init(void) //系統(tǒng)初始化
- {
- IT0 = 1; //set INT0 int type (1:Falling 0:Low level)
- EX0 = 1; //enable INT0 interrupt
- EA = 1;
- m_nIndexSet = 0;
- Timer0Count = 0;
- m_Speed = 0;
- m_RideSize = 0;
- m_RideTime[0] = m_RideTime[1] = 0;
- RideTimer = 0;
- SpeedTimeBuf[0] = SpeedTimeBuf[1] = 10000;
- Set_Speed = ds1302_read(ds1302_RAM0); //讀參數(shù)
- Set_Girth = ds1302_read(ds1302_RAM1); //讀參數(shù)
- Set_Girth <<= 8;
- Set_Girth |= ds1302_read(ds1302_RAM2);
- Set_DelayTime = ds1302_read(ds1302_RAM3); //讀參數(shù)
-
- Mileage_Buf[0] = ds1302_read(ds1302_RAM4); //讀參數(shù)
- Mileage_Buf[0] <<= 8;
- Mileage_Buf[0] |= ds1302_read(ds1302_RAM5);
- Mileage_Buf[1] = ds1302_read(ds1302_RAM6); //讀參數(shù)
- Mileage_Buf[1] <<= 8;
- Mileage_Buf[1] |= ds1302_read(ds1302_RAM7);
- Mileage_Buf[2] = ds1302_read(ds1302_RAM8); //讀參數(shù)
- Mileage_Buf[2] <<= 8;
- Mileage_Buf[2] |= ds1302_read(ds1302_RAM9);
- m_Mileage = Mileage_Buf[2]*10 + Mileage_Buf[1]/100; //0.1km
- }
- void Timer0Init(void) //50毫秒@11.0592MHz
- {
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0x4C; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1;
- EA = 1;
- }
- void Timer1Init(void) //1毫秒@11.0592MHz
- {
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TMOD |= 0x10; //設(shè)置定時(shí)器模式
- TL1 = 0x66; //設(shè)置定時(shí)初值
- TH1 = 0xFC; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
- ET1 = 1;
- EA = 1;
- }
- uint CheckTimer(uint Timer) //定時(shí)計(jì)數(shù)值檢測(cè),返回與定時(shí)器0的差值
- {
- if(Timer0Count > Timer)
- {
- return(Timer0Count - Timer);
- }
- else
- {
- return ~(Timer - Timer0Count) + 1;
- }
- }
- void On_GetTimeClock(void) //獲取日歷時(shí)鐘0.5秒檢測(cè)一遍
- {
- static uint GetTime=0;
- uchar i=10;
- if(CheckTimer(GetTime)>=10) //0.5秒退出設(shè)置菜單 10*50=500
- {
- UpdataTimer(GetTime); //更新時(shí)間計(jì)數(shù)
- ds1302_gettime(); //獲取時(shí)間
- }
- }
- void On_DisplayRun(void) //液晶顯示菜單
- {
- static uint ShowTime=0;
- uchar i,k,str_buf[16];
- uint dat;
- if(CheckTimer(ShowTime)<=4) //0.2秒顯示 4*50=200
- {
- return;
- }
- UpdataTimer(ShowTime); //更新時(shí)間計(jì)數(shù)
- if(m_nIndexSet==0) //運(yùn)行畫面
- {
- str_buf[0] = '2'; str_buf[1] = '0'; //2018-02-26 15:14
- str_buf[2] = Timer.Year/10 +'0';
- str_buf[3] = Timer.Year%10 +'0';
- str_buf[4] = '-';
- str_buf[5] = Timer.Month/10 +'0';
- str_buf[6] = Timer.Month%10 +'0';
- str_buf[7] = '-';
- str_buf[8] = Timer.Day/10 +'0';
- str_buf[9] = Timer.Day%10 +'0';
- str_buf[10] = ' ';
- str_buf[11] = Timer.Hour/10 +'0';
- str_buf[12] = Timer.Hour%10 +'0';
- str_buf[13] = ':';
- str_buf[14] = Timer.Minute/10 +'0';
- str_buf[15] = Timer.Minute%10 +'0';
- DisplayString(0,0, str_buf, 16);
- memcpy(str_buf, "里程:****.*km ", 16); //總里程:****.*km
- dat = m_Mileage/10;
- for(i=0; i<4; i++)
- {
- str_buf[8-i] = dat%10 +'0';
- dat /= 10;
- }
- str_buf[10] = m_Mileage%10 +'0';
- k = 0;
- while(1)
- {
- if(str_buf[5]!='0' || k>=3)
- break;
- else
- {
- for(i=5;i<=12;i++) str_buf[i] = str_buf[i+1];
- }
- k++;
- }
- DisplayString(0,1, str_buf, 16);
- memcpy(str_buf, "速度: . km/h ", 16); //速度:**.*km/h 02.6km
- str_buf[5] = (m_Speed/100)%10 +'0';
- str_buf[6] = (m_Speed/10)%10 +'0';
- str_buf[8] = m_Speed%10 +'0';
- if(m_Speed<100)
- {
- for(i=5;i<=12;i++)
- str_buf[i] = str_buf[i+1];
- }
- DisplayString(0,2, str_buf, 16);
- if(m_RideSize<10000)
- {
- memcpy(str_buf, "騎行:****m 01:00", 16); //騎行:****m@01:00
- dat = m_RideSize;
- k = 8;
- }
- else
- {
- memcpy(str_buf, "騎行:***km 01:00", 16); //騎行:***km@01:00
- dat = m_RideSize/1000;
- k = 7;
- }
- for(i=k; i>=5; i--)
- {
- str_buf[i] = dat%10 +'0';
- dat /= 10;
- }
- k=0;
- while(1)
- {
- if(str_buf[5]!='0' || k>=3)
- break;
- else
- {
- for(i=5;i<=9;i++) str_buf[i] = str_buf[i+1];
- }
- k++;
- }
- str_buf[11] = m_RideTime[0]/10 +'0';
- str_buf[12] = m_RideTime[0]%10 +'0';
- str_buf[14] = m_RideTime[1]/10 +'0';
- str_buf[15] = m_RideTime[1]%10 +'0';
- DisplayString(0,3, str_buf, 16);
- }
- else //設(shè)置參數(shù)畫面
- {
- memcpy(str_buf, "預(yù)設(shè)速度: km/h", 16); //預(yù)設(shè)速度: **km/h
- if(m_nIndexSet!=1 || time500ms_flag==1) //=1
- {
- str_buf[10] = Set_Speed/10 +'0';
- str_buf[11] = Set_Speed%10 +'0';
- }
- DisplayString(0,0, str_buf, 16);
- memcpy(str_buf, "輪胎周長(zhǎng): mm ", 16); //輪胎周長(zhǎng): ****mm
- if(m_nIndexSet!=2 || time500ms_flag==1) //=2
- {
- dat = Set_Girth;
- for(i=12; i>=10; i--)
- {
- str_buf[i] = dat%10 +'0';
- dat /= 10;
- }
- }
- DisplayString(0,1, str_buf, 16);
- memcpy(str_buf, "停頓時(shí)間: 秒 ", 16); //停頓時(shí)間: **秒
- if(m_nIndexSet!=3 || time500ms_flag==1)
- {
- str_buf[10] = Set_DelayTime/10 +'0';
- str_buf[11] = Set_DelayTime%10 +'0';
- }
- DisplayString(0,2, str_buf, 16);
- memcpy(str_buf, "20 - - : ", 16); //2018-02-26 15:14
- if(m_nIndexSet!=4 || time500ms_flag==1)
- {
- str_buf[2] = Timer.Year/10 +'0';
- str_buf[3] = Timer.Year%10 +'0';
- }
- if(m_nIndexSet!=5 || time500ms_flag==1)
- {
- str_buf[5] = Timer.Month/10 +'0';
- str_buf[6] = Timer.Month%10 +'0';
- }
- if(m_nIndexSet!=6 || time500ms_flag==1)
- {
- str_buf[8] = Timer.Day/10 +'0';
- str_buf[9] = Timer.Day%10 +'0';
- }
- if(m_nIndexSet!=7 || time500ms_flag==1)
- {
- str_buf[11] = Timer.Hour/10 +'0';
- str_buf[12] = Timer.Hour%10 +'0';
- }
- if(m_nIndexSet!=8 || time500ms_flag==1)
- {
- str_buf[14] = Timer.Minute/10 +'0';
- str_buf[15] = Timer.Minute%10 +'0';
- }
- DisplayString(0,3, str_buf, 16);
- }
- }
- void On_SetKey(void) //設(shè)置按鍵處理
- {
- if(KEY_SET==0)
- {
- Delay_ms(10); //去抖動(dòng)
- if(KEY_SET==0)
- {
- m_nIndexSet++;
- if(m_nIndexSet>8)
- m_nIndexSet = 0;
- while(KEY_SET==0);
- }
- }
- }
- void On_AddDecKey(void) //加減按鍵處理
- {
- if(KEY_ADD==0)
- {
- Delay_ms(10); //去抖動(dòng)
- if(KEY_ADD==0)
- {
- if(m_nIndexSet==1)
- {
- Set_Speed++;
- if(Set_Speed>99) Set_Speed=99;
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM0, Set_Speed); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- }
- else if(m_nIndexSet==2)
- {
- Set_Girth++;
- if(Set_Girth>999) Set_Girth=999;
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM1, Set_Girth/256); //寫入1302
- ds1302_write(ds1302_RAM2, Set_Girth%256); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- }
- else if(m_nIndexSet==3)
- {
- Set_DelayTime++;
- if(Set_DelayTime>99) Set_DelayTime=99;
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM3, Set_DelayTime); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- }
- else //45678
- {
- ds1302_SetTime(m_nIndexSet-3, 1);
- ds1302_SetTime(6, 1);
- }
- if(m_nIndexSet<=3)
- {
- Delay_ms(150);
- }
- else
- {
- while(KEY_ADD==0);
- }
- time500ms_flag = 1;
- }
- }
-
- if(KEY_DEC==0)
- {
- Delay_ms(10);
- if(KEY_DEC==0)
- {
- if(m_nIndexSet==1)
- {
- Set_Speed--;
- if(Set_Speed>200) Set_Speed=0;
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM0,Set_Speed); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- }
- else if(m_nIndexSet==2)
- {
- Set_Girth--;
- if(Set_Girth>50000) Set_Girth=0;
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM1, Set_Girth/256); //寫入1302
- ds1302_write(ds1302_RAM2, Set_Girth%256); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- }
- else if(m_nIndexSet==3)
- {
- Set_DelayTime--;
- if(Set_DelayTime>200) Set_DelayTime=0;
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM3, Set_DelayTime); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- }
- else
- {
- ds1302_SetTime(m_nIndexSet-3, 0);
- ds1302_SetTime(6, 0);
- }
- if(m_nIndexSet<=3)
- {
- Delay_ms(150);
- }
- else
- {
- while(KEY_DEC==0);
- }
- time500ms_flag = 1;
- }
- }
- }
- void On_AutoQuitSet(void) //自動(dòng)退出設(shè)置菜單
- {
- static uint KeyTime=0; //按鍵時(shí)間計(jì)時(shí)(秒)
- if(KEY_SET==0 || KEY_ADD==0 || KEY_DEC==0) //有按鍵按下
- {
- UpdataTimer(KeyTime); //更新時(shí)間計(jì)數(shù)
- }
- if(CheckTimer(KeyTime)<=400) //20秒退出設(shè)置菜單 400*50 = 20000
- {
- return;
- }
- UpdataTimer(KeyTime); //更新時(shí)間計(jì)數(shù)
- m_nIndexSet = 0; //運(yùn)行模式
- }
- void On_SaveMileage(void) //存儲(chǔ)里程
- {
- static uint m_buf[3]={0,0,0};
- if(Mileage_Buf[2]>=6000)
- {
- Mileage_Buf[2] = 0;
- Mileage_Buf[1] = 0;
- Mileage_Buf[0] = 0;
- }
- if(m_buf[0]!=Mileage_Buf[0])
- {
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM4, Mileage_Buf[0]/256); //寫入1302
- ds1302_write(ds1302_RAM5, Mileage_Buf[0]%256); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- m_buf[0] = Mileage_Buf[0];
- }
- if(m_buf[1]!=Mileage_Buf[1])
- {
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM6, Mileage_Buf[1]/256); //寫入1302
- ds1302_write(ds1302_RAM7, Mileage_Buf[1]%256); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- m_buf[1] = Mileage_Buf[1];
- }
- if(m_buf[2]!=Mileage_Buf[2])
- {
- ds1302_write(0x8e,0x00); //允許寫操作
- ds1302_write(ds1302_RAM8, Mileage_Buf[2]/256); //寫入1302
- ds1302_write(ds1302_RAM9, Mileage_Buf[2]%256); //寫入1302
- ds1302_write(0x8e,0x80); //寫保護(hù),禁止寫操作
- m_buf[2] = Mileage_Buf[2];
- }
- m_Mileage = Mileage_Buf[2]*10 + Mileage_Buf[1]/100; //0.1km
- }
- void On_RideHandle(void) //騎行處理
- {
- uint buf;
- buf = (Set_DelayTime*1000)/50; //10000/50=200
- if(CheckTimer(RideTimer)>=buf)
- {
- UpdataTimer(RideTimer);
- m_RideSize = 0;
- m_RideTime[0] = m_RideTime[1] = 0;
- }
- }
- void On_SpeedHandle(void) //騎行速度處理
- {
- static uint speed_timer=0;
- static uint SpeedBuf[10]={0,0,0,0,0,0,0,0,0};
- uchar i;
-
- if(CheckTimer(speed_timer)>=4) //0.2秒到
- {
- UpdataTimer(speed_timer); //更新時(shí)間計(jì)數(shù)
- for(i=0;i<9;i++) //軟件滑動(dòng)濾波算法
- {
- SpeedBuf[i] = SpeedBuf[i+1];
- }
- SpeedBuf[9] = Set_Girth*36;
- SpeedBuf[9] /= SpeedTimeBuf[1];
- if(SpeedBuf[9]>=999) SpeedBuf[9] = 999;
- if(SpeedTimeBuf[0]>=500) //0.5s
- SpeedBuf[9] = 0;
-
- for(m_Speed=0,i=0;i<10;i++)
- {
- m_Speed += SpeedBuf[i];
- }
- m_Speed /= 10;
- }
- if((m_Speed/10)>=Set_Speed) //速度超速
- Speaker = 0; //打開報(bào)警器
- else
- Speaker = 1; //關(guān)閉報(bào)警器
- }
- void main() //主函數(shù)
- {
- Timer0Init(); //50毫秒@11.0592MHz
- Timer1Init(); //10毫秒@11.0592MHz
- LCD12864_Init(); //液晶初始化
- ds1302_Init(); //設(shè)置1302的初始時(shí)間
- Sys_Init(); //系統(tǒng)初始化
- while(1)
- {
- On_GetTimeClock(); //獲取日歷時(shí)鐘0.5秒檢測(cè)一遍
- On_DisplayRun(); //液晶顯示
- On_AutoQuitSet(); //自動(dòng)退出設(shè)置菜單
- On_SaveMileage(); //存儲(chǔ)里程
- On_RideHandle(); //騎行處理
- On_SpeedHandle(); //騎行速度處理
- On_SetKey(); //設(shè)置按鍵處理
- On_AddDecKey(); //加減按鍵處理
- }
- }
- void EXINT0_Interrupt() interrupt 0 //外部中斷0服務(wù)函數(shù)
- {
- Mileage_Buf[0] += Set_Girth; // 1256/1000 = 1 256
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
|