绘本馆网站建设wordpress 扫描工具
绘本馆网站建设,wordpress 扫描工具,公司概况,具备网站维护与建设能力一、系统方案
本设计采用STC89C5单片机作为主控制器#xff0c;从机采用DHT11传感器采集温湿度、按键设置报警阀值#xff0c;液晶1602显示#xff0c;蜂鸣器报警#xff0c;无线NRF2401模块。
二、硬件设计 原理图如下#xff1a;
三、单片机软件设计 1、首先是系统…一、系统方案
本设计采用STC89C5单片机作为主控制器从机采用DHT11传感器采集温湿度、按键设置报警阀值液晶1602显示蜂鸣器报警无线NRF2401模块。
二、硬件设计 原理图如下
三、单片机软件设计 1、首先是系统初始化 init_io(); // 初始化IO RX_Mode(); // 设置为接收模式 LCD_Initial(); //液晶初始化 2、液晶显示程序 //1602程序 //内部等待函数************************************************************* unsigned char LCD_Wait(void) { RS0; RW1; nop(); E1; nop(); E0; return DBPort; } //向LCD写入命令或数据******************************************************** #define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING 0x02 // 光标返回原点 void LCD_Write(bit style, unsigned char input) { E0; RSstyle; RW0; nop(); DBPortinput; nop();//注意顺序 E1; nop();//注意顺序 E0; nop(); LCD_Wait(); }
//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开 #define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标 #define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动 #define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode) { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }
//设置输入模式************************************************************ #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移 #define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode) { LCD_Write(LCD_COMMAND, 0x04|InputMode); }
//初始化LCD************************************************************ void LCD_Initial() { E0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 }
//液晶字符输入的位置************************ void GotoXY(unsigned char x, unsigned char y) { if(y0) LCD_Write(LCD_COMMAND,0x80|x); if(y1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); }
//将字符输出到液晶显示 void Print(unsigned char *str) { while(*str!‘\0’) { LCD_Write(LCD_DATA,*str); str; } } 3、按键检测程序 void key() { if (k10) //调整按键检测 { delay(10); if (k10) { presskeynum; if(presskeynum5) presskeynum0; while(k10); LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 } } if(presskeynum1)//温度上限设置 { if(k20)// 加 { delay(10); temp_high; if (temp_high99) temp_high0; if (temp_high0) temp_high99; while(k20); //加上此句必须松按键才处理 } if(k30)//减 { delay(10); temp_high–; if (temp_high99) temp_high0; if (temp_high0) temp_high99; while(k30); //加上此句必须松按键才处理 } } if(presskeynum2)//温度下限设置 { if(k20)// 加 { delay(10); temp_low; if (temp_low99) temp_low0; if (temp_low0) temp_low99; while(k20); } if(k30) { delay(10); temp_low–; if (temp_low99) temp_low0; if (temp_low0) temp_low99; while(k30); } } if(presskeynum3)//湿度上限设置 { if(k20)// 加 { delay(10); humi_high; if (humi_high99) humi_high0; if (humi_high0) humi_high99; while(k20); } if(k30) { delay(10); humi_high–; if (humi_high99) humi_high0; if (humi_high0) humi_high99; while(k30); } } if(presskeynum4)//湿度下限设置 { if(k20)//加 { delay(10); humi_low; if (humi_low99) humi_low0; if (humi_low0) humi_low99; while(k20); } if(k30)// 减 { delay(10); humi_low–; if (humi_low99) humi_low0; if (humi_low0) humi_low99; while(k30); } } if(k40)// 退出键 { delay(10); if(k40) { while(k40); presskeynum0; LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏}} }
4、核心算法程序 /**************************************************/
/************************************************** *函数名 SPI_RW *函数功能 读写一个字节 *输入 无 *输出 无 // uchar SPI_RW(uchar byte) { uchar i; for(i0; i8; i) // 循环8次 { MOSI (byte 0x80); // byte最高位输出到MOSI byte 1; // 低一位移位到最高位 SCK 1; // 拉高SCK,nRF24L01从MOSI读取1位数据,同时从MISO输出1位数据 byte | MISO; // 读MISO到byte最低位 SCK 0; // SCK置低 } return(byte); // 返回读取一个字节 } //
/************************************************** *函数名 SPI_RW_Reg *函数功能 写数据到reg *输入 无 *输出 无 // uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status; CSN 0; // CSN置低开始传输数据 status SPI_RW(reg); // 选择寄存器同时返回状态字 SPI_RW(value); // 写数据到寄存器 CSN 1; // CSN拉高结束数据传输 return(status); // 返回状态寄存器 } //
/************************************************** *函数名 SPI_Read *函数功能 从reg寄存器读字节 *输入 无 *输出 无 /**************************************************/ uchar SPI_Read(uchar reg) {
uchar reg_val;CSN 0; // CSN置低,开始传输数据SPI_RW(reg); // 选择寄存器reg_val SPI_RW(0); // 然后从该寄存器读数据CSN 1; // CSN拉高,结束数据传输return(reg_val); // 返回寄存器数据} /**************************************************/
/************************************************** *函数名 SPI_Read_Buf *函数功能 从reg寄存器读数据 *输入 无 *输出 无 // uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN 0; // CSN置低开始传输数据 status SPI_RW(reg); // 选择寄存器同时返回状态字 for(i0; ibytes; i) pBuf[i] SPI_RW(0); // 逐个字节从nRF24L01读出 CSN 1; // CSN拉高结束数据传输 return(status); // 返回状态寄存器 } //
/************************************************** *函数名 SPI_Write_Buf *函数功能 把缓存的数据写入NRF *输入 无 *输出 无 // uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN 0; // CSN置低开始传输数据 status SPI_RW(reg); // 选择寄存器同时返回状态字 for(i0; ibytes; i) SPI_RW(pBuf[i]); // 逐个字节写入nRF24L01 CSN 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } //
/************************************************** *函数名 RX_Mode *函数功能 将nrf设置为接收模式 *输入 无 *输出 无 // void RX_Mode(void) { CE 0; SPI_Write_Buf(WRITE_REG RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 SPI_RW_Reg(WRITE_REG EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 SPI_RW_Reg(WRITE_REG RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG CONFIG, 0x0f); // CRC使能16位CRC校验上电接收模式 delay_ms(150); CE 1; // 拉高CE启动接收设备 } //
/************************************************** *函数名 TX_Mode *函数功能 将nrf设置为发送模式 *输入 无 *输出 无 // void TX_Mode(uchar * BUF) { CE 0; SPI_Write_Buf(WRITE_REG TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址 SPI_Write_Buf(WRITE_REG RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 应答接收设备接收通道0地址和发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO SPI_RW_Reg(WRITE_REG EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG SETUP_RETR, 0x0a); // 自动重发延时等待250us86us自动重发 SPI_RW_Reg(WRITE_REG RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG RF_SETUP, 0x07); // 数据传输率1Mbps发射功率0dBm低噪声放大器增益 SPI_RW_Reg(WRITE_REG CONFIG, 0x0e); // CRC使能16位CRC校验上电 delay_ms(150); CE 1; } //
/************************************************** *函数名 Check_ACK *函数功能 检查接收设备有无数据包设定没有应答信号重发 *输入 无 *输出 无 /**************************************************/ uchar Check_ACK(bit clear) { while(IRQ); sta SPI_RW(NOP); // 返回状态寄存器 if(TX_DS) { //blink(3); } //blink(5); if(MAX_RT) if(clear) // 是否清除TX FIFO没有清除在复位MAX_RT中断标志后重发 SPI_RW(FLUSH_TX); SPI_RW_Reg(WRITE_REG STATUS, sta); // 清除TX_DS或MAX_RT中断标志 IRQ 1; if(TX_DS) return(0x00); else return(0xff); }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87081.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!