微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stc89c52rc单片机串口通信问题!

stc89c52rc单片机串口通信问题!

时间:10-02 整理:3721RD 点击:
我想通过单片机完成温度与酒精浓度的测量并通过蓝牙模块进行串口通信。
#include <reg52.h>             //?
#define uchar unsigned char  //? ?    ?0~255
#define uint  unsigned int     //? ?    ?0~65535
#include "eeprom52.h"
#include <stdio.h>   
#include <intrins.h>
//?      0     1    2    3    4    5    6     7      8       9   
uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
                       0x60,0x25,0x39,0x26,0x31,0x71,0xff};     //?
//?
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f,0xf7,0xfb,0xfd,0xfe};
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};   
uchar smg_i = 8;    //?
uchar a_a;
uchar flag,a;
unsigned char flag_uart,flag_time,flag_on,a,i,t0_num,ad_val;
float temp;
float alcohol;
sbit dq   = P2^3;    //18b20 IO?
sbit beep = P2^4;   //?IO?
sbit CS=P2^5;        //CS?P1?4?,?ADC0832CS?
sbit SCL=P2^6;        //SCL?P1?3?,?ADC0832SCL?
sbit DO=P2^7;        //DO?P1?4?,?ADC0832DO?
bit flag_lj_en;         //?
bit flag_lj_3_en;     //?3?  ?
uchar key_time,key_value;      //?
bit key_500ms  ;

uint temperature ;  //
bit flag_300ms ;
uchar menu_1;       //?
uint t_high = 300,t_low = 100;       //?      
long dengji,s_dengji = 50;     //?
#define RdCommand 0x01 //?ISP?
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //?CPU?

/***********************1ms?*****************************/
void delay_1ms(uint q)
{
    uint i,j;
    for(i=0;i<q;i++)
        for(j=0;j<120;j++);
}
/***********************?*****************************/
void delay_uint(uint q)
{
    while(q--);
}

