/*********************************************************************************************
程序名:户外检测设计
编写人:
编写时间: 2015 年 5月6 日
硬件支持:液晶,按键,时钟模块,大气压模块,温湿度模块
接口说明:P0液晶,按键P20,21 时钟P33,34,35,大气压P22,23 温湿度P37
修改日志:
NO.1-
说明:
*********************************************************************************************/
#include<reg52.h> //51头文件
#include<LCD12864.h>
#include "define.h" //液晶头文件
#include "1302.h" //时钟头文件
#include "hmc5883.h"
#include "wendu.h"
#include <math.h>
#include <stdio.h>
#include "intrins.h"
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'}; //查表格
extern uchar BUF[8]; //接收数据缓存区
extern uchar value,i;
extern uchar sec_g,sec_s,min_g,min_s,hou_g,hou_s,day_g,day_s,mon_g,mon_s,week1,year_g,year_s;
extern uchar Dis[10];
uint num;
unsigned long num_v,num_s,km=0;
bit jump; //切换界面变量
uchar week_da,uio;
uint read(); //测速的读取
void timer_init()
{
TMOD=0X51;
TH1=0;
TL1=0;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
EA=1;
ET0=1;
TR1=1;
TR0=1;
}
uint read() //测速的读取
{
uint Q,th0,tl0,th01;
while(1)
{
th0=TH1;
tl0=TL1;
th01=TH1;
if(th0==th01) break;
}
Q=th0*256+tl0;
TH1=0;
TL1=0;
return Q;
}
/******************************液晶显示*******************/
/*********************************************************************************************
函数名:时钟显示
调 用:无
参 数:无
返回值:无
结 果:
备 注:
/********************************************************************************************/
void display_1302() //时钟显示
{
if(week1==1)display_str(7,0,"一");
if(week1==2)display_str(7,0,"二");
if(week1==3)display_str(7,0,"三");
if(week1==4)display_str(7,0,"四");
if(week1==5)display_str(7,0,"五");
if(week1==6)display_str(7,0,"六");
if(week1==7)display_str(7,0,"七");
display_str( 0,0,"时钟" );
display_char( 3,0,table[i]);
display_str( 4,0,"星期:" );
display_char(0,1,table[year_s]);
display_char(1,1,table[year_g]);
display_char(2,1,'-');
display_char(3,1,table[mon_s]);
display_char(4,1,table[mon_g]);
display_char(5,1,'-');
display_char(6,1,table[day_s]);
display_char(7,1,table[day_g]);
display_char(0,2,table[hou_s]);
display_char(1,2,table[hou_g]);
display_char(2,2,':');
display_char(3,2,table[min_s]);
display_char(4,2,table[min_g]);
display_char(5,2,':');
display_char(6,2,table[sec_s]);
display_char(7,2,table[sec_g]);
//ds1302_write(0x8e,0x00);ds1302_write(0x80,0x80);
switch(i) //选位控制
{
case 1: transform(0x8d); break;//年
case 2: transform(0x89); break;//月
case 3: transform(0x87); break;//日
case 4: transform(0x85); break;//时
case 5: transform(0x83); break;//分
case 6: transform(0x8b); break;//星期
case 7: i=0;break;
}
quzhi();
display_str( 0,3,"温度" );
display_char(3,3,Dis[3]);
display_char(4,3,Dis[2]);
display_char(5,3,'.');
display_char(6,3,Dis[1]);
display_char(7,3,Dis[0]);
}
void display_stopwatch()
{
int x,y,z;
double angle;
uint acr;
Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中
//---------显示X轴
x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register
z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register
angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
angle*=10;
acr=(uint)angle;
acr=acr/10;
display_str(0,0,"Y");
display_str(1,0,"轴方向:");
if(acr>=20&&acr<=55){display_str( 5,0,"正东" );}
if(acr>=55&&acr<=100){display_str( 5,0,"东南" );}
if(acr>=100&&acr<=120){display_str( 5,0,"正南" );}
if(acr>=120&&acr<=170){display_str( 5,0,"西南" );}
if(acr>=170&&acr<=200){display_str( 5,0,"正西" );}
if(acr>=200&&acr<=260){display_str( 5,0,"西北" );}
if(acr>=260&&acr<=320){display_str( 5,0,"正北" );}
if(acr>=320&&acr<=360||acr>=0&&acr<=20){display_str( 5,0,"东北" );}
delay_nop(5);
/****************速度显示******************************/
// num_v=num*3.24;
// num_s=num_s+num;
// km=num_s; speed
num_v=num*3.24;
display_str(0,1,"speed:");
display_char(3,1,table[num_v%1000/100]);
display_char(4,1,table[num_v%100/10]);
display_char(5,1,table[num_v%10]);
display_str(6,1,"km/h");
/*************里程显示***************************///////
display_str(0,2,"kilometer:");
display_char(0,3,table[km%100000000/10000000]);
display_char(1,3,table[km%10000000/1000000]);
display_char(2,3,table[km%1000000/100000]);
display_char(3,3,table[km%100000/10000]);
display_char(4,3,table[km%10000/1000]);
display_str(5,3,".");
display_char(6,3,table[km%1000/100]);
display_str(7,3,"km");
}
/*********************************************************************************************
函数名:按键检测
调 用:无
参 数:无
返回值:无
结 果:
备 注:
/********************************************************************************************/
void keyscan()
{
if(set==0) //选位
{
delay_nop(5);
if(set==0)
{
i++;
while(!set);
}
}
if(cut==0) //切换界面
{
delay_nop(5);
if(cut==0)
{
jump=~jump;
while(!cut);
LED_init();
}
}
}
/******************************液晶显示*******************/
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/********************************************************************************************/
void main()
{
num_v=num_s=km=0;
i=0;
timer_init();
LED_init(); //清屏
init_1302_write(); //1302初始化时间
Init_HMC5883();
while(1)
{
keyscan();
init_read(); //读当前时间
if(jump==0){display_1302(); } //不同变量不同界面
if(jump==1){display_stopwatch();}
}
}
void T1_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
uio++;
if(uio==20)
{
uio=0;
num=read();
num_s=num_s+num*1.8;
km=num_s;
}
}
基于51单片机的多功能码表设计(包含原理图及源程序)
版权申诉
5星 · 超过95%的资源 5 浏览量
2021-12-22
21:56:33
上传
评论 1
收藏 1.39MB RAR 举报
xiaofang3106
- 粉丝: 50
- 资源: 508
最新资源
- 编译原理:正规式转NFA(有穷自动机)
- 通过 Navicat 备份文件读取连接信息和解析密码
- Linux下开箱即用的C++单元测试demo示例,public成员函数单元测试
- 连接Redis服务器 在使用Redis之前,首先需要使用redis-cli工具连接到Redis服务器 redis-cli是Re
- 连接Redis服务器 在使用Redis之前,首先需要使用redis-cli工具连接到Redis服务器 redis-cli是Red
- 连接Redis服务器 在使用Redis之前,首先需要使用redis-cli工具连接到Redis服务器 redis-cli是Red
- redis命令实践 详细教程
- redis命令实践 详细教程
- redis命令实践 详细教程
- redis命令实践 详细教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