当前位置:首页 > 名字大全 > 正文

单片机pos是什么指令(单片机posi)

本篇文章大家谈单片机pos什么指令,以及单片机POSi对应知识点希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

AT89C++51单片机电子时钟 连线:P00---P07 分别和U7D0—U7D7相连 要求格式:HHMmss具有设置时间的功

#Include reg52.h

#include intrins.h

#deFine uint unsigned int

#define uchar unsigned char

***it LCD_RS=P2.0;

***it LCD_RW=P2^1;

***it LCD_EN=P2^2;

***it key1=P1^0;

***it key2=P1^1;

***it key3=P1.2;

***it key4=P1^3;

uchar Display_Buffer[8];

uchar Count,hour=12,min=12,SEC=12;

bit flag,H_or_M;

void _delay_ms(unsigned int x)

{

unsigned char i;

while(x--)

{

for(i=0;i120;i++);

}

}

uchar LCD_Busy(void)//测忙

{

uchar LCD_Status;//返变量

LCD_RS=0;//读取状态

LCD_RW=1;

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_Status=P0;

LCD_EN=0;

return LCD_Status;

}

void LCD_Write_COMmand(uchar cmd)//写指令

{

while((LCD_Busy()0x80)==0x80);//测忙

LCD_RS=0;/悔者/

LCD_RW=0;

LCD_EN=0;

P0=cmd;

LCD_EN=1;

_nop_();_nop_();

LCD_EN=0;

_nop_();_nop_();

}

void LCD_Write_DATA(uchar dat)//写数据

{

while((LCD_Busy()0x80)==0x80);

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

LCD_EN=1;

_nop_();_nop_();

LCD_EN=0;

_nop_();_nop_();

}

void Init_LCD(void)//液晶初始化

{

_delay_ms(15);

LCD_Write_command(0.38);

_delay_ms(5);

LCD_Write_Command(0x06);

_delay_ms(5);

LCD_Write_Command(0x0c);

_delay_ms(5);

LCD_Write_Command(0x01);

_delay_ms(5);

}

void LCD_POs(uchar Pos)//字符显示位置

{

LCD_Write_Command(0x80|PoS);

}

void Show_String(uchar *str)//显示字符串

{

while(*str!='\0')

LCD_Write_Data(*str++);

}

/////lcd1602液晶显示//////

void Display_Time(uchar Hour,uchar Min,uchar Sec)

{

Display_Buffer[0]=Hour/10+'0';//小时十渣蔽位

Display_Buffer[1]=Hour%10+'0';//小时个位

Display_Buffer[2]=':';//显示:号

Display_Buffer[3]=Min/10+'0';//显示分钟十位

Display_Buffer[4]=Min%10+'0';//显示分钟个位

Display_Buffer[5]=':';//显示:号

Display_Buffer[6]=Sec/10+'0';//显示秒十位

Display_Buffer[7]=Sec%10+'0';//显示秒个位

LCD_POS(0x40);//显示液晶第1行第0列

Show_String(Display_Buffer);

}

/////按键处理//////

void Set_time(void)

{

flag=0;

if(key1==0||key2==0||key3==0)//若key1,key2,key3其中有键按下,则为真

{

TR0=0;//定时器0停止

flag=1;//按键标志位为真

}

while(flag)//判断那一个按键按下

{

if(key1==0)//判断key1是否按下

{

while(!key1);//碧梁薯等待释放

H_or_M=!H_or_M;//选择修改还是分钟

}

else if(key2==0)//判断key2是被按下

{

while(!key2);//等待释放

if(H_or_M)//若H_OR_M为真,则修改小时

{

if(++hour==24)//若小时=24,则小时=0

hour=0;//小时加1

}

else//否则修改分钟

{

if(++min==60)//若分钟等于60,则分钟等于0

min=0;//分钟加1

}

}

else if(key3==0)//判断key3是否被按下

{

while(!key3);//等待释放

if(H_or_M)//若H_OR_M为真,则修改小时

{

if(--hour==0xff) //小时减1,若小时等于-1,则小时等于23

hour=23;

}

else//否则修改分钟

{

if(--min==0xff)//分钟减1,若分钟等于-1,则分钟等于59

min=59;

}

}

else if(key4==0)//判断key4是否被按下

{

while(!key4);//等待释放

flag=0;//按键标志清零

TR0=1;//定时器0启动

}

Display_Time(hour,min,sec);//传H,M,S值显示到液晶

}

}

void timer0_init(void)//定时器0初始化

{

TMOD=0x01;//定时器0,方式1

ET0=1;//

EA=1;//总中断允许

TR0=1;//启动定时器0

TH0=(65535-50000)/256;//装高8位初值

TL0=(65535-50000)%256;//装低8位初值

}

void main(void)//主函数