/***********************?*****************************/
void display()
{
    static uchar i;   
    i++;
    if(i >= smg_i)
        i = 0;   
    P1 = 0xff;             //?
    P0= smg_we[i];              //?
    P1 = dis_smg[i];         //?            
}
/******************?eepom?******************/
void write_eeprom()
{
    sectorerase(0x2000);
    byte_write(0x2000, t_high % 256);
    byte_write(0x2001, t_high / 256);
    byte_write(0x2002, t_low % 256);
    byte_write(0x2003, t_low / 256);
    byte_write(0x2004, s_dengji % 256);
    byte_write(0x2005, s_dengji / 256);
    byte_write(0x2055, a_a);   
}
/******************?eepom?*****************/
void read_eeprom()
{
    t_high  = byte_read(0x2001);
    t_high <<= 8;
    t_high  |= byte_read(0x2000);
    t_low   = byte_read(0x2003);
    t_low <<= 8;
    t_low   |= byte_read(0x2002);
    s_dengji  = byte_read(0x2005);
    s_dengji <<= 8;
    s_dengji  |= byte_read(0x2004);
    a_a      = byte_read(0x2055);
}
/**************?*****************/
void init_eeprom()
{
    read_eeprom();        //?
    if(a_a != 1)        //?eeprom
    {
        t_high = 400;
        t_low  = 100;
        s_dengji = 80;
        a_a = 1;
        write_eeprom();       //?
    }   
}
/***********?********************************************************/   
unsigned char ad0832read(bit SGL,bit ODD)
{
    unsigned char i=0,value=0,value1=0;        
        SCL=0;
        DO=1;
        CS=0;        //?
        SCL=1;        //?   
        SCL=0;
        DO=SGL;
        SCL=1;      //?
        SCL=0;
        DO=ODD;
        SCL=1;        //?
        SCL=0;        //?
        DO=1;
        for(i=0;i<8;i++)
        {
            SCL=1;
            SCL=0; //?
            value<<=1;
            if(DO)
                value++;                        
        }
        for(i=0;i<8;i++)
        {            //?
            value1>>=1;
            if(DO)
                value1+=0x80;
            SCL=1;
            SCL=0;
        }
        CS=1;
        SCL=1;   
        if(value==value1)                //?,?,?0   
            return value;
    return 0;
}
void init()
{
    TMOD=0x21;
//    SCON=0x50;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TH1=0xfd;
    TL1=0xfd;
    TR1=1;
    ET0=1;
    SM0=0;
    SM1=1;
    REN=1;
    EA=1;
    ES=1;
}
/***********************18b20?*****************************/
void init_18b20()
{
    bit q;
    dq = 1;                //?
    delay_uint(1);        //15us
    dq = 0;                //?
    delay_uint(80);        //750us
    dq = 1;                //? ?
    delay_uint(10);        //110us
    q = dq;                //?18b20?
    delay_uint(20);        //200us
    dq = 1;                //? ?
}
/*************?18b20?***************/
void write_18b20(uchar dat)
{
    uchar i;
    for(i=0;i<8;i++)
    {                     //?
        dq = 0;             //?
        dq = dat & 0x01; //?18b20?
        delay_uint(5);     // 60us
        dq = 1;             //?
        dat >>= 1;
    }   
}
/*************?18b20?***************/
uchar read_18b20()
{
    uchar i,value;
    for(i=0;i<8;i++)
    {
        dq = 0;             //?
        value >>= 1;     //?
        dq = 1;             //?
        if(dq == 1)         //?
            value |= 0x80;
        delay_uint(5);     //60us    ?60us?
    }
    return value;         //?
}
/*************? ?***************/
uint read_temp()
{
    uint value;
    uchar low;               //?,?,?18b20?
    init_18b20();           //?18b20
    write_18b20(0xcc);       //?64?ROM
    write_18b20(0x44);       //?
    delay_uint(50);           //500us
    init_18b20();           //?18b20
   
    write_18b20(0xcc);       //?64?ROM
    write_18b20(0xbe);       //?
   
    EA = 0;
    low = read_18b20();       //?
    value = read_18b20();  //?
    EA = 1;
    value <<= 8;           //?8?
    value |= low;           //?value?
    value *= 0.625;           //? ?
    return value;           //? ?
}
/*************?0?***************/
void time_init()      
{
    EA   = 1;           //?
    TMOD = 0X01;      //?0?1?1
    ET0  = 1;          //?0?
    TR0  = 1;          //?0?
}
/********************?*****************/
uchar key_can;     //?
void key()     //?
{
    static uchar key_new;
    key_can = 20;                   //?
    P2 |= 0x07;
    if((P2 & 0x07) != 0x07)        //?
    {
        if(key_500ms == 1)    //?
        {
            key_500ms = 0;
            key_new = 1;
        }
        delay_1ms(1);             //?
        if(((P2 & 0x07) != 0x07) && (key_new == 1))
        {                        //?
            key_new = 0;
            switch(P2 & 0x07)
            {
                case 0x06: key_can = 3; break;       //?k2?
                case 0x05: key_can = 2; break;       //?k3?
                case 0x03: key_can = 1; break;       //?k4?
            }
            flag_lj_en = 1;     //?
        }            
    }
    else
    {
        if(key_new == 0)
        {
            key_new = 1;
            write_eeprom();        //?
            flag_lj_en = 0;        //?
            flag_lj_3_en = 0;    //?3?
            key_value = 0;        //?
            key_time = 0;
            key_500ms = 0;
        }
    }   
}
/****************?***************/
void key_with()
{
    if(key_can == 1)      //?
    {
        menu_1 ++;
        if(menu_1 >= 4)
        {
            menu_1 = 0;
            smg_i = 8;          //?8?
        }
    }
    if(menu_1 == 1)            //?
    {
        smg_i = 8;          //?4?
        if(key_can == 2)
        {
            if(flag_lj_3_en == 0)
                t_high ++ ;        //?   
            else
                t_high += 10;    //?10
            if(t_high > 990)
                t_high = 990;
        }
        if(key_can == 3)
        {
            if(flag_lj_3_en == 0)
                t_high -- ;        //?   
            else
                t_high -= 10;    //?10
        }
        dis_smg[7] = smg_du[t_high % 10];               //?
        dis_smg[6] = smg_du[t_high / 10 % 10] & 0xdf;  //?
        dis_smg[5] = smg_du[t_high / 100 % 10] ;       //?
        dis_smg[4] = 0x64;     //H
        dis_smg[0] = smg_du[t_low % 10];               //?
        dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf;   //?
        dis_smg[2] = smg_du[t_low / 100 % 10] ;           //?
        dis_smg[3] = 0x3D;      //L
    }
    if(menu_1 == 2)            //?
    {
        smg_i = 8;          //?4?
        if(key_can == 2)
        {
            if(flag_lj_3_en == 0)
                t_low ++ ;            //?   
            else
                t_low += 10;        //?10
            if(t_low >= t_high)
                t_low = t_high - 1;
        }
        if(key_can == 3)
        {
            if(flag_lj_3_en == 0)
                t_low -- ;            //?   
            else
                t_low -= 10;        //?10
            if(t_low <= 10)
                t_low = 10;
        }
        dis_smg[0] = smg_du[t_low % 10];               //?
        dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf;   //?
        dis_smg[2] = smg_du[t_low / 100 % 10] ;           //?
        dis_smg[3] = 0x3D;      //L
    }   
    if(menu_1 == 3)            //?
    {
        smg_i = 8;          //?4?
        if(key_can == 2)
        {
            if(flag_lj_3_en == 0)
                s_dengji ++ ;            //?   
            else
                s_dengji += 10;        //?10
        }
        if(key_can == 3)
        {
            if(flag_lj_3_en == 0)
                s_dengji -- ;            //?   
            else
                s_dengji -= 10;        //?10
        }
        dis_smg[0] = smg_du[s_dengji % 10];               //?
        dis_smg[1] = smg_du[s_dengji / 10 % 10] ;      //?
        dis_smg[2] = smg_du[s_dengji / 100 % 10] ;       //
        dis_smg[3] = 0x60;     //a
    }
        
}
/****************?***************/
void clock_h_l()
{
    static uchar value;
    if((temperature <= t_high)|| (dengji >= s_dengji) || (temperature >= t_high))
    {
            beep = ~beep;       //?            
            
    }
    else
    {
        beep = 1;   
    }            
}
/****************?***************/
void main()
{
    delay_1ms(150);
    P0 = P1 = P2 = 0xff;
    temperature = read_temp();        //?   
    init();
    init_eeprom();  //?
    delay_1ms(650);               
    temperature = read_temp();                 //?
    dis_smg[7] = smg_du[temperature % 10];     //?
    dis_smg[6] = smg_du[temperature / 10 % 10] & 0xdf; //?
    dis_smg[5] = smg_du[temperature / 100 % 10] ;       //?6
    time_init();                    //?
    while(1)
    {        
        key();                    //?
        if(key_can < 10)
        {
            key_with();            //?   
        }
        if(flag_300ms == 1)        //300ms ?
        {      
            flag_300ms = 0;   
            temperature = read_temp();    //?
            clock_h_l();  
            dengji = ad0832read(1,0);   
            dengji = dengji * 450 / 255.0;
            dengji = dengji - 100;              //?,?100mV
            if(dengji < 0)
                dengji = 0;   
            dengji = dengji * 2;             //?mV?mg/L,?   
                                  //?0.1V,?20ppm
                                  //1ppm=1mg/kg=1mg/L=1×10-6 ?,?
            if(menu_1 == 0)
            {   
                smg_i = 8;
                dis_smg[7] = smg_du[temperature % 10];     //?
                dis_smg[6] = smg_du[temperature / 10 % 10] & 0xdf; //?
                dis_smg[5] = smg_du[temperature / 100 % 10] ;       //?
                dis_smg[4] = 0xff;
                dis_smg[3]=smg_du[dengji/1000%10];    //?
                dis_smg[2]=smg_du[dengji/100%10];    //?
                dis_smg[1]=smg_du[dengji/10%10];    //?
                dis_smg[0]=smg_du[dengji%10];        //?    ADC0832?8?ADC,?0~255,?l_tmpdate?
            }
        }
                if(flag_uart==1)
        {
            flag_uart=0;
            ES=0;
            TI=1;
            switch(flag_on)
            {
                case 0: puts("open\n");
                        TR0=1;
                        break;
                case 1: printf("close!\n");
                        TR0=0;
                        break;
                case 2: puts("Error!\n");
                        break;
            }
            while(!TI);//?
            TI=0;
            ES=1;
        }
        if(flag_time==1)
        {
            flag_time=0;
            temperature = read_temp();
            dengji = ad0832read(1,0);
            ES=0;
            TI=1;
            printf("The temp is %fV\n",temperature);
            printf("The alcohol is %fV\n",dengji);
            while(!TI);
            TI=0;
            ES=1;
        }
   
    }
}

/*************?0?***************/
void time0_int() interrupt 1
{   
    static uchar value;             //?2ms?
    TH0 = 0xf8;
    TL0 = 0x30;     //2ms
    display();        //?
    value++;      
    if(value >= 150)
    {
        value = 0;      
        flag_300ms = 1;
    }
    if(flag_lj_en == 1)       //?
    {
        key_time ++;
        if(key_time >= 250) //500ms
        { flag_time=1;
            key_time = 0;
            key_500ms = 1; //500ms
            key_value ++;
            if(key_value > 3)
            {
                key_value = 10;
                flag_lj_3_en = 1; //3?1.5?
            }                        
        }
    }
}
void ser() interrupt 4
{
    RI=0;
    a=SBUF;
    flag_uart=1;
    if(a==1)
        flag_on=0;
     else if(a==2)
            flag_on=1;
        else
            flag_on=2;
}
这是我的程序 ,我想请大家帮我看看哪里有问题 ,我已经完成了数码管显示温度和酒精浓度,只是串口通信部分的问题了!不太懂串口,现在每次手机输入指令 ,单片机不回数据


大家好!大家辛苦了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top