切换到宽版
  • 5373阅读
  • 10回复

[C51]蓝牙电压表雏形;用Android手机的电压表 [复制链接]

上一主题 下一主题
离线kpj001
 
发帖
94
M币
19
专家
4
粉丝
12
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-08-02
经过几天摸索,终于实现可以蓝牙实时传输到Android手机的电压表。非常简单就实现了,节约大把调试1602等LCD的时间。


思路是借别人的:AD0接TL431做基准;AD1接被测(上限Vcc),目前没接被测就直接显示1023。工具AD1/AD0X2.5就可以算出Vcc电压。


所用到的材料非常少,适合初学者练手,总比搭个数码管显示来的洋气些。
    手机1个,任意android手机带蓝牙即可。
    面包板1个,这个需要买贵的,几块钱的时常接触不良。
    杜邦线线若干
    STC12C2052AD 单片机一个
    TL431 基准电压IC+150欧姆电阻1只
    蓝牙模块HC06 30元买的,带android串口程序
    Keil2编译软件


以后需要继续两个方向,Android编程出直观的电压表界面,带时间轴的分析图; 提高AD精度,扩展测量模块的功能。

图片中绿色电容和电阻是PWM输出方波三角波正弦波,也是例程里可以找到的。





程序如下,以下全部复制到keil2编译即可,其实就是例程而已,ADC1口多加了一次ADC转换:

/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Programme Demo ----------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

/*      本程序经过测试完全正常, 不提供电话技术支持, 如不能理解, 请自行补充相关基础.  */


/*************    本程序功能说明    **************

P1.0做ADC输入,从串口输出结果(ASCII),9600,8,N,1.

可户只需要更改 MAIN_Fosc 来适应自己的系统。

******************************************/


/*************    用户系统配置    **************/

//#define MAIN_Fosc        22118400UL    //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ
//#define MAIN_Fosc         5800000UL    //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ

#define MAIN_Fosc         5504084UL   //2052AD in

/*************    以下宏定义用户请勿修改    **************/
#include    "reg51.H"
#define    uchar    unsigned char
#define uint    unsigned int
/******************************************/

sfr ADC_RESL   = 0xbe;
sfr ADC_CONTR  = 0xc5;
sfr ADC_RES    = 0xc6;

sfr P1M0 = 0x91;    //P1M0.n,P1M1.n     =00--->Standard,    01--->push-pull
sfr P1M1 = 0x92;    //                    =10--->pure input,    11--->open drain

//                                7       6      5       4         3      2    1    0   Reset Value
//sfr ADC_CONTR = 0xBC;        ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000    //AD 转换控制寄存器
#define ADC_OFF()    ADC_CONTR = 0
#define ADC_ON        (1 << 7)
#define ADC_270T    (3 << 5)
#define ADC_540T    (2 << 5)
#define ADC_810T    (1 << 5)
#define ADC_1080T    0
#define ADC_FLAG    (1 << 4)    //软件清0
#define ADC_START    (1 << 3)    //自动清0
#define ADC_CH0        0
#define ADC_CH1        1
#define ADC_CH2        2
#define ADC_CH3        3
#define ADC_CH4        4
#define ADC_CH5        5
#define ADC_CH6        6
#define ADC_CH7        7


/************* 本地变量声明 **************/
sbit    P_TXD1 = P3^1;


/************* 本地函数声明 **************/
void    Tx1Send(uchar dat);
void    PrintString(unsigned char code *puts);
void      delay_ms(unsigned char ms);
uint    adc10_start(uchar channel);    //channel = 0~7