{

P1=0xff;//口初始化

P3=0xff;

Init_LCD();//液晶初始化

timer0_init();//定时器0初始化

while(1)//无限循环

{

Display_Time(hour,min,sec);//液晶显示时间

//_delay_ms(500);//延时

Set_time();//时间调整

}

}

void timer0() interrupt 1//定时器0中断

{

TH0=(65535-50000)/256;//重装定时器0高8位

TL0=(65535-50000)%256;//重装定时器0低8位

Count++;//计数加1

if(Count==20)//如果COUNT等于20

{

Count=0;//计数清零

sec++;//秒加1

if(sec==60)//判断秒是否等于60

{

sec=0;//秒清零

min++;//分钟加1

if(min==60)//判断分钟是否等于60

{

min=0;//若等于60,则清零分钟

hour++;//小时加1

if(hour==24)//判断小时是否等于24

{

hour=0;//若小时等于24,则清零小时,分钟,秒

min=0;

sec=0;

}

}

}

}

}

这个是用51单片机内部定时器做的一个简LCD液晶数字时钟可以满足你的要求,你参考一下!

STM32中 嘀嗒定时器中: 1ul

1ul说明这笑正衡个量1是unsigned Long

SysTick_CTRL_ENABLE_Pos,这个在头文件碰做里定义是0

总的来说是1左移0位清肆

个人

单片机编程问题

/*-----------------------------------------------

[_a***_]:18B20温度传感器

内容:18B20单线温度检测应用样例程序,将18b20插紧,

然后数码管可以显示XX.XC,C表示摄氏度,显示25.3C表示当前温度25.3度

------------------------------------------------*/

#includereg52.h //包含头文件,一般情况需要改动,头文件特殊功能寄存器的定义

#includemath.h

#includeINTRINS.H

#define uchar unsigned char

#define uint unsigned int;

/******************************************************************/

/* 定义端口 */

/******************************************************************/

***it seg1=P2^0;

***it seg2=P2^1;

***it seg3=P2^2;

***it DQ=P1^3;//ds18b20 端口

sfr dataled=0x80;//显示数据端口

/******************************************************************/

/* 全局变量 */

/******************************************************************/

uint temp;

uchar flag_get,count,num,minute,second;

uchar code tab[]={0x3f,0x06,0.5b,0x4f,0.66,0x6d,0x7d,0x07,0x7f,0x6f};

//7段数码管段码表共

uchar str[6];

/******************************************************************/

/* 函数声明 */

/******************************************************************/

void delay1(uchar MS);

unsigned int ReadTemperature(void);

void Init_DS18B20(void);

unsigned char ReadOneChar(void);

void WriteOneChar(unsigned char dat);

void delay(unsigned int i);

/******************************************************************/

/* 主函数 */

/******************************************************************/

main()

{

unsigned char TempH,TempL;

TMOD|=0x01;//定时器

TH0=0xef;

TL0=0xf0;

IE=0x82;

TR0=1;

P2=0x00;

count=0;

while(1)

{

str[5]=0x39; //显示C符号

str[1]=tab[TempH/100]; //百位温度

str[2]=tab[(TempH%100)/10]; //十位温度

str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点

str[4]=tab[TempL];

if(flag_get==1) //定时读取当前温度

{

temp=ReadTemperature();

if(temp0x8000)

{

str[0]=0x40;//负号标志

temp=~temp; // 取反加1

temp +=1;

}

else

str[0]=0;

TempH=temp4;

TempL=temp0x0F;

TempL=TempL*6/10;//小数近似处

flag_get=0;

}

}

}

/******************************************************************/

/* 定时器中断 */

/******************************************************************/

void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔

{

TH0=0xef;//定时器重装值

TL0=0xf0;

num++;

if (num==50)

{num=0;

flag_get=1;//标志位有效

second++;

if(second=60)

{second=0;

minute++;

}

}

count++;

if(count==1)

{P2=0;

dataLED=str[0];}//数码管扫描

if(count==2)

{P2=1;

dataled=str[1];}

if(count==3)

{ P2=2;

dataled=str[2];

}

if(count==4)

{ P2=3;

dataled=str[3];

}

if(count==5)

{ P2=4;

dataled=str[4];

}

if(count==6)

{ P2=5;

dataled=str[5];

count=0;}

}

/******************************************************************/

/* 延时函数 */

/******************************************************************/

void delay(unsigned int i)//延时函数

{

while(i--);

}

/******************************************************************/

/* 初始化 */

/******************************************************************/

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay(10);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(5);

}

/******************************************************************/

/* 读一个字节 */

/******************************************************************/

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i0;i--)

{

DQ = 0; // 给脉冲信号

dat=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

delay(5);

}

return(dat);

}

/******************************************************************/

/* 写一个字节 */

/******************************************************************/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i0; i--)

