⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 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 + -