护花天使项目,51单片机代码分析第一次

来源:互联网 发布:淘宝图片的尺寸是多少 编辑:程序博客网 时间:2024/05/29 19:24

2017年5月7日左右,我们完成了项目第一次的雏形,我负责的是硬件部分,部分代码如下

#include "delay.h"

#include "temp.h"

#include "wind.h"

#include "warning.h"

#include "def.h"

#include "led.h"

 

void UsartConfiguration();

void Int0Init();

void sendmessage();

static u8 receiveData;     //接受的数据

 

 

u16 num;

 

 

void datapros(int temp)

{

         floattp;

   if(temp<0)                  //小于零要先减一再取反

         {

            disp[0]=0x40;

                                                  //清除发送完成标志位

            temp=temp-1;

            temp=~temp;

            tp=temp;

            temp=tp*0.0625*100+0.5;               //加0.5防止四舍五入的误差

         }

         else

         {

            disp[0]=0x00;

                                                           //清除发送完成标志位

            tp=temp;

            temp=tp*0.0625*100+0.5;

 

         }

 

   num = temp;

 

   disp[1]=smg_duan[temp/10000];                    //数据处理

         disp[2]=smg_duan[temp%10000/1000];

         disp[3]=smg_duan[temp%1000/100];  //通过或运算来显示小数点

         disp[4]=smg_duan[temp%100/10];       //小数后一位

         disp[5]=smg_duan[temp%10];      //小数后两位

 

         datas[0]= temp / 10000;

         datas[1]= temp % 10000 / 1000;

         datas[2]= temp % 1000 / 100;

         datas[3]= temp % 100 / 10;

         datas[4]= temp % 10;

 

}

 

 

void main()

{

  UsartConfiguration();

  moto=0;

  GPIO_TRAFFIC=0xff;

  while(1)

   {

   

                 //风扇

           datapros(Ds18b20ReadTemp());

           //DigDisplay();

   }

}

 

 

void UsartConfiguration()

{

         SCON=0X50;                     //设置为工作方式1

         TMOD=0X20;                    //设置计数器工作方式2

         PCON=0X80;                     //波特率加倍

         TH1=0XF3;                                 //计数器初始值设置,注意波特率是4800的

         TL1=0XF3;

         ES=1;                                                   //打开接收中断

         EA=1;                                                   //打开总中断

         TR1=1;                                        //打开计数器

}

 

void Usart() interrupt 4   //串口中断号为4

{

  

         receiveData=SBUF;

         RI=0;               //清零,停止接受

        

        

         switch(receiveData)

           {

              case(0x30):sendmessage();break;   //0

                   case(0x31):warning();break;

                   case(0x32):wind();break;

                   case(0x33):led();break;

           }

}

 

 

 

void sendmessage()

{

     u8 i;

 

     SBUF='+';//将接收到的数据放入到发送寄存器

           while(!TI);                              //等待发送数据完成

           TI=0;

 

           SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器

           while (!TI);                             //等待发送数据完成

           TI = 0;

 

           SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器

       while(!TI);                             //等待发送数据完成

           TI = 0;

 

           SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器

           while (!TI);                             //等待发送数据完成

           TI = 0;

 

           SBUF = '.';//将接收到的数据放入到发送寄存器

           while (!TI);                             //等待发送数据完成

           TI = 0;

 

           SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器

           while (!TI);                             //等待发送数据完成

           TI = 0;

 

           SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器

           while (!TI);                             //等待发送数据完成

           TI = 0;

 

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

         {

                 SBUF= CNCHAR[i];//将接收到的数据放入到发送寄存器

                  while(!TI);                                 //等待发送数据完成

                  TI= 0;

         }

 

}

 

 

从main函数开始分析,首先设置串口通信,打开计数器,设置波特率等,然后打开中断,打开计数器。

然后编写串口中断,中断号为4,对sbuf区的值进行判断,为0时发送单片机返回当前温度值,为1时打开蜂鸣器,为2时打开风扇,为3时打开led灯。

发送信息是将所需要发送的值依次装入sbuf区,每装入一次,就返回一次,短时间内多次发送就可以达到所需显示的要求了。

风扇,led灯,和蜂鸣器都是简单的控制高低电平,就可以实现要求了。

然后对温度传感器采集到的信息进行处理,将个十百位和小数点后两位放进数组中,以便返回给电脑。温度传感器有读取ram数据和发送两大步骤。

差不多了,第一次就写这么多,目前还有很多没有完善的,比如说通信方面,应该向无线通信靠拢,其他的功能也应该更丰富。



0 0
原创粉丝点击