{

DQ = 0;

DQ = dat0x01;

delay(5);

DQ = 1;

dat=1;

}

delay(5);

}

/******************************************************************/

/* 读取温度 */

/******************************************************************/

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b=8;

t=a+b;

return(t);

}

51单片机和DS18B20温度传感器、LCD1602液晶显示,NRF24L01无线传输模块 的无线温度监测系统的收发程序

/******************************无线温度发送***********************/

#include reg52.h

#include intrins.h

#define uint unsigned int

#define uchar unsigned char

#define TX_ADDR_WiTDH 5//发送地址宽度设置为5个字节

#define RX_ADDR_WITDH 5

#define TX_DATA_WITDH 5

#define RX_DATA_WITDH 5

/******************************************************************

// nRF24L01指令格式:

*******************************************************************/

#define R_REG.STER 0x00 // 读寄存器

#define W_REGISTER 0x20 // 写寄存器

#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据衡早和完成后,数据被清除,应用于接收模式

#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式

#define FLUSH_TX 0xE1 //咐盯 清除TX FIFO寄存器,应用于发射模式

#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式

#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发

#define NOP 0xFF // 空操作,可以用来读状态寄存器

/******************************************************************

// nRF24L01寄存器地址

*******************************************************************/

#define CONFIG 0x00 // 配置寄存器

#define EN_AA 0x01 // “自动应答”功能寄存

#define EN_RX_ADDR 0x02 // 接收通道使能寄存器

#define SETUP_AW 0x03 // 地址宽度设置寄存器

#define SETUP_RETR 0x04 // 自动重发设置寄存器

#define RF_CH 0x05 // 射频通道频率设置寄存器

#define RF_SETUP 0x06 // 射频设置寄存器

#define STATUS 0x07 // 状态寄存器

#define OBSERVE_TX 0x08 // 发送检测寄存器

#define CD 0x09 // 载波检测寄存器

#define RX_ADDR_P0 0x0A // 数据通道0接收地址寄存器

#define RX_ADDR_P1 0x0B // 数据通道1接收地址寄存器

#define RX_ADDR_P2 0x0C // 数据通道2接收地址寄存器

#define RX_ADDR_P3 0x0D // 数据通道3接收地址寄存器

#define RX_ADDR_P4 0x0E // 数据通道4接收地址寄存器

#define RX_ADDR_P5 0x0F /睁销/ 数据通道5接收地址寄存器

#define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 数据通道0有效数据宽度设置寄存器

#define RX_PW_P1 0x12 // 数据通道1有效数据宽度设置寄存器

#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器

#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器

#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器

#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器

#define FIFO_STATUS 0x17 // FIFO状态寄存器

//*********************************************************************************

uchar sta; // 状态变量

#define RX_DR (sta 0x40) // 接收功中断标志

#define TX_DS (sta 0x20) // 发射成功中断标志

#define MAX_RT (sta 0x10) // 重发溢出中断标志

***it CE=P1.5;

***it IRQ=P1^0;

***it csn=P1^4;

***it MOSI=P1^2;

***it MISO=P1^1;

***it SCK=P1^3;

//***it key=P1^0;

***it LED=P0^0;

***it DQ=P1^6;

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};

//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};

uchar RX_Buffer[RX_DATA_WITDH];

uchar Temp_Value[]={0x00,0x00};

uchar Temp=0;

uchar Display_Digit[]={0,0,0,0};

bit DS18B20_IS_OK=1;

uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6.6,7,8,8,9,9};//decimal fraction

void _delay_tus(uint x)

{

while(--x);

}

void _delay_us(uint x)

{

uint i,j;

for (j=0;jx;j++)

for (i=0;i12;i++);

}

void _delay_ms(uint x)

{

uint i,j;

for (j=0;jx;j++)

for (i=0;i120;i++);

}

/**************************************************/

/*函数功能:DS18B20初始化 */

/*入口参数:无 */

/*出口函数:status */

/**************************************************/

uchar DS18B20_Init(void)

{

uchar status;

DQ=1;

_delay_tus(10);

DQ=0;

_delay_tus(90);

DQ=1;

_delay_tus(8);

status=DQ;

_delay_tus(100);

DQ=1;

return status;

}

/**************************************************/

/*函数功能:从DS18B20读取一字节*/

/*入口参数:无 */

/*出口函数:dat(返回读取到数据) */

/**************************************************/

uchar Read_One_Byte(void)

{

uchar i,dat=0;

DQ=1;

_nop_();

for(i=8;i0;i--)

{

DQ=0;

dat=1;

DQ=1;

_nop_();_nop_();

if(DQ)

dat|=0x80;

_delay_tus(30);

DQ=1;

}

return dat;

}

/**************************************************/

/*函数功能:向DS18B20写一字节 */

/*入口参数:dat(dat写入DS18B20) */

/*出口函数:无 */

/**************************************************/

