经过几天摸索,终于实现可以蓝牙实时传输到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