|
基于51单片机设计的多路无线温度检测报警系统.
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
论文内容预览:
单片机源程序如下:
- #include <reg52.h>
- #include <nrf24l01.h>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- unsigned pcb_id=0;
- unsigned char flag=0;
- int set_value,state;
-
-
- sbit data_temp1 = P2^4; //数据线
- sbit data_temp2 = P2^2; //数据线
- sbit cs = P2^3; //片选
- sbit sclk = P2^1; //io口时钟
- sbit S1 = P1^0; //
- sbit S2 = P1^1; //
- sbit S3 = P1^2; //
- //sbit LED1 = P1^3; //
- sbit LED2 = P1^4; //
- sbit LED3 = P1^5; //
-
- sbit Relay1 = P1^7; //
- sbit Relay2 = P2^0; //
- sbit Ring = P1^6; //
- sbit LCD_RS = P2^5; //数据命令选择端
- sbit LCD_RW = P2^6; //读写选择端
- sbit LCD_EP = P2^7; //使能信号
- unsigned char code wendu1[] = "T1:"; //待显示的字符
- unsigned char code wendu2[] = "T2:"; //待显示的字符
- unsigned char code wendu3[] = "T3:"; //待显示的字符
- unsigned char code danger[] = "UNSF"; //待显示的字符
- unsigned char code anquan[] = "Safe"; //待显示的字符
- unsigned char anjian_flag1,anjian_flag2,anjian_flag3,anjian_flag4;
- unsigned char ad_temp1, ad_temp2,ad_temp3,ad_temp4;
- unsigned char ring1_flag,ring2_flag,ring3_flag;
- unsigned char add_num;
- int aa;
- float wenduzhi;
- unsigned char nrf_tx_buff[4]; // 数据送到缓存
- unsigned char nrf_rx_buff[4]; // 数据送到缓存
- uchar bdata nrf_state;
- sbit RX_DR_flag = nrf_state^6;
- sbit TX_DS_flag = nrf_state^5;
- sbit MAX_RT_flag = nrf_state^4;
- void delay(int ms)
- { // 延时子程序
- int i;
- while(ms--)
- {
- for(i = 0; i< 250; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- bit lcd_bz() // 测试LCD忙碌状态
- {
- bit result;
- LCD_RS = 0; //写指令
- LCD_RW = 1;
- LCD_EP = 1; //为产生下降沿做好准备
- _nop_(); //延时5ms
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P0 & 0x80);//判断状态字最高位STA7,确保STA7为0
- LCD_EP = 0; //将LED_EP拉低,产生下降沿,写入指令
- return result; //返回结果,为1禁止读写,为0可以读写
- }
- void lcd_wcmd(unsigned char cmd) // 写入指令数据到LCD
- {
- while(lcd_bz()); //为1不能进行读写操作
- LCD_RS = 0; //写指令
- LCD_RW = 0;
- LCD_EP = 0;
- _nop_();
- _nop_();
- P0 = cmd; //将指令写到P0口
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EP = 1; //使能端高电平,为产生下降沿准备
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EP = 0; //产生下降沿,将指令写入LCD
- }
- void lcd_pos(unsigned char pos) //设定显示位置
- {
- lcd_wcmd(pos | 0x80); //LCD数据指针格式80H+地址
- }
- void lcd_wdat(unsigned char dat) //写入字符显示数据到LCD
- {
- while(lcd_bz()); //LCD忙检测,为1不能进行读写,为0可以读写
- LCD_RS = 1; //写数据
- LCD_RW = 0;
- LCD_EP = 0;
- P0 = dat; //数据送入P0口
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EP = 1; //使能端拉高。为产生下降沿做准备
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EP = 0; //使能端拉低,将数据写入LCD
- }
- void lcd_init() //LCD初始化设定
- {
- lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
- delay(1); //延时1ms
- lcd_wcmd(0x0c); //显示开,关光标
- delay(1);
- lcd_wcmd(0x06); //移动光标,当读或写一个字符后地址指针加1且光标加1
- delay(1);
- lcd_wcmd(0x01); //清除LCD的显示内容,地址指针数据指针清零
- delay(1);
- }
- uint ad_549() //TLC549处理
- {
- uchar i;
- ad_temp1=0;
- ad_temp2=0;
- ad_temp3=0;
- ad_temp4=0;
- cs = 1; //初始化,启动
- sclk = 0;
- cs = 0;
- _nop_();
- _nop_();
- for(i = 0;i < 8;i++) //读取采集数据,读取的是上一次采集数据
- {
- sclk = 1;
- ad_temp1 = ad_temp1 << 1;
- if(data_temp1)ad_temp1 |= 0x01;
- ad_temp2 = ad_temp2 << 1;
- if(data_temp2)ad_temp2 |= 0x01;
- _nop_();
- _nop_();
- sclk = 0;
- _nop_();
- }
- cs = 1;
- for(i = 0;i < 14;i++)
- {
- _nop_();
- }
- }
- void timer0_init (void) // timer0中断初始化函数
- {
- EA = 0;
- TMOD |= 0x01;
- TR0 = 0;
- TL0 = (65536-50000)%256;
- TH0 = (65536-50000)/256;
- PT0 = 1;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- void anjian(void)
- {
- if(S1==0)
- {
- if(anjian_flag1==0)
- {
- anjian_flag1=1;
- add_num=1;
- }
- }
- else
- {
- anjian_flag1=0;
- }
- if(S2==0)
- {
- if(anjian_flag2==0)
- {
- anjian_flag2=1;
- add_num=2;
- }
- }
- else
- {
- anjian_flag2=0;
- }
- if(S3==0)
- {
- if(anjian_flag3==0)
- {
- anjian_flag3=1;
- add_num=3;
- }
- }
- else
- {
- anjian_flag3=0;
- }
-
- }
- void uart_init()
- {
- TMOD |= 0x20;
- TH1 = 0xf3;
- TL1 = 0xf3;
- TR1 = 1; //启动定时器1,从而设定了串口通信的波特率
- PCON=0X80;
- SM0 = 0;
- SM1 = 1; //设定串口通信方式为十位异步收发器
- REN = 1; //打开串口通信
- EA = 1;
- ES = 1;
- }
- void uart_send(databuff)
- {
- SBUF=(databuff/100)+0x30;//将接收到的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0;
- SBUF=((databuff%100)/10)+0x30;//将接收到的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0;
- SBUF=(databuff%10)+0x30;//将接收到的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0;
- }
-
- void uart_sendone(onedata)
- {
- SBUF=onedata;//将接收到的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0;
- }
- void main(void) //主程序
- {
- unsigned char zf;
- int temp;
- set_value=100;
- // uart_init();
- timer0_init ();
- init_io(); // 初始化IO
- RX_Mode(); // 设置为接收模式
- LED2=1;
- LED3=1;
- anjian_flag1=0;
- anjian_flag2=0;
- anjian_flag3=0;
- Relay1=0;
- Relay2=0;
- Ring=0;
- add_num=1;
- if(pcb_id==1) //主机为1、从机为0初始化
- {
- lcd_init(); // 初始化LCD
- delay(10); //延时10ms
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x00+0); //设置显示位置为第一行的第17个字符
- zf = 0;
- while(wendu1[ zf ] != '\0')
- {
- lcd_wdat(wendu1[ zf ]); //显示字符"WLCOME TO"
- zf ++;
- }
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x00+9); //设置显示位置为第一行的第17个字符
- zf = 0;
- while(wendu2[ zf ] != '\0')
- {
- lcd_wdat(wendu2[ zf ]); //显示字符"WLCOME TO"
- zf ++;
- }
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x40+0); //设置显示位置为第一行的第17个字符
- zf = 0;
- while(wendu3[ zf ] != '\0')
- {
- lcd_wdat(wendu3[ zf ]); //显示字符"WLCOME TO"
- zf ++;
- }
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x40+9); //设置显示位置为第一行的第17个字符
- zf = 0;
- while(anquan[ zf ] != '\0')
- {
- lcd_wdat(anquan[ zf ]); //显示字符"WLCOME TO"
- zf ++;
- }
- }
- while(1)
- {
- if(pcb_id==1)
- {
- nrf_state = SPI_Read(STATUS); // 读状态寄存器
- if(RX_DR_flag) // 判断是否接受到数据
- {
- SPI_Read_Buf(RD_RX_PLOAD, nrf_rx_buff, TX_PLOAD_WIDTH); // 从RX FIFO读出数据
- if(nrf_rx_buff[0]==0x01)
- {
- LED2=~LED2;
- aa= (nrf_rx_buff[1]<<8)+ nrf_rx_buff[2];
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x00+3); //设置显示位置为第一行的第17个字符
- lcd_wdat((aa/100)+0x30);
- lcd_wdat((aa%100)/10+0x30);
- lcd_wdat('.');
- lcd_wdat((aa%10)+0x30);
- if(aa>500)
- {
- ring1_flag=1;
- }
- else
- {
- ring1_flag=0;
- }
- }
- else if(nrf_rx_buff[0]==0x02)
- {
- LED2=~LED2;
- aa= (nrf_rx_buff[1]<<8)+ nrf_rx_buff[2];
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x00+12); //设置显示位置为第一行的第17个字符
- lcd_wdat((aa/100)+0x30);
- lcd_wdat((aa%100)/10+0x30);
- lcd_wdat('.');
- lcd_wdat((aa%10)+0x30);
- if(aa>500)
- {
- ring2_flag=1;
- }
- else
- {
- ring2_flag=0;
- }
- }
- else if(nrf_rx_buff[0]==0x03)
- {
- LED2=~LED2;
- aa= (nrf_rx_buff[1]<<8)+ nrf_rx_buff[2];
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x40+3); //设置显示位置为第一行的第17个字符
- lcd_wdat((aa/100)+0x30);
- lcd_wdat((aa%100)/10+0x30);
- lcd_wdat('.');
- lcd_wdat((aa%10)+0x30);
- if(aa>500)
- {
- ring3_flag=1;
- }
- else
- {
- ring3_flag=0;
- }
- }
- else
- {
-
- }
- }
- SPI_RW_Reg(WRITE_REG + STATUS, nrf_state); // 清除RX_DS中断标志
- if((ring1_flag==1)||(ring2_flag==1)||(ring3_flag==1))
- {
- lcd_wcmd(0x06); //向右移动光标
- lcd_pos(0x40+9); //设置显示位置为第一行的第17个字符
- zf = 0;
- while(danger[ zf ] != '\0')
- {
- lcd_wdat(danger[ zf ]); //显示字符"WLCOME TO"
- zf ++;
- }
- Ring=1;
- LED3=0;
- }
- else
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载(含完整论文,pcb 原理图工程和源码):
30022发送.rar
(10.89 MB, 下载次数: 233)
|
评分
-
查看全部评分
|