void Write_One_Byte(uchar dat)

{

uchar i;

for(i=8;i0;i--)

{

DQ=0;

DQ=dat0x01;

_delay_tus(5);

DQ=1;

dat=1;

}

}

/**************************************************/

/*函数功能:从DS18B20读取数据(数据)*/

/*入口参数:无 */

/*出口函数:无 */

/**************************************************/

void Read_Temp(void)

{

uchar ng=0;

if(DS18B20_Init()==1)

DS18B20_IS_OK=0;

else

{

Write_One_Byte(0xcc);

Write_One_Byte(0x44);

DS18B20_Init();

Write_One_Byte(0xcc);

Write_One_Byte(0xbe);

Temp_Value[0]=Read_One_Byte();

Temp_Value[1]=Read_One_Byte();

DS18B20_IS_OK=1;

}

if((Temp_Value[1]0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

ng=1;

}

Display_Digit[0]=df_tab[Temp_Value[0]0x0f];

Temp=((Temp_Value[0]0xf0)4)|((Temp_Value[1]0x07)4);

Display_Digit[3]=Temp/100;

Display_Digit[2]=Temp%100/10;

Display_Digit[1]=Temp%10;

}

/**************************************************/

/*函数功能:从DS18B20读取数据转换成ASCII码写入液晶 */

/*模块 */

/*入口参数:无 */

/*出口函数:无 */

/**************************************************/

/*void Display_Temperature(void)

{

uchar ng=0;

if((Temp_Value[1]0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

ng=1;

}

Display_Digit[0]=df_tab[Temp_Value[0]0x0f];

Temp=((Temp_Value[0]0xf0)4)|((Temp_Value[1]0x07)4);

Display_Digit[3]=Temp/100;

Display_Digit[2]=Temp%100/10;

Display_Digit[1]=Temp%10;

}

Display_LINE1[13]=0x43;

Display_LINE1[12]=0xdf;

Display_LINE1[11]=Display_Digit[0]+'0';

Display_LINE1[10]='.';

Display_LINE1[9]=Display_Digit[1]+'0';

Display_LINE1[8]=Display_Digit[2]+'0';

Display_LINE1[7]=Display_Digit[3]+'0';

if(Display_Digit[3]==0)

Display_LINE1[7]=' ';

if(Display_Digit[2]==0Display_Digit[3]==0)

Display_LINE1[8]=' ';

if(ng)

{

if(Display_LINE1[8]==' ')

Display_LINE1[8]='-';

else if(Display_LINE1[7]==' ')

Display_LINE1[7]='-';

else

Display_LINE1[6]='-';

}

LCD_POS(0);

Show_String(Display_LINE0);

LCD_POS(0x40);

Show_String(Display_LINE1);

}

void main(void)

{

Init_LCD();

Read_Temp();

_delay_ms(1000);

while(1)

{

Read_Temp();

if(DS18B20_IS_OK)

Display_Temperature();

_delay_ms(200);

}

}*/

/*nRF24L01初始化*/

void nRF24L01_Init(void)

{

_delay_us(2000);

CE=0;//待机模式Ⅰ

CSN=1;

SCK=0;

IRQ=1;

}

/*spi时序函数*/

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0;i8;i++)//一字节8位循环8次写入

{

if(byte0x80)//如果数据最高位是1//当访问多字节寄存器时首先要读/写的是最低字节的高位?

MOSI=1;//向NRF24L01写1

else //否则写0

MOSI=0;

byte=1;//低一位移到最高位

SCK=1;//SCK拉高,写入一位数据,同时读取一位数据

if(MISO)

byte|=0x01;

SCK=0;//SCK拉低

}

return byte;//返回读取一字节

}

/*SPI写寄存器一字节函数*/

/*reg:寄存器地址*/

/*value:一字节(值)*/

uchar SPI_W_Reg(uchar reg,uchar value)

{

uchar status;//返回状态

CSN=0;//SPI片选

status=SPI_RW(reg);//写入寄存器地址,同时读取状态

SPI_RW(value);//写入一字节

CSN=1;//

return status;//返回状态

}

/*SPI*/

uchar SPI_R_byte(uchar reg)

{

uchar reg_value;

CSN=0;//SPI片选

SPI_RW(reg);//写入地址

reg_value=SPI_RW(0);//读取寄存器的值

CSN=1;

return reg_value;//返回读取的值

}

/*SPI读取RXFIFO寄存器数据*/

/*reg:寄存器地址*/

/**Dat_Buffer:用来存读取的数据*/

/*DLen:数据度*/

uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)

{

uchar status,i;

CSN=0;//SPI片选

status=SPI_RW(reg);//写入寄存器地址,同时状态

for(i=0;iDlen;i++)

{

Dat_Buffer[i]=SPI_RW(0);//存储数据

}

CSN=1;

return status;

}

