硬件原理图如下
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
硬件原理图和PCB图
01.硬件设计.rar
(615.62 KB, 下载次数: 47)
单片机程序
02.软件设计.rar
(92.62 KB, 下载次数: 41)
单片机源程序如下:
- #include "reg52.h"
- #include "stdio.h"
- #include "LCD12864.h"
- #include "DS1302.h"
- #define UpdataTimer(Timer) (Timer = Timer0Count) //刷新定时计数宏定义
- sbit KEY_SET = P3^4; //设置键
- sbit KEY_ADD = P3^5; //加一键
- sbit KEY_DEC = P3^7; //减一键
- sbit Speaker = P2^3; //蜂鸣器
- uchar m_nIndexSet; //菜单选择项
- uint m_Speed; //速度(0.1km/h)
- uint m_Mileage; //总里程(0.1km)
- uint m_RideSize; //骑行里程(米)
- uchar m_RideTime[2]; //骑行时间(秒)
- uchar Set_Speed; //预设速度(km/h) [0]
- uint Set_Girth; //轮胎周长(毫米) [1,2]
- uchar Set_DelayTime; //骑行停顿时间(秒)[3]
- bit time500ms_flag; //0.5秒标志位
- uint Timer0Count; //基准定时计数
- uint Mileage_Buf[3]; //里程计算缓存,0:毫米;1:米;2:千米 [456789]
- uint RideTimer;
- uint SpeedTimeBuf[2];
- void Sys_Init(void) //系统初始化
- {
- 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); //读参数
- Set_Girth = ds1302_read(ds1302_RAM1); //读参数
- Set_Girth <<= 8;
- Set_Girth |= ds1302_read(ds1302_RAM2);
- Set_DelayTime = ds1302_read(ds1302_RAM3); //读参数
-
- Mileage_Buf[0] = ds1302_read(ds1302_RAM4); //读参数
- Mileage_Buf[0] <<= 8;
- Mileage_Buf[0] |= ds1302_read(ds1302_RAM5);
- Mileage_Buf[1] = ds1302_read(ds1302_RAM6); //读参数
- Mileage_Buf[1] <<= 8;
- Mileage_Buf[1] |= ds1302_read(ds1302_RAM7);
- Mileage_Buf[2] = ds1302_read(ds1302_RAM8); //读参数
- 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; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0x4C; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1;
- EA = 1;
- }
- void Timer1Init(void) //1毫秒@11.0592MHz
- {
- TMOD &= 0x0F; //设置定时器模式
- TMOD |= 0x10; //设置定时器模式
- TL1 = 0x66; //设置定时初值
- TH1 = 0xFC; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- ET1 = 1;
- EA = 1;
- }
- uint CheckTimer(uint Timer) //定时计数值检测,返回与定时器0的差值
- {
- if(Timer0Count > Timer)
- {
- return(Timer0Count - Timer);
- }
- else
- {
- return ~(Timer - Timer0Count) + 1;
- }
- }
- void On_GetTimeClock(void) //获取日历时钟0.5秒检测一遍
- {
- static uint GetTime=0;
- uchar i=10;
- if(CheckTimer(GetTime)>=10) //0.5秒退出设置菜单 10*50=500
- {
- UpdataTimer(GetTime); //更新时间计数
- ds1302_gettime(); //获取时间
- }
- }
- 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); //更新时间计数
- if(m_nIndexSet==0) //运行画面
- {
- 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 //设置参数画面
- {
- memcpy(str_buf, "预设速度: km/h", 16); //预设速度: **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, "轮胎周长: mm ", 16); //轮胎周长: ****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, "停顿时间: 秒 ", 16); //停顿时间: **秒
- 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) //设置按键处理
- {
- if(KEY_SET==0)
- {
- Delay_ms(10); //去抖动
- 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); //去抖动
- 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); //写保护,禁止写操作
- }
- 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); //写保护,禁止写操作
- }
- 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); //写保护,禁止写操作
- }
- 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); //写保护,禁止写操作
- }
- 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); //写保护,禁止写操作
- }
- 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); //写保护,禁止写操作
- }
- 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) //自动退出设置菜单
- {
- static uint KeyTime=0; //按键时间计时(秒)
- if(KEY_SET==0 || KEY_ADD==0 || KEY_DEC==0) //有按键按下
- {
- UpdataTimer(KeyTime); //更新时间计数
- }
- if(CheckTimer(KeyTime)<=400) //20秒退出设置菜单 400*50 = 20000
- {
- return;
- }
- UpdataTimer(KeyTime); //更新时间计数
- m_nIndexSet = 0; //运行模式
- }
- void On_SaveMileage(void) //存储里程
- {
- 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); //写保护,禁止写操作
- 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); //写保护,禁止写操作
- 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); //写保护,禁止写操作
- 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); //更新时间计数
- for(i=0;i<9;i++) //软件滑动滤波算法
- {
- 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; //打开报警器
- else
- Speaker = 1; //关闭报警器
- }
- void main() //主函数
- {
- Timer0Init(); //50毫秒@11.0592MHz
- Timer1Init(); //10毫秒@11.0592MHz
- LCD12864_Init(); //液晶初始化
- ds1302_Init(); //设置1302的初始时间
- Sys_Init(); //系统初始化
- while(1)
- {
- On_GetTimeClock(); //获取日历时钟0.5秒检测一遍
- On_DisplayRun(); //液晶显示
- On_AutoQuitSet(); //自动退出设置菜单
- On_SaveMileage(); //存储里程
- On_RideHandle(); //骑行处理
- On_SpeedHandle(); //骑行速度处理
- On_SetKey(); //设置按键处理
- On_AddDecKey(); //加减按键处理
- }
- }
- void EXINT0_Interrupt() interrupt 0 //外部中断0服务函数
- {
- Mileage_Buf[0] += Set_Girth; // 1256/1000 = 1 256
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|