zoukankan      html  css  js  c++  java
  • serial -1

    #include <reg52.h>
    #include <stdio.h>
    #define uchar unsigned char
    sbit LED = P2^2;
    uchar receive;
    uchar sdata[11]={13,10,'l','e','d',58,111,'0','0',13,10};

    void main(void)
    {
    EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
    ES = 1; //允许UART串口的中断

    TMOD = 0x20; //定时器T/C1工作方式2
    SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
    TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3
    TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd
    PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
    TR1 = 1; //定时器启动
    LED=1;
    while(1);

    }

    void tranData() interrupt 4
    {
    uchar i;
    if(RI)
    {
    RI=0;
    receive=SBUF;
    if(receive==0x31)
    {
    LED=0;
    // ES=0;
    sdata[8]=0x00;
    sdata[7]='n';
    for(i=0;i<=10;i++)
    {
    SBUF=sdata[i];
    while(!TI);
    TI=0;
    }
    // ES=1;
    }
    else if(receive==0x30)
    {
    LED=1;
    // ES=0;
    sdata[8]='f';
    sdata[7]='f';
    for(i=0;i<=10;i++)
    {
    SBUF=sdata[i];
    while(!TI);
    TI=0;
    }
    // ES=1;
    }
    }
    }


    /* while(!TI);的意思是等待串口发送完成,
    当串口发送未完成时:
    TI值为0,(!TI)值为1,;号前面无语句,故一直在此循环
    当串口发送完成时:
    TI值为1,(!TI)值为0,while(!TI)不满足循环,退出,继续执行下一条*/

    2-输入特定字符, 发送一组数据

    #include<reg52.h>

    #define uint unsigned int
    #define uchar unsigned char

    sbit DQ=P3^7; // 接DS18B20的数据端
    uchar datain;
    /***********************************
    函数:DelayMs(uint z)
    ----------------------
    说明:毫秒级的延时
    参数:z 代表要延时的毫秒数
    返回值:无
    ***********************************/
    void DelayMs(uint z)
    {
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }


    /***********************************
    void ReSet(void)
    ------------------
    说明:复位启动DS18B20
    参数:无
    返回值:无
    ***********************************/
    void ReSet(void)
    {
    uint i;
    DQ=0;
    i=100;
    while(i--);
    DQ=1;
    i=4;
    while(i--);
    while(DQ);
    while(~DQ);
    i=4;
    while(i--);
    }

    /***********************************
    uchar ReadByte(void)
    ------------------
    说明:读取DS18B20的一个字节
    参数:无
    返回值:返回读取到的字节
    ***********************************/
    uchar ReadByte(void)
    {
    uchar i,j,b,dat=0;
    for(j=0;j<8;j++)
    {
    DQ=0;
    i++;
    DQ=1;
    i=3; // 延时15us
    while(--i);
    b=DQ;
    i=10;
    while(i--);
    dat=(b<<7)|(dat>>1);
    }
    return(dat);
    }


    /************************************************
    void WriteByte(uchar b)
    ------------------
    说明:写数据的一个字节,满足写1和写0的时隙要求
    参数:b代表要写入到DS18B20的内容
    返回值:无
    ************************************************/
    void WriteByte(uchar b)
    {
    uint i;
    uchar j;
    bit btmp;
    for(j=0;j<8;j++)
    {
    btmp=b&0x01;
    b=b>>1; // 取下一位(由低位向高位)
    if(btmp)
    {
    DQ=0;
    i++;
    i++;
    DQ=1;
    i=10;
    while(i--); // 整个写1时隙不低于60us
    }
    else
    {
    DQ=0;
    i=10;
    while(i--); // 保持低在60us到120us之间
    DQ=1;
    i++;
    i++;
    }
    }
    }


    /************************************************
    uint ReadTemp(void)
    ------------------
    说明:读取温度值
    参数:无
    返回值:返回读取到的温度
    ************************************************/
    uint ReadTemp(void)
    {
    uchar TempLow,TempHig; // 温度值低位、高位字节
    float tt;
    uint temp;
    ReSet(); // 产生复位脉冲,初始化DS18B20
    WriteByte(0xcc); // skip rom 命令
    WriteByte(0x44); // convert T 命令
    ReSet();
    WriteByte(0xcc); // skip rom 命令
    WriteByte(0xbe); // read 温度命令
    TempLow=ReadByte(); // 温度值低位字节(其中低4位为二进制的"小数"部分)
    TempHig=ReadByte(); // 高位值高位字节(其中高5位为符号位)
    temp=TempHig;
    temp<<=8;
    temp=temp|TempLow;
    tt=temp*0.0625;
    temp=tt*10+0.5;
    return (temp);
    }

    /***********************************
    函数:void send(uint dat)
    ---------------------------
    说明:将测得的距离通过串口发送出去
    参数:dat是测得的距离
    返回值:无
    ***********************************/
    void Send(uint dat)
    {
    // SBUF=0xaa; //
    // while(!TI);
    // TI=0;
    SBUF=(dat/1000)+ 48; // 发送 千 位
    while(!TI);
    TI=0;
    SBUF=(dat%1000/100)+ 48; // 发送 百 位
    while(!TI);
    TI=0;
    SBUF=(dat%100/10)+48; // 发送 十 位
    while(!TI);
    TI=0;
    SBUF=0x2E; // 发送 点 位
    while(!TI);
    TI=0;
    SBUF=(dat%10)+48; // 发送 位
    while(!TI);
    TI=0;
    SBUF=0x0A; // 发送换行
    while(!TI);
    TI=0;
    }

    void tempTran() interrupt 4
    {
    uint temp; // 用来保存读取到的温度值
    if(RI)
    {
    RI=0;
    datain=SBUF;
    if(datain==0x31)
    {
    temp=ReadTemp();
    Send(temp);
    DelayMs(200);
    }
    }
    }

    /***********************************
    函数:void InitUart()
    ----------------------
    说明:对串口进行初始化
    参数:无
    返回值:无
    ***********************************/
    void InitUart()
    {
    SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
    PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
    TMOD = 0x20; //定时器T/C1工作方式2
    TH1 = 0xF3; //定时器初值高8位设置
    TL1 = 0xF3; //定时器初值低8位设置
    EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
    ES = 1; //允许UART串口的中断
    TR1 = 1; //定时器启动
    }

    /***********************
    函数:void main(void)
    ----------------------
    说明:主函数
    参数:无
    返回值:无
    ***********************/
    void main()
    {
    InitUart();
    while(1);
    }

  • 相关阅读:
    知识积累的核心:解构、重构
    常用的测试用例设计方法
    安装双系统注意事项
    对象转换工具类
    一个超级简单的HTML模板框架源代码以及使用示例
    java常量池
    维数灾难
    机器学习算法思想简单梳理
    对线性代数的一些理解
    正则表达式 java版
  • 原文地址:https://www.cnblogs.com/https/p/9247627.html
Copyright © 2011-2022 走看看