/*SPI向TXFIFO寄存器写入数据*/

/*reg:写入寄存器地址*/

/*TX_Dat_Buffer:存放需要发送的数据*/

/*Dlen:数据长度*/

uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)

{

uchar status,i;

CSN=0;//SPI片选,启动时序

status=SPI_RW(reg);

for(i=0;iDlen;i++)

{

SPI_RW(TX_Dat_Buffer[i]);//发送数据

}

CSN=1;

return status;

}

/*设置发送模式*/

void nRF24L01_Set_TX_Mode(uchar *TX_Data)

{

CE=0;//待机(写寄存器之前一定进入待机模式或掉电模式)

SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);/*写寄存器指令+接收节点地址+地址宽度*/

SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/*为了接收设备应答信号,接收通道0地址与发送地址相同*/

SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*写有效数据地址+有效数据+有效数据宽度*/

SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*接收通道0自动应答*/

SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*使能接收通道0*/

SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*自动重发延时250US+86US,重发10次*/

//SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);

SPI_W_Reg(W_REGISTER+RF_CH,0x40);/*(2400+40)MHZ选择射频通道0X40*/

SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps速率,发射功率:0DBM,低噪声大器增益*/

SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*发送模式,上电,16位CRC校验,CRC使能*/

CE=1;//启动发射

_delay_ms(5);/*CE高电平持续时间最少10US以上*/

}

uchar Check_Rec(void)

{

uchar status;

sta=SPI_R_byte(R_REGISTER+STATUS);

if(RX_DR)

{

CE=0;

SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);

status=1;

}

SPI_W_Reg(W_REGISTER+STATUS,0xff);

return status;

}

/*检测应答信号*/

uchar Check_Ack(void)

{

sta=SPI_R_byte(R_REGISTER+STATUS);/*读取寄存状态*/

if(TX_DS||MAX_RT)/*如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值*/

{

SPI_W_Reg(W_REGISTER+STATUS,0xff);

CSN=0;

SPI_RW(FLUSH_TX);

CSN=1;

return 0;

}

else

return 1;

}

void main(void)

{

uchar i;

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

nRF24L01_Init();

Read_Temp();

_delay_ms(1000);

while(1)

{

Read_Temp();

if(DS18B20_IS_OK)

{

for(i=0;iTX_DATA_WITDH-4;i++)//减1是因为[_a1***_]一位为结束标志

{

LED=~LED;

nRF24L01_Set_TX_Mode(Display_Digit[i]);

_delay_ms(100);

while(Check_Ack());

//LED=0;

}

}

}

}

/******************************无线温度接收***********************/

#include reg52.h

#include intrins.h

#define uint unsigned int

#define uchar unsigned char

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节

#define RX_ADDR_WITDH 5

#define TX_DATA_WITDH 5

#define RX_DATA_WITDH 5

/******************************************************************

// nRF24L01指令格式:

*******************************************************************/

#define R_REGISTER 0x00 // 读寄存器

#define W_REGISTER 0x20 // 写寄存器

#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式

#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式

#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式

#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式

#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射

#define NOP 0xFF // 空操作,可以用来读状态寄存器

/******************************************************************

// nRF24L01寄存器地址

*******************************************************************/

#define CONFIG 0x00 // 配置寄存器

#define EN_AA 0x01 // “自动应答”功能寄存器

#define EN_RX_ADDR 0x02 // 接收通道使能寄存器

#define SETUP_AW 0x03 // 地址宽度设置寄存器

#define SETUP_RETR 0x04 // 自动重发设置寄存器

#define RF_CH 0x05 // 射频通道频率设置寄存器

#define RF_SETUP 0x06 // 射频设置寄存器

#define STATUS 0x07 // 状态寄存器

#define OBSERVE_TX 0x08 // 发送检测寄存器

#define CD 0x09 // 载波检测寄存器

#define RX_ADDR_P0 0x0A // 数据通道0接收地址寄存器

#define RX_ADDR_P1 0x0B // 数据通道1接收地址寄存器

#define RX_ADDR_P2 0x0C // 数据通道2接收地址寄存器

#define RX_ADDR_P3 0x0D // 数据通道3接收地址寄存器

#define RX_ADDR_P4 0x0E // 数据通道4接收地址寄存器

#define RX_ADDR_P5 0x0F // 数据通道5接收地址寄存器

#define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 数据通道0有效数据宽度设置寄存器

#define RX_PW_P1 0x12 // 数据通道1有效数据宽度设置寄存器

#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器

#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器

#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器

#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器

#define FIFO_STATUS 0x17 // FIFO状态寄存器

//*********************************************************************************

uchar sta; // 状态变量

#define RX_DR (sta 0x40) // 接收成功中断标志

#define TX_DS (sta 0x20) // 发射成功中断标志

