基于52单片机的酒店标准房设计的C程序.docx_第1页
基于52单片机的酒店标准房设计的C程序.docx_第2页
基于52单片机的酒店标准房设计的C程序.docx_第3页
基于52单片机的酒店标准房设计的C程序.docx_第4页
基于52单片机的酒店标准房设计的C程序.docx_第5页
免费预览已结束,剩余22页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序:#include #include #define uint unsigned int#define uchar unsigned chartypedef unsigned char byte;#define tx_adr_width 5 / 5 bytes tx(rx) address width#define tx_pload_width 20 / 20 bytes tx payload#define rx_pload_width20/ spi(nrf24l01) commands #define read_reg 0x00 / define read command to register #define write_reg 0x20 / define write command to register #define wr_tx_pload 0xa0 / define tx payload register address #define flush_tx 0xe1 / define flush tx register command #define reuse_tx_pl 0xe3 / define reuse tx payload register command /*/ / spi(nrf24l01) registers(addresses) #define config 0x00 / config register address #define en_aa 0x01 / enable auto acknowledgment register address #define en_rxaddr 0x02 / enabled rx addresses register address #define setup_aw 0x03 / setup address width register address #define setup_retr 0x04 / setup auto. retrans register address #define rf_ch 0x05 / rf channel register address #define rf_setup 0x06 / rf setup register address #define status 0x07 / status register address #define observe_tx 0x08 / observe tx register address #define rx_addr_p0 0x0a / rx address pipe0 register address #define tx_addr 0x10 / tx address register address #define rx_pw_p0 0x11 / rx payload width, pipe0 register address uchar const tx_addresstx_adr_width = 0x34,0x43,0x10,0x10,0x01; / 静态发送地址sbit miso=p14; sbit mosi=p34;sbitsck =p35;sbitce =p17;sbitcsn =p36;sbitirq =p33;sbit beef= p15;/蜂鸣器sbit dout= p16;/气体检测sbit led1 = p21;sbit led2 = p22;sbit led3 = p23;sbit led4 = p24;sbit led5 = p25;sbit led6 = p26;sbit led7 =p27;sbit stratflag= p32;uchar irtime;uchar bitnum;uchar ircode4;uchar irprosok;uchar disp8;void t0init(void)tmod=0x02;th0=0x00;tl0=0x00;et0=1;ea=1;tr0=1;void int0init(void)ea=1;ex0=1;it0=1;void irwork(void)disp0=ircode0/16;disp1=ircode0%16;disp2=ircode1/16;disp3=ircode1%16;disp4=ircode2/16;disp5=ircode2%16;disp6=ircode3/16;disp7=ircode3%16;void delay2ms(unsigned int ms)/延时1毫秒(不够精确的)unsigned int i,j; for(i=0;ims;i+) for(j=0;j200;j+);void display(void) if(ircode2=24) led2=led2;delay2ms(500); else if(ircode2=94) led3 =led3;delay2ms(500); else if(ircode2=8) led4 =led4;delay2ms(500); else if(ircode2=28) led5 =led5;delay2ms(500); else if(ircode2=90) led6 =led6;delay2ms(500); else if(ircode2=74) led1 = 1; led2 = 1;led3 = 1; led4 = 1;led5 = 1; led6 = 1; ircode2=0;/*/void delay10us()uchar i;i+;i+;i+;i+;/ 写一个字节到 24l01,同时读出一个字节 uchar spi_rw(uchar byte) uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit mosi = (byte & 0x80); / output byte, msb to mosi byte = (byte 1); / shift next bit into msb. sck = 1; / set sck high. byte |= miso; / capture current miso bit sck = 0; / .then set sck low again return(byte); / return read byte / 向寄存器 reg写一个字节,同时返回状态字节 uchar spi_rw_reg(byte reg, byte value) uchar status; csn = 0; / csn low, init spi transa status = spi_rw(reg); / select register spi_rw(value); / .and write value to it. csn = 1; / csn high again return(status); / return nrf24l01 status byte / 写入 bytes 字节的数据 uchar spi_write_buf(byte reg, byte *pbuf, byte bytes) uchar status,byte_ctr; csn = 0; status = spi_rw(reg); for(byte_ctr=0; byte_ctrbytes; byte_ctr+) / spi_rw(*pbuf+); csn = 1; / set csn high again return(status); / / 发送函数 void nrf24l01_txpacket(unsigned char * tx_buf) ce=0; spi_write_buf(wr_tx_pload, tx_buf, tx_pload_width); / writes data to tx payload spi_rw_reg(write_reg + config, 0x0e); / set pwr_up bit, enable crc(2 bytes) & prim:tx. max_rt & tx_ds enabled. ce=1; delay10us(); ce=0; byte spi_read(byte reg)byte reg_val; csn = 0; / csn low, initialize spi communication. spi_rw(reg); / select register to read from. reg_val = spi_rw(0); / .then read registervalue csn = 1; / csn high, terminate spi communication return(reg_val); / return register value/ 配置函数 void nrf24l01_config(void) /initial io ce=0; / chip enable csn=1; / spi disable sck=0; / spi clock line init high ce=0; spi_rw_reg(write_reg + config, 0x0f); / set pwr_up bit, enable crc(2 bytes) & prim:rx. rx_dr enabled. spi_rw_reg(write_reg + en_aa, 0x01); / enable auto.ack:pipe0 spi_rw_reg(write_reg + en_rxaddr, 0x01); / enable pipe0 spi_rw_reg(write_reg + setup_aw, 0x03); / setup address width=5 bytes spi_rw_reg(write_reg + setup_retr, 0x1a); / 500us + 86us, 10 retrans. spi_rw_reg(write_reg + rf_ch, 0); / select rf channel 0 spi_rw_reg(write_reg + rf_setup, 0x07); / tx_pwr:0dbm, datarate:1mbps, lna:hcurr spi_rw_reg(write_reg+rx_pw_p0, rx_pload_width); /number of bytes in rx payload in data pipe 0 spi_write_buf(write_reg + tx_addr, tx_address, tx_adr_width); / writes tx_address to nrf24l01spi_write_buf(write_reg + rx_addr_p0, tx_address, tx_adr_width); / rx_addr0 same as tx_adr for auto.ackce=1; uchar data discop4=0; unsigned char txbuf20=0; /发送数据的缓冲区unsigned char flag;unsigned char bdata sta;sbitrx_dr=sta6;sbittx_ds=sta5;sbitmax_rt=sta4;sbit key=p37;void delay1ms(unsigned int ms)/延时1毫秒(不够精确的)unsigned int i,j; for(i=0;ims;i+) for(j=0;j32)/检测引导码bitnum=0;irdatabitnum=irtime;irtime=0;bitnum+;if(bitnum=33)bitnum=0;irreceok=1;if(irreceok)irreceok=0;for(j=0;j4;j+)for(i=0;i1;if(irdatak6) value=value | 0x80;k+;ircodej=value;irprosok=1;#include#include #define unchar unsigned char#define unint unsigned intunchar mima4=0,1,2,3;unchar input= ;sbit led1=p11;sbit in1=p12;sbit in2=p13;sbit ena=p14;sbit in3=p30;sbit in4=p31;sbit enb=p32;unchar code lcd=0x31,0x35,0x39,0x44, 0x32,0x36,0x41,0x45, 0x33,0x37,0x42,0x46, 0x34,0x38,0x43,0x47,0x20; unchar code xiaoma =0,4, 8,12, 1,5, 9,13, 2,6,10,14, 3,7,11,15; unchar code key_table=0x7e,0xbe,0xde,0xee, 0x7d,0xbd,0xdd,0xed, 0x7b,0xbb,0xdb,0xeb, 0x77,0xb7,0xd7,0xe7;sbit lcden=p26;sbit lcdrs=p27;sbit lcdrw=p21;sbit beef=p15;unchar code zifu=num:;unchar code tablem=num is true!;unchar code table1=num is error;unchar num;void write_com(unchar com);void write_date(unchar date);typedef unsigned char unint8;typedef unsigned char unint16;unsigned char str1= ;unsigned char str2= ;unsigned char code dis1 = trh rh: ;unsigned char code dis2 = trh t: ;sbit trh = p16;/温湿度传感器dht11数据接入sbit st = p17;/态显示,是为了方便调试,具体使用的时候可以不要unint8 com_data,untemp,temp1;unint8 respond;void delaynop() _nop_(); _nop_(); _nop_(); _nop_();void delay_ms(unsigned char ms) unsigned char i; while(ms-) for(i = 0; i0;x-)for(y=248;y0;y-);void init();void delay1()unint n=30000;while(n-);void delays()unint n=3000;while(n-);char receive() unint8 i; st=0; com_data=0; for(i=0;i=7;i+) respond=2; while(!trh)&respond+); delay_us(); delay_us(); delay_us(); if(trh) temp1=1; respond=2; while(trh)&respond+); else temp1=0; com_data=1; com_data|=temp1; return(com_data); /*/*/湿度读取子程序 /温度高8位= tl_data/温度低8位= th_data/湿度高8位= rh_data/湿度低8位= rh_data/校验 8位 = ck_data/调用的程序有 delay();, delay_5us();,receive(); /*/void read_trh() unint8 th_data,tl_data,rh_data,rl_data,ck_data; unint8 th_temp,tl_temp,rh_temp,rl_temp,ck_temp; /主机拉低18ms trh=0; delay_ms(18); trh=1; /data总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us(); /delay_us(); /delay_us();delay_us();delay_us();delay_us(); /主机设为输入 判断从机响应信号 trh=1; /判断dht11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!trh) respond=2; /判断dht11发出 80us 的低电平响应信号是否结束 while(!trh)& respond+); respond=2; /判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(trh & respond+); /数据接收状态 rh_temp = receive(); rl_temp = receive(); th_temp = receive(); tl_temp = receive(); ck_temp = receive(); trh=1;st=1; /数据校验 untemp=(rh_temp+rl_temp+th_temp+tl_temp); if(untemp=ck_temp) rh_data = rh_temp; rl_data = rl_temp; th_data = th_temp; tl_data = tl_temp; ck_data = ck_temp; /湿度整数部分 str10 = (char)(0x30+rh_data/10); str11 = (char)(0x30+rh_data%10); str12 = 0x2e; /小数点 /湿度小数部分 str13 = (char)(0x30+rl_data/10); str15 = 0x25; /% str16 = 0x52; /r str17 = 0x48; /h /温度整数部分 str20 = (char)(0x30+th_data/10); str21 = (char)(0x30+th_data%10); str22 = 0x2e; /小数点 /温度小数部分 str23 = (char)(0x30+tl_data/10); str25 = 0x27; / str26 = 0x43; /cvoid main()unchar x;unchar temp,key,num,i,s;unchar a=0;unchar y=1;unchar num1=0;unchar error=0;init();lcdrw=0;while(1)p3=0xf0;/置行为0,列为1,读列值if(p3!=0xf0)/判断有无键盘按下 delays();/减震if(p3!=0xf0)/如果if任然为真。这是可以确定有按键for(s=0;s4;s+) write_com(0x80+0x00+s); write_date(zifus);for(s=0;s12;s+)write_com(0x80+0x04+s); write_date(lcd16);for(s=0;s15;s+)write_com(0x80+0x40+s);write_date(lcd16); dop3=0xf0;/置行为0,列为1,读列值if(p3!=0xf0)/判断有无键盘按下 delays();/减震if(p3!=0xf0)/如果if任然为真。这是可以确定有按键 a=a+1;temp=p3;/存储列读入的值p3=0x0f;/置列为0 行为1,读行值key=temp|p3;/将行列综合,赋值给keyfor(i=0;i16;i+)if(key=key_tablei)/读按键值表,确定读入的按键值 num=i;inputa-1=xiaomai;write_com(0x80+0x03+a); write_date(lcdnum);if(a=4)write_com(0x80+0x03+a); write_date(lcdnum);for(s=1;s5;s+)write_com(0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论