/********************* 主函数 *************************/
void main(void)
{
    uint    j;

    PrintString("****** STC12C5A60S2系列ADC程序 2011-02-27 ******\r\n");    //上电后串口发送一条提示信息

    P1M1 &= ~0x01;    //Set ADC Input as pure input
    P1M0 |=  0x01;
    ADC_CONTR = ADC_270T | ADC_ON;

    while(1)
    {
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);

        j = adc10_start(0);        // P1.0 ADC 12脚
        Tx1Send('A');
        Tx1Send('D');
        Tx1Send('0');
        Tx1Send('=');
        Tx1Send(j/1000 + '0');
        Tx1Send(j%1000/100 + '0');
        Tx1Send(j%100/10 + '0');
        Tx1Send(j%10 + '0');
        Tx1Send(0x0d);
        Tx1Send(0x0a);

         j = adc10_start(1);        // P1.1 ADC 13脚
        Tx1Send('A');
        Tx1Send('D');
        Tx1Send('1');
        Tx1Send('=');
        Tx1Send(j/1000 + '0');
        Tx1Send(j%1000/100 + '0');
        Tx1Send(j%100/10 + '0');
        Tx1Send(j%10 + '0');
        Tx1Send(0x0d);
        Tx1Send(0x0a);


    }
}

/********************* 做一次ADC转换 *******************/
uint    adc10_start(uchar channel)    //channel = 0~7
{
    uint    adc;
    uint    i;

    ADC_RES = 0;
    ADC_RESL = 0;

    ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;

    i = 1000;
    do{
        if(ADC_CONTR & ADC_FLAG)
        {
            ADC_CONTR &= ~ADC_FLAG;
            adc = (uint)ADC_RES;
            adc = (adc << 2) | (ADC_RESL & 3);
            return    adc;
        }
    }while(--i);
    return    1024;    //超时错误
}

//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数.
// 返回: none.
// 版本: VER1.0
// 日期: 2010-12-15
// 备注:
//========================================================================
void  delay_ms(unsigned char ms)
{
     unsigned int i;
     do{
          i = MAIN_Fosc / 14000;
          while(--i)    ;   //14T per loop
     }while(--ms);
}


/********************** 模拟串口相关函数************************/

void    BitTime(void)    //位时间函数
{
    uint i;
    i = ((MAIN_Fosc / 100) * 104) / 140000L - 1;        //根据主时钟来计算位时间
    while(--i);
}

//模拟串口发送
void    Tx1Send(uchar dat)        //9600,N,8,1        发送一个字节
{
    uchar    i;
    EA = 0;
    P_TXD1 = 0;
    BitTime();
    for(i=0; i<8; i++)
    {
        if(dat & 1)        P_TXD1 = 1;
        else            P_TXD1 = 0;
        dat >>= 1;
        BitTime();
    }
    P_TXD1 = 1;
    EA = 1;
    BitTime();
    BitTime();
}

void PrintString(unsigned char code *puts)        //发送一串字符串
{
    for (; *puts != 0;    puts++)  Tx1Send(*puts);     //遇到停止符0结束
}






VB6 简单实现 蓝牙串口电压监控:http://bbs.mydigit.cn/read.php?tid=667577
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共6条打赏 ,M币+25 ,专家+2
离线bbsniua
发帖
133
M币
345
专家
2
粉丝
11
只看该作者 1楼 发表于: 2013-08-02
请登录后查看
离线nono鎶

发帖
619
M币
90
专家
2
粉丝
10
只看该作者 2楼 发表于: 2013-08-02
请登录后查看
离线lauey

发帖
5319
M币
8230
专家
9
粉丝
130
只看该作者 3楼 发表于: 2013-08-02
请登录后查看
离线xktx09

发帖
4992
M币
3889
专家
2
粉丝
126
只看该作者 4楼 发表于: 2013-08-23
请登录后查看
离线kpj001
发帖
94
M币
19
专家
4
粉丝
12
只看该作者 5楼 发表于: 2013-08-23
请登录后查看

发帖
767
M币
291
专家
3
粉丝
28
只看该作者 6楼 发表于: 2013-08-23
请登录后查看
离线kpj001
发帖
94
M币
19
专家
4
粉丝
12
只看该作者 7楼 发表于: 2013-08-24
回 6楼(窗外有蓝天) 的帖子
请登录后查看
离线lvniqi

发帖
16
M币
55
专家
1
粉丝
3
只看该作者 8楼 发表于: 2013-09-21
请登录后查看
离线朱宝

发帖
1813
M币
617
专家
4
粉丝
158
只看该作者 9楼 发表于: 2013-09-21
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个