#define MAX_RT (sta 0x10) // 重发溢出中断标志

***it CE=P1^5; //RX/TX模式选择端

***it IRQ=P1^0; //可屏蔽中断端

***it CSN=P1^4; //SPI片选端//就是SS

***it MOSI=P1^2;//SPI主机输出从机输入

***it MISO=P1^1;//SPI主机输出从机输出端

***it SCK=P1^3;//SPI时钟端

***it LED=P0^0;

***it key=P2^0;

***it LCD_RS=P2^2;

***it LCD_RW=P2^1;

***it LCD_EN=P2^0;

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};

uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar RX_Buffer[RX_DATA_WITDH];

uchar code Display_LINE0[]={" FROM NRF24L01:"};

uchar Display_LINE1[]={" TEMP: "};

void _delay_us(uint x)

{

uint i,j;

for (j=0;jx;j++)

for (i=0;i12;i++);

}

void _delay_ms(uint x)

{

uint i,j;

for (j=0;jx;j++)

for (i=0;i120;i++);

}

bit LCD_Busy(void)//测忙

{

bit LCD_Status;//返回值变量

LCD_RS=0;//读取状态

LCD_RW=1;

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_Status=(bit)(P30x80);

LCD_EN=0;

return LCD_Status;

}

void LCD_Write_Command(uchar cmd)//写指令

{

//while(LCD_Busy());

LCD_RS=0;//

LCD_RW=0;

LCD_EN=0;

_nop_();_nop_();

P3=cmd;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=0;

}

void LCD_Write_Data(uchar dat)//写数据

{

//while(LCD_Busy());//每次写数据操作之前均需要检测忙信号

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P3=dat;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=0;

}

void Init_LCD(void)//液晶初始化

{

_delay_ms(15);//延时15MS

LCD_Write_Command(0x38);

_delay_ms(5);

LCD_Write_Command(0x38);

_delay_ms(5);

LCD_Write_Command(0x38);//以后每次写指令操作之前均需要检测忙信号

//while(LCD_Busy());

_delay_ms(5);

LCD_Write_Command(0x01);//清屏

//while(LCD_Busy());

_delay_ms(5);

LCD_Write_Command(0x38);//设置16*2显示,5*7点阵,8位数据接口

_delay_ms(5);

//while(LCD_Busy());

LCD_Write_Command(0x0c);//开显示,不显示光标

_delay_ms(5);

//while(LCD_Busy());

LCD_Write_Command(0x06);//当读或写一个字符后地址指针加一,且光标加一

}

void LCD_POS(uchar pos)//字符显示位置

{

LCD_Write_Command(0x80|pos);

}

void Show_String(uchar *str)//显示字符串

{

while(*str!='\0')

LCD_Write_Data(*str++);

}

void nRF24L01_Init(void)

{

_delay_us(2000);

CE=0;

CSN=1;

SCK=0;

IRQ=1;

}

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0;i8;i++)

{

if(byte0x80)

MOSI=1;

else

MOSI=0;

byte=1;

SCK=1;

if(MISO)

byte|=0x01;

SCK=0;

}

return byte;

}

uchar SPI_W_Reg(uchar reg,uchar value)

{

uchar status;

CSN=0;

status=SPI_RW(reg);

SPI_RW(value);

CSN=1;

return status;

}

uchar SPI_R_byte(uchar reg)

{

uchar status;

CSN=0;

SPI_RW(reg);

status=SPI_RW(0);

CSN=1;

return status;

}

uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)

{

uchar reg_value,i;

CSN=0;

reg_value=SPI_RW(reg);

for(i=0;iDlen;i++)

{

Dat_Buffer[i]=SPI_RW(0);

}

CSN=1;

return reg_value;

}

uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)

{

uchar reg_value,i;

CSN=0;

reg_value=SPI_RW(reg);

for(i=0;iDlen;i++)

{

SPI_RW(TX_Dat_Buffer[i]);

}

CSN=1;

return reg_value;

}

void nRF24L01_Set_RX_Mode(void)

{

CE=0;//待机

//SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);

SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);

SPI_W_Reg(W_REGISTER+EN_AA,0x01);

SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);

//SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);

SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);

SPI_W_Reg(W_REGISTER+RF_CH,0x40);

SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);

SPI_W_Reg(W_REGISTER+CONFIG,0x0f);

CE=1;

_delay_ms(5);

}

uchar nRF24L01_RX_Data(void)

{

//uchar i,status;

sta=SPI_R_byte(R_REGISTER+STATUS);

if(RX_DR)

{

CE=0;

SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);

//P3=RX_Buffer[0];

SPI_W_Reg(W_REGISTER+STATUS,0xff);

CSN=0;

SPI_RW(FLUSH_RX);

CSN=1;

return 1;

}

else

return 0;

}

void main(void)

