📄 51
字号:
#include <reg51.h>#include <intrins.h>#include <math.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit RS=P2^0; //LCD命令/数据端sbit RW=P2^1; //LCD读/写端sbit LCDE=P2^2; //LCD使能端sbit PD=P2^6; //SCP1000低功耗设置端sbit CSB=P2^7; //SCP1000片选端sbit CLK=P1^0; //SCP1000时钟信号sbit MOSI=P1^1; //从机输入主机输出端sbit MISO=P1^2; //主机输入从机输出端sbit DRDY=P1^3; //SCP1000忙信号uchar flag; //Busy标志uchar code dis1[] = {"Altitude:"}; //显示表头uchar code dis2[] = {"0123456789m"}; //显示代码uchar dis_buf[5]; //显示缓冲区/******************函数声明*********************/void delay_ms(uint n); //延时函数uchar receive_SPI(void); //SPI总线读1个字节函数void send_SPI(uchar dat); //SPI总线写1个字节函数uint read_Dir_SPI(uchar address,uchar num); //直接寄存器读取函数void write_Dir_SPI(uchar address,uchar dat);//直接寄存器写函数void init_SCP1000(void); //SCP1000初始化函数ulong get_pressure(void); //压力计算函数uint get_altitude(void); //高度计算函数void busy(void); //LCD忙标志判断函数void dat_wrt(uchar dat); //写数据子函数void cmd_wrt(uchar cmd); //写命令子函数void init_1602(void); //1602初始化函数void lcd_start(uchar start); //设定显示位置函数uchar dat_adj(uint dat1); //显示数据调整函数void disp(uint dat); //显示子函数void print(uchar *str); //字符串显示函数/****************************主函数**************************/main(){ uint altitude; init_SCP1000(); init_1602(); print(dis1); //显示文字 while(1) { altitude=get_altitude(); //读取高度 disp(altitude); //显示高度 delay_ms(100); }}/**************************延时函数**************************/void delay_ms(uint n){ uint j; while(n--) { for(j=0;j<125;j++); }}/*******************SPI总线读1个字节函数*********************/uchar receive_SPI(void){ uchar temp,i; CLK=1; for (i=0;i<8;i++) { CLK=0; temp<<=1; _nop_(); if (MISO==1)temp|=0x01; CLK=1; } return(temp);}/*******************SPI总线写1个字节函数*********************/void send_SPI(uchar dat){ uchar temp,i; CLK=1; temp=dat; for (i=0;i<8;i++) { CLK=0; if ((temp&0x80)==0x80) MOSI=1; else MOSI=0; temp<<=1; CLK=1; _nop_();_nop_();_nop_(); }}/********************直接寄存器读取函数**********************/uint read_Dir_SPI(uchar address,uchar num){ uchar temp; uint value; value=0; address<<=2; CSB=0; send_SPI(address); _nop_(); CSB=1; while (num--) { value<<=8; temp=receive_SPI(); value|=temp; } return(value);}/**********************直接寄存器写函数**********************/void write_Dir_SPI(uchar address,uchar dat){ address<<=2; address|=0x02; CSB=0; send_SPI(address); _nop_(); send_SPI(dat); _nop_(); CSB=1;}/*********************SCP1000初始化函数**********************/void init_SCP1000(void){ uint dat; CSB=1; PD=1; delay_ms(2); PD=0; delay_ms(60); do { dat=read_Dir_SPI(0x07,1); //读上电后状态 delay_ms(10); }while(!(dat&0x0001)); //上电过程结束? do { dat=read_Dir_SPI(0x1f,1); //读初始化状态 delay_ms(10); }while(!(dat&0x0001)); //初始化成功? write_Dir_SPI(0x03,0x00); //取消当前的操作 delay_ms(10); write_Dir_SPI(0x03,0x0a); //高分辨率采集模式启动 delay_ms(100);}/*************************压力计算函数***********************/ulong get_pressure(void){ ulong pressure; while (!DRDY); delay_ms(2); pressure=(ulong)((0x0007)&read_Dir_SPI(0x1f,1)); pressure<<=16; pressure|=(ulong)read_Dir_SPI(0x20,2); pressure>>=2; return(pressure);}/*************************高度计算函数***********************/uint get_altitude(void){ uint altitude; ulong pre; float temp,y=0.19; pre=get_pressure(); temp=pre/101325; temp=pow(temp,y); altitude=(uint)(44330*(1-temp)); return(altitude);}/************************LCD忙标志判断函数*******************/void busy(void){ flag=0x80; //赋初值 高位为1 禁止 while (flag&0x80) //读写操作使能位禁止时等待 继续检测 { P0=0xff; RS=0; //指向地址计数器 RW=1; //读 LCDE=1; //信号下降沿有效 flag=P0; //读状态位 高位为状态 LCDE=0; }}/************************写数据子函数************************/void dat_wrt(uchar dat){ busy(); //检测 读写操作使能吗 LCDE=0; RS=1; //指向数据寄存器 RW=0; //写 P0=dat; //写数据 LCDE=1; //高电平有效 LCDE=0;}/*************************写命令子函数************************/void cmd_wrt(uchar cmd){ LCDE=0; busy(); //检测 读写操作使能吗 P0=cmd; //命令 RS=0; //指向命令计数器 RW=0; //写 LCDE=1; //高电平有效 LCDE=0;}/************************1602初始化函数***********************/void init_1602(void){ cmd_wrt(0x01); //清屏 cmd_wrt(0x0c); //开显示,不显示光标,不闪烁 cmd_wrt(0x06); //完成一个字符码传送后,光标左移,显示不发生移位 cmd_wrt(0x38); //16×2显示,5×7点阵,8位数据接口}/***********************设定显示位置函数**********************/void lcd_start(uchar start){ cmd_wrt(start|0x80);}/***********************显示数据调整函数**********************/uchar dat_adj(uint dat1){ uchar i; dis_buf[0]=(uchar)(dat1/1000); //高度千位 dis_buf[1]=(uchar)((dat1%1000)/100); //高度百位 dis_buf[2]=(uchar)((dat1%100)/10); //高度十位 dis_buf[3]=(uchar)(dat1%10); //高度个位 dis_buf[4]=10; for(i=0;i<3;i++) { if(dis_buf[i]!=0)break; //确定显示位数 } return(i);}/**************************显示子函数*************************/void disp(uint dat){ uchar temp,j; temp=dat_adj(dat); lcd_start(0x43+temp); //确定显示起始位置 for(j=temp;j<5;j++) //写显示数据 dat_wrt(dis2[dis_buf[j]]);}/************************字符串显示函数***********************/void print(uchar *str){ while(*str!='\0') //直到字符串结束 { dat_wrt(*str); // str++; //指向下一个字符 }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -