甘肃做网站哪个平台好,电影网站建设步骤,wordpress判断使用模版,灰色关键词排名优化前言 本章为智能家居项目的第二章#xff0c;本章主要写51单片机的定时器timer#xff0c;串口UART#xff0c;中断#xff0c;外接模块DHT11 同项目其他博文#xff1a;
项目的概述链接#xff1a;Linux智能家居项目概述-CSDN博客
第一章 主控代码开发链接#xff1a…前言 本章为智能家居项目的第二章本章主要写51单片机的定时器timer串口UART中断外接模块DHT11 同项目其他博文
项目的概述链接Linux智能家居项目概述-CSDN博客
第一章 主控代码开发链接第一章 智能家居主控的开发及代码分析-CSDN博客 文章目录 目录 前言 文章目录 一 定时器中断 1.1 定时器0和定时器1初始化 1.2 定时器0中断函数 1.3 定时器1中断函数 二 串口波特率配置及中断115200 三 DHT11实现监测温湿度并通过串口发送给主控系统 一 定时器中断 1.1 定时器0和定时器1初始化 在下文的定时器函数中出现的PT0和PT1为中断优先级控制位 定时器0初始化定时器0用于舵机控制 void Time0Init()
{TMOD 0x01;TL00x33; //装初值0.5msTH00xFE;TR0 1; //开始数数TF0 0;ET0 0; //关定时器0中断EA 1; //打开总中断PT0 1; //设定时器T0为高优先级中断
}PT0T0中断优先级控制位。PT01设定定时器T0为高优先级中断PT00设定时器T0为低优先级中断。 定时器1初始化定时器1 用于定时发送数据 void Timer1Init(void) //设置定时器1
{AUXR 0xBF; TMOD 0x0F; //高位清0 低位不变TMOD | 0x10; //高位置1 低位不变TL1 0x00; //装初值定时50msTH1 0x4C; TF1 0; //开始定时TR1 1; //TRTF 开始数数ET1 1; //打开定时器1中断EA 1; //打开总中断PT1 0; //设定时器T1为低优先级中断
}PT1T1中断优先级控制位。PT11设定定时器T1为高优先级中断PT10设定定时器T1为低优先级中断。 1.2 定时器0中断函数 /*******************************************函数功能实现舵机转现*定时器0中断
*****************************************/
void Time0Handler() interrupt 1
{cnt; //用于调节IO的输出频率用于舵机LED_count;TL00x33; // 重装初值设置中断时间为0.5msTH00xFE;if(cnt jd){ //jd 0时舵机角度为0度jd 5舵机角度为180度sg90 1;}else{sg90 0;}if(cnt 40){cnt 0; sg90 1;}
}1.3 定时器1中断函数 /*******************************************函数功能1s 发送温湿度给主机*定时器1中断
*****************************************/void Time1Handler() interrupt 3
{ timer1_conut;TL1 0x00; //装低八位初值 50msTH1 0x4C; //装高八位初值if(timer1_conut 20){ //计时一秒时发一次温湿度数据ET0 0; //定时器1断开等待串口将温湿度数据发送完毕timer1_conut 0;get_wenshidu();ET0 1; //定时器1继续计时}
}二 串口波特率配置及中断115200 由于使用使用软件不能直接配置出115200的波特率然后上网查资料最后使用定时器2和波特率发生器后完成串口的配置。 //设置串口波特率为115200
void init_com( void )
{ SCON 0x50; //串口工作方式18位UART波特率可变 TH2 0xFF; TL2 0xFD; //波特率:115200 晶振11.0592MHz RCAP2H 0xFF; RCAP2L 0xFD; 16位自动再装入值/*****************/TCLK 1; RCLK 1; C_T2 0; EXEN2 0; //波特率发生器工作方式/*****************/TR2 1 ; //定时器2开始EA 1; //总中断ES 1; //串口中断标志位PS 1; //设置串口优先级为最高
} 当时主控开发板的波特率为115200然后51单片机的波特率为9600那会我还不清楚主控的波特率是多少就以为默认为9600然后一通信好家伙数据有时对有时不对还以为代码逻辑出了问题改了好久好久 /* 串口中断 */
void Uart_Handler() interrupt 4{
static int i 0; //
char tmp;if(RI){ //收到数据RI置1RI0;tmp SBUF;if(tmp M){i0;} cmd[i] tmp;i;if(cmd[0] M){switch (cmd[1]){case1: //打开舵机中断LED1 OFF;Fa_msg(开舵机中断);//get_wenshidu();ET0 1; //打开定时器0中断 break;case2: //关闭舵机中断LED1 ON;Fa_msg(关舵机中断);ET0 0; //关中断break;case3:// //打开垃圾桶Fa_msg(close ash-bin);jd 1;break;case4: //打开垃圾桶Fa_msg(open ash-bin);jd 5;break;case5://dingFa_msg(开始发送温湿度);ET1 0;break;case6://dingFa_msg(停止发送温湿度);ET1 1;break;} } if(i 12){memset(cmd,\0,SIZE);i 0;}}
}上述代码为串口UART中断的代码 串口没有数据时程序正常执行当串口接收到数据时串口中断程序进入串口中断函数创建cmd[ ]数组接收数据而后判断如果第一个数据为M时者证明收到需要的数据然后判断M的下一位数据cmd[1],如果判断指令存在则执行相对应的指令 三 DHT11实现监测温湿度并通过串口发送给主控系统 51单片机发送字符串
void SendByte(char msg){//发送字节SBUF msg;while(TI 0);TI0;}void Fa_msg(char *p){//发送字符串while(*p! \0){SendByte(*p);p;}
}
将从硬件获取到的温湿度通过串口发送给主控定时器计算每秒发送一次
//将获取到的温湿度值进行赋值以便利用串口将数据发到主机
void build_data(){ shidu[0] H;shidu[1] datas[0]/10 0x30;shidu[2] datas[0]%10 0x30;shidu[3] .;shidu[4] datas[1]/10 0x30;shidu[5] datas[1]%10 0x30;shidu[6] %;shidu[7] \0;wendu[0] T;wendu[1] datas[2]/10 0x30;wendu[2] datas[2]%10 0x30;wendu[3] .;wendu[4] datas[3]/10 0x30;wendu[5] datas[3]%10 0x30;wendu[6] C;wendu[7] \0;
}//将温湿度通过串口发送给主机
void get_wenshidu(){Read_Data_Form_DHT(); //获取硬件的温度并存进数组中build_data();Fa_msg(wendu); //发送温度Fa_msg(\r\n);//Delay1ms(); Fa_msg(shidu); //发送湿度Fa_msg(\r\n);
}这篇文章没用具体说明每个模块的具体实现如需要看详解可以看主页或找我要笔记