{

uchar i,RX_Temp_Value[RX_DATA_WITDH];//ng;

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

Init_LCD();

nRF24L01_Init();

_delay_us(1000);

LCD_POS(0);

Show_String(Display_LINE0);

while(1)

{

nRF24L01_Set_RX_Mode();

//_delay_ms(100);

if(nRF24L01_RX_Data())

{

for(i=0;iRX_DATA_WITDH;i++)

{

RX_Temp_Value[i]=RX_Buffer[i];

LED=~LED;

}

}

Display_LINE1[7]=RX_Temp_Value[3]+'0';

Display_LINE1[8]=RX_Temp_Value[2]+'0';

Display_LINE1[9]=RX_Temp_Value[1]+'0';

Display_LINE1[10]='.';

Display_LINE1[11]=RX_Temp_Value[0]+'0';

Display_LINE1[12]=0xdf;

Display_LINE1[13]=0x43;

if(RX_Temp_Value[3]==0)

Display_LINE1[7]=' ';

/*if(RX_Temp_Value[2]==0RX_Temp_Value[3]==0)

Display_LINE1[8]=' ';

if(ng)

{

if(Display_LINE1[8]==' ')

Display_LINE1[8]='-';

else if(Display_LINE1[7]==' ')

Display_LINE1[7]='-';

else

Display_LINE1[6]='-';*/

LCD_POS(0x40);

Show_String(Display_LINE1);

}

}

通过测试的,希望能帮助到你!

c51 单片机DS18B20温度计

试试这个

io口改一下

#include reg51.h

#include intrins.h 裤拿

#define uchar unsigned char

#define uint unsigned int

***it DQ = P2^7 ; //定义DS18B20端口DQ

***it BEEP=P2^1 ; //蜂鸣器驱动线

bit presence ;

***it LCD_RS = P3^0 ;

***it LCD_RW = P3^1 ;

***it LCD_EN = P3^2 ;

uchar code cdis1[ ] = {" "} ;

uchar code cdis2[ ] = {" WENDU: . C "} ;

uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;

uchar code cdis4[ ] = {" please CHECK "} ;

unsigned char data temp_data[2] = {0x00,0x00} ;

unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;

unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,

0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;

void beep() ;

unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;

/*******************************************************************/

void delay1(int ms)

{

unsigned char y ;

while(ms--)

{

for(y = 0 ; y250 ; y++)

{

_nop_() ;

_nop_() ;

_nop_() ;

_nop_() ;

}

}

}

/没胡******************************************************************/

/*检查枯纯拦LCD忙状态 */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */

/******************************************************************/

bit lcd_busy()

{

bit result ;

LCD_RS = 0 ;

LCD_RW = 1 ;

LCD_EN = 1 ;

delayNOP() ;

result = (bit)(P00x80) ;

LCD_EN = 0 ;

return(result) ;

}

/*写指令数据到LCD */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */

/*******************************************************************/

void lcd_wcmd(uchar cmd)

{

while(lcd_busy()) ;

LCD_RS = 0 ;

LCD_RW = 0 ;

LCD_EN = 0 ;

_nop_() ;

_nop_() ;

P0 = cmd ;

delayNOP() ;

LCD_EN = 1 ;

delayNOP() ;

LCD_EN = 0 ;

}

/*******************************************************************/

/*写显示数据到LCD */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */

/*******************************************************************/

void lcd_wdat(uchar dat)

{

while(lcd_busy()) ;

LCD_RS = 1 ;

LCD_RW = 0 ;

LCD_EN = 0 ;

P0 = dat ;

delayNOP() ;

LCD_EN = 1 ;

delayNOP() ;

LCD_EN = 0 ;

}

/* LCD初始化设定 */

/*******************************************************************/

void lcd_init()

{

delay1(15) ;

lcd_wcmd(0x01) ; //清除LCD的显示内

lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据

delay1(5) ;

lcd_wcmd(0x38) ;

delay1(5) ;

lcd_wcmd(0x38) ;

delay1(5) ;

lcd_wcmd(0x0c) ; //显示开,关光标

delay1(5) ;

lcd_wcmd(0x06) ; //移动光标

delay1(5) ;

lcd_wcmd(0x01) ; //清除LCD的显示内容

delay1(5) ;

}

/* 设定显示位置 */

/*******************************************************************/

void lcd_pos(uchar pos)

{

lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量

}

/*自定义字符写入CGRAM */

/*******************************************************************/

void writetab()

{

unsigned char i ;

lcd_wcmd(0x40) ; //写CGRAM

for (i = 0 ; i 8 ; i++)

lcd_wdat(mytab[ i ]) ;

}

/*us级延时函数 */

/*******************************************************************/

void Delay(unsigned int num)

{

while( --num ) ;

}

/*初始化ds1820 */

/*******************************************************************/

Init_DS18B20(void)

{

DQ = 1 ; //DQ复位

Delay(8) ; //稍做延时

DQ = 0 ; //单片机将DQ拉低

Delay(90) ; //精确延时 大于 480us

DQ = 1 ; //拉高总线

Delay(8) ;

presence = DQ ; //如果=0则初始化成功 =1则初始化失败

Delay(100) ;

DQ = 1 ;

return(presence) ; //返回信号,0=presence,1= no presence

}

/* 读一个字节 */

/*******************************************************************/

ReadOneChar(void)

{

unsigned char i = 0 ;

unsigned char dat = 0 ;

for (i = 8 ; i 0 ; i--)

{

DQ = 0 ; // 给脉冲信号

dat = 1 ;

DQ = 1 ; // 给脉冲信号

if(DQ)

dat |= 0x80 ;

Delay(4) ;

}

return (dat) ;

}

/* 写一个字节 */

/*******************************************************************/

WriteOneChar(unsigned char dat)

{

unsigned char i = 0 ;

for (i = 8 ; i 0 ; i--)

{

DQ = 0 ;

DQ = dat0x01 ;

Delay(5) ;

DQ = 1 ;

dat=1 ;

}

}

/* 读取温度 */

/*******************************************************************/

Read_Temperature(void)

{

Init_DS18B20() ;

WriteOneChar(0xCC) ; // 跳过读序号列号的操作

WriteOneChar(0x44) ; // 启动温度转换

Init_DS18B20() ;

WriteOneChar(0xCC) ; //跳过读序号列号的操作

WriteOneChar(0xBE) ; //读取温度寄存器

temp_data[0] = ReadOneChar() ; //温度低8位

temp_data[1] = ReadOneChar() ; //温度高8位

}

/* 数据转换与温度显示 */

/*******************************************************************/

Disp_Temperature()

{

display[4]=temp_data[0]0x0f ;

display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值

display[4]=((temp_data[0]0xf0)4)|((temp_data[1]0x0f)4) ;

display[3]=display[4]/100+0x30 ;

display[1]=display[4]%100 ;

display[2]=display[1]/10+0x30 ;

display[1]=display[1]%10+0x30 ;

if(display[3]==0x30) //高位为0,不显示

{

display[3]=0x20 ;

if(display[2]==0x30) //次高位为0,不显示

display[2]=0x20 ;

}

lcd_pos(0x48) ;

lcd_wdat(display[3]) ; //百位数显示

lcd_pos(0x49) ;

lcd_wdat(display[2]) ; //十位数显示

lcd_pos(0x4a) ;

lcd_wdat(display[1]) ; //个位数显示

lcd_pos(0x4c) ;

lcd_wdat(display[0]) ; //小数位数显示

}

/*******************************************************************/

/* 蜂鸣器响一声 */

/*******************************************************************/

void beep()

{

unsigned char y ;

for (y=0 ;y100 ;y++)

{

Delay(60) ;

BEEP=!BEEP ; //BEEP取反

}

BEEP=1 ; //关闭蜂鸣器

Delay(40000) ;

}

/* DS18B20 OK 显示菜单 */

/*******************************************************************/

void Ok_Menu ()

{

uchar m ;

lcd_init() ; //初始化LCD

lcd_pos(0) ; //设置显示位置为第一行的第1个字符

m = 0 ;

while(cdis1[m] != '\0')

{ //显示字符

lcd_wdat(cdis1[m]) ;

m++ ;

}

lcd_pos(0x40) ; //设置显示位置为第行第1个字符

m = 0 ;

while(cdis2[m] != '\0')

{

lcd_wdat(cdis2[m]) ; //显示字符

m++ ;

}

writetab() ; //自定义字符写入CGRAM

delay1(5) ;

lcd_pos(0x4d) ;

lcd_wdat(0x00) ; //显示自定义字符

}

/* DS18B20 ERROR 显示菜单 */

/*******************************************************************/

void Error_Menu ()

{

uchar m ;

lcd_init() ; //初始化LCD

lcd_pos(0) ; //设置显示位置为第一行的第1个字符

m = 0 ;

while(cdis3[m] != '\0')

{ //显示字符

lcd_wdat(cdis3[m]) ;

m++ ;

}

lcd_pos(0x40) ; //设置显示位置为第二行第1个字符

m = 0 ;

while(cdis4[m] != '\0')

{

lcd_wdat(cdis4[m]) ; //显示字符

m++ ;

}

}

/* 主函数 */

/************************************/

void main()

{

Ok_Menu () ;

do

{

Read_Temperature() ;

Disp_Temperature() ;

}

while(!presence) ;

Error_Menu () ;

do

{

Init_DS18B20() ;

beep() ;

}

while(presence) ;

}

关于单片机pos是什么指令和单片机posi的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多方面的信息,记得收藏关注本站。