amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 90

STC15F204EA简易电压表(顺便实验一下cowboy的2个IO驱动LCD1602方案,话说真的很不错!)

  [复制链接]
(265254760)

打赏出0元收入0元

发表于 2012-2-11 01:42:49 | 显示全部楼层 |阅读模式

(原文件名:z.jpg)


(原文件名:20120211015.jpg)


(原文件名:20120211013.jpg)


(原文件名:20120211005.jpg)


(原文件名:20120211007.jpg)


(原文件名:20120211009.jpg)

// STC 1T @ 12MHz
// P1.0        测量端
// P1.1 接基准源2.5V(TL431)
//
#include <STC15F204EA.H>

sbit IO_4 = P0^0;           //接LCD1602的引脚D4
sbit IO_E = P0^1;           //接LCD1602的引脚E

#define Set_xy(x,y) Send(0,(y<<6)|(x&15)|0x80)

uint8c ASC[]={
                      0x04,0x1F,0x15,0x1F,0x15,0x1F,0x04,0x07,   //0:电       
                      0x0F,0x08,0x0A,0x0A,0x0F,0x0A,0x13,0x0F,   //1:压
                                  0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00,   //2:
                                  0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00,   //3:
                                  0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00,   //4:       
                      0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,   //5:
                                  0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00,   //6:
                                  0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00    //7:
                         };

void YS14520us(void)   
{
    uint8 a,b,c;
    for(c=2;c>0;c--)
        for(b=238;b>0;b--)
            for(a=90;a>0;a--);
}

void YS660us(void)   
{
    uint8 a,b,c;
    for(c=2;c>0;c--)
        for(b=94;b>0;b--)
            for(a=9;a>0;a--);
}

void YS30us(void)  
{
    uint8 a;
     for(a=87;a>0;a--);
}

void YSms(uint8 n)
{
        uint8 a,b;       
        while(n)
        {
            for(b=222;b>0;b--)
        for(a=12;a>0;a--);
            n--;
        }
}
                               
void Send(uint8 RS, uint8 dat)
{
  uint8 i;

  for(i=2;i;i--)
  {
    if(dat & 0x80)IO_4 = 1;   else IO_4 = 0;
    YS14520us();           //14520us (5V,2.2KΩ,2.2uF,4.751065V)

    if(RS)IO_E = 1;

    if(dat & 0x40)IO_4 = 1;   else IO_4 = 0;
    YS660us();             //660us   (5V,2.2KΩ,100nF,4.751065V)

    if(dat & 0x20)IO_4 = 1;   else IO_4 = 0;
    YS30us();              //30us          (5V,2.2KΩ,4.7nF,4.725256V)

    IO_E = 1;
    if(dat & 0x10)IO_4 = 1;   else IO_4 = 0;
    NOP12();               //0.5us < t < 1.36us

    IO_E = 0;

    dat <<= 4;
  }
}

void Send_S(uint8 *p)
{
  while(*p) Send(1,*p++);
}

void Init_1602(void)
{
        uint8 i = 3;

        P0M0 = 0x03;            //P0.0、P0.1推挽输出         
          IO_4 = 0;
          IO_E = 0;
          YSms(40);
                                    
        Send(0,0x33); YSms(1);                     
        Send(0,0x32); YSms(1);          
          Send(0,0x28); YSms(1);
          Send(0,0x0C); YSms(1);
        Send(0,0x06); YSms(1);
          Send(0,0x01); YSms(1);

          // 装入CGRAM //
        Send(0,0x06);                      // CGRAM 地址自动加1
        Send(0,0x40);                      // CGRAM 地址设为 00处
    for(i=0;i<64;i++)Send(1,ASC);   // 按数组写入数据
}

/* ADC操作『ADC_CONTR寄存器』常量定义 */
#define    ADC_POWER       0x80                  //ADC 电源控制位
#define    ADC_FLAG        0x10                  //ADC 完成标志
#define    ADC_START       0x08                  //ADC 启动控制位
#define    ADC_speed_LL    0x00                  //540 时钟
#define    ADC_speed_L     0x20                  //360 时钟
#define    ADC_speed_H     0x40                  //180 时钟
#define    ADC_speed_HH    0x60                  // 90 时钟
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换初始化
      初次使用和更换 A/D 转换通道要适当延时(20uS~200uS), 使输入电压稳定。
      以后如果不更换 A/D 转换通道的话, 不需要加延时。
      如果输入电压信号源的内阻在10K以下,可不加延时。
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void AD_Init()
{
     P1M0 |= 0x03;                           //P1.0、P1.1高阻模式
     P1M1 |= 0x03;            
         ADC_RES = 0;
         P1ASF = 0x03;                           // P1.0、P1.1口作为模拟功能A/D使用
         ADC_CONTR = ADC_POWER | ADC_speed_H ;  //打开A/D电源 ,转换1次/270时钟,默认P1.0通道      
     YS14520us();              //开电源后延时
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换程序
输入:通道号0~7
返回:8位转换值
说明:更换 A/D 转换通道要适当延时(20uS~200uS)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uint8 ADC(uint8 CHa)
{
         s_uint8 CHb;

         if(CHa != CHb)                                   //检测是否更换通道号
         {
            ADC_CONTR &= 0xF8;                   //清通道
                ADC_CONTR |= CHa;                   //更换通道
                YS660us();                       //更换 A/D 转换通道要适当延时(20uS~200uS)
         }
         CHb = CHa;                                           //保存此次通道号

     ADC_CONTR |= ADC_START;       //ADC_START = 1启动 AD 转换,转换结束ADC_START = 0
         NOP12();                                           //经过4个时钟延时后,才能够正确读到ADC_CONTR控制寄存器的值
         while(!(ADC_CONTR & 0x10));
     ADC_CONTR &= ~ADC_FLAG;       //清0 ADC_FLAG 位, 停止A/D转换
     return ADC_RES;               //返回转换结果
}                       

void main(void)
{
        uint8  Value,TL431;
    uint16 Voltage;

        Init_1602();
        Send(0,0x01); //清屏
        AD_Init();

        while(1)
        {       
                        Value = ADC(0);
                        TL431 = ADC(1);
                        Voltage = 250*Value/TL431;

                        // 显示 测量电压值
                        Set_xy(0,0);
                        Send(1,0);
                        Send(1,1);
                        Send(1,':');
                        Send(1,' ');
                        Send(1,'0'+ Voltage/100);
                        Send(1,'.');
                        Send(1,'0'+ Voltage/10%10);
                        Send(1,'0'+ Voltage%10);
                        Send_S("V");

                        // 显示 测量转换值 : 基准源转换值
                Set_xy(9,1);                  
                        Send(1,'0'+ Value/100);
                        Send(1,'0'+ Value/10%10);
                        Send(1,'0'+ Value%10);
                        Send(1,':');
                        Send(1,'0'+ TL431/100);
                        Send(1,'0'+ TL431/10%10);
                        Send(1,'0'+ TL431%10);
                        YSms(10);       
        }
}
(265238801)

打赏出0元收入0元

发表于 2012-2-11 06:08:48 | 显示全部楼层
顶帖,8位AD,不知10位AD会不会更精确。
(265232121)

打赏出0元收入0元

发表于 2012-2-11 08:00:08 | 显示全部楼层
不知道楼主的中文字是用什么软件取模的,怎样在液晶显示为5X7字体。
(265229285)

打赏出0元收入0元

发表于 2012-2-11 08:47:24 | 显示全部楼层
求完整电路图。想看看你对信号采集杂讯处理的办法。
(265228448)

打赏出0元收入0元

发表于 2012-2-11 09:01:21 | 显示全部楼层
不错~ 之前也做了一个用STC采集电压的,8位还好吧,
就是AD零点不准,需软件校准
(265227219)

打赏出0元收入0元

发表于 2012-2-11 09:21:50 | 显示全部楼层
回复【3楼】lengshuicha 冷水茶
求完整电路图。想看看你对信号采集杂讯处理的办法。
-----------------------------------------------------------------------

同求!
(265226459)

打赏出0元收入0元

发表于 2012-2-11 09:34:30 | 显示全部楼层
mk
(265217406)

打赏出0元收入0元

发表于 2012-2-11 12:05:23 | 显示全部楼层
MARK
(265214343)

打赏出0元收入0元

发表于 2012-2-11 12:56:26 | 显示全部楼层
cowboy的2个IO驱动1602是不错~
不过直接用移位寄存器会比较省元件
(265209377)

打赏出0元收入0元

 楼主| 发表于 2012-2-11 14:19:12 | 显示全部楼层
回复【8楼】Pony279 霍斯
-----------------------------------------------------------------------

11IO驱动,(3+8总线,检测忙信号;
7 IO驱动,(3+4总线,检测忙信号;
6 IO驱动,(2+4总线,不检测忙信号;
3 IO驱动,(595),不检测忙信号;
2 IO驱动,(电阻+电容),不检测忙信号;

哈!上面的各种方案都实验过了,以后想用哪个就用哪个。
(265201724)

打赏出0元收入0元

 楼主| 发表于 2012-2-11 16:26:45 | 显示全部楼层
回复【3楼】lengshuicha 冷水茶
-----------------------------------------------------------------------
回复【5楼】looklooktom looklooktom
-----------------------------------------------------------------------


(原文件名:实验.jpg)
(265196136)

打赏出0元收入0元

发表于 2012-2-11 17:59:53 | 显示全部楼层
顶一下
(265192857)

打赏出0元收入0元

发表于 2012-2-11 18:54:32 | 显示全部楼层
要好好琢磨一下。
(265095623)

打赏出0元收入0元

发表于 2012-2-12 21:55:06 | 显示全部楼层
不错,学习啦。
(265091707)

打赏出0元收入0元

发表于 2012-2-12 23:00:22 | 显示全部楼层
恩,这个方法很不错

最近也进了几片8DIP的单片机,也需要1602液晶,本来还想595扩口
(264450367)

打赏出0元收入0元

发表于 2012-2-20 09:09:22 | 显示全部楼层
MARK
(264447444)

打赏出0元收入0元

发表于 2012-2-20 09:58:05 | 显示全部楼层
学习一下
(264446726)

打赏出0元收入0元

发表于 2012-2-20 10:10:03 | 显示全部楼层
回复【10楼】BXAK  
-----------------------------------------------------------------------

原来那儿如此简单啊,我还以为要像那些复杂电路那样搞。
(264446322)

打赏出0元收入0元

发表于 2012-2-20 10:16:47 | 显示全部楼层
0.26-2.06-3.16怎么会是8位呢?
(264323252)

打赏出0元收入0元

发表于 2012-2-21 20:27:57 | 显示全部楼层
(264317328)

打赏出0元收入0元

发表于 2012-2-21 22:06:41 | 显示全部楼层
学习了,谢谢
(264234232)

打赏出0元收入0元

发表于 2012-2-22 21:11:37 | 显示全部楼层
楼主没有加软件滤波,不知道AD飘的厉害不
(264233887)

打赏出0元收入0元

 楼主| 发表于 2012-2-22 21:17:22 | 显示全部楼层
回复【21楼】wtiechen1969
-----------------------------------------------------------------------

笔记本的USB供电,没飘,10位没试过
(260805215)

打赏出0元收入0元

发表于 2012-4-2 13:41:54 | 显示全部楼层
不错,跟着做一下,人肉驱动1602是学不来了
(260804438)

打赏出0元收入0元

发表于 2012-4-2 13:54:51 | 显示全部楼层
(260798593)

打赏出0元收入0元

发表于 2012-4-2 15:32:16 | 显示全部楼层
楼主的创新精神非常值得学习,且响应的国家环保的号召,节约了资源,
(259865568)

打赏出0元收入0元

发表于 2012-4-13 10:42:41 | 显示全部楼层
我用5204AD做过,但线性太差,不知这个线性如何
头像被屏蔽
(258901814)

打赏出0元收入0元

发表于 2012-4-24 14:25:15 | 显示全部楼层
cool !
(258791327)

打赏出0元收入0元

发表于 2012-4-25 21:06:42 | 显示全部楼层
for(i=0;i<64;i++)
Send(1,ASC);  // 按数组写入数据 这里有警告
STC15F204EA简易电压表.C(128):C214: 'ARGUMENT': CONVERSION: POINTER TO NON-POINTER
(258790891)

打赏出0元收入0元

 楼主| 发表于 2012-4-25 21:13:58 | 显示全部楼层
本帖最后由 BXAK 于 2012-4-25 21:17 编辑
LBQ691477940 发表于 2012-4-25 21:06
for(i=0;i


错误:for(i=0;i<64;i++)Send(1,ASC);   // 按数组写入数据

改正:for(i=0;i<64;i++)Send( 1,  ASC[ i] );   // 按数组写入数据

PS:很奇怪,ASC[ i]的中括号内要有个空格,不然帖出去无法显示

(251224091)

打赏出0元收入0元

发表于 2012-7-22 11:07:18 | 显示全部楼层
BXAK 发表于 2012-4-25 21:13
错误:for(i=0;i

楼主你好,这款芯片有串口功能吗?

我自己弄了一个串口发送的子程序。测试发送正确。

然后,我试着读取它内部ID的时候一直无法语到。

用的是数据手册上他们提供例程的那样的读取方式。

unsigned char i = 0,j = 0;
unsigned char idata *idata_point;


idata_point = 0xF1;
for(j = 0;j < 7;j++)
{
        i = *idata_point;
        IDBUFA[j] = i;
        idata_point++;
}

然后我用串口打印IDBUFA的值回PC机
for(j = 0;j < 7;j++)
{       
        SendUart(IDBUFA[j]);
        Delayms(5);
}

其中SendUart是软件里写的仿串口的函数。

望楼主能给予帮助,谢谢。
(251222781)

打赏出0元收入0元

 楼主| 发表于 2012-7-22 11:29:08 | 显示全部楼层
tomy 发表于 2012-7-22 11:07
楼主你好,这款芯片有串口功能吗?

我自己弄了一个串口发送的子程序。测试发送正确。

STC15F204EA、STC15F105E没有硬件串口,
如果只要发送可以用延时模拟,
如果发送、接收都需要用定时器模拟

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

#define MAIN_Fosc                12000000L        //定义主时钟, 模拟串口会自动适应。5~36MHZ

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结束
}
(251222340)

打赏出0元收入0元

发表于 2012-7-22 11:36:29 | 显示全部楼层
BXAK 发表于 2012-7-22 11:29
STC15F204EA、STC15F105E没有硬件串口,
如果只要发送可以用延时模拟,
如果发送、接收都需要用定时器模 ...

这个模拟串口的我已经有弄好了的。

也可以用。

/*==========================================*/
/*---------------主程序开始入口-------------*/
/*==========================================*/
void main(void)
{
        unsigned char i = 0,j = 0;
        unsigned char idata *idata_point;
       
        StartInitial();                //上电初始化
//        T0Init();                        //TMR0 初始化       
//        T1Init();

        idata_point = 0xF1;
        for(j = 0;j < 7;j++)
        {
                i = *idata_point;
                IDBUFA[j] = i;
                idata_point++;
        }

        for(j = 0;j < 7;j++)
        {
                SendUart(IDBUFA[j]);
                Delayms(10);
        }

        while(1);
}


/*==========================================*/
/*---------------初始化程序入口-------------*/
/*==========================================*/
void StartInitial()
{
        P1M1 = 0x0f;
        P1M0 = 0x50;        //1.4 as output,P1.6 as output.1.3-1.0为输入。

#ifdef LEDCAPS
        LED = 1;                //关闭LED灯
#else
        LED = 0;                //关闭LED灯
#endif

        P2M1 = 0xFF;       
        P2M0 = 0x00;        //2.7-2.0为输入。


        P3M1 = 0xF0;
        P3M0 = 0x82;        //3.0准双向IO,灌电流可达20mA;3.1为推挽输出,3.4-3.6为输入,3.7 as output
       
       
        POW = 1;                //开启电源       
       
        UART_PORT1 = 1;


//        PCON &= 0x7f;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
//        AUXR &= 0xbf;                //定时器1时钟为Fosc/12,即12T
//        AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
//        TMOD &= 0x0f;                //清除定时器1模式位
//        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
//        TMOD = 0X21;
        WDT_CONTR = 0x17;        //看门狗设定

        ES = 0;
        EA = 0;
}
/*==========================================*/
/*-------------串口发送程序入口-------------*/
/*--------测试使用:11.0592 9600bps---------*/
/*==========================================*/
void SendUart(unsigned char k)
{
        unsigned char i;
        UART_PORT1 = 0;
        UartDelay();
       
        for(i = 0x01; i > 0; i*=2)
        {
                if(k & i)UART_PORT1 = 1;
                else{UART_PORT1 = 0;}
                UartDelay();                       
        }
        UART_PORT1 = 1;
}
/*==========================================*/
/*---------------延时子程序入口-------------*/
/*==========================================*/
void UartDelay(void)
{
    unsigned char j  =   0;
    for(j=0;j<123;j++)
    {
        _nop_();
        _nop_();
    }
}



以上是我程序贴出部份,不知道这里哪里不对。

串口发送的那个子程序我验证了。发字符什么的都是正确的。
(251221247)

打赏出0元收入0元

 楼主| 发表于 2012-7-22 11:54:42 | 显示全部楼层
tomy 发表于 2012-7-22 11:36
这个模拟串口的我已经有弄好了的。

也可以用。

【1】你这个模拟串口不太方便,一改晶振就得改延时函数,我那个只要改这里就行  #define MAIN_Fosc  12000000L  //定义主时钟,模拟串口会自动适应,5~36MHz

【2】说说你读ID问题,没硬件串口,
        SCON = 0x50;                //8位数据,可变波特率
        ES = 0;
        EA = 0;
        上面3个语句就没必要了,

        你这里SendUart(IDBUFA[j]);是以十六进制发送的,串口也应选着 “十六进制显示”,想用 “字符显示”来显示变量,必须自己写个HEX转ASCII函数,

       还有STC15系列的ID读取最好直接读取code里面的(永久存在),idata里面的ID只是临时的
        
      
(251219259)

打赏出0元收入0元

发表于 2012-7-22 12:27:50 | 显示全部楼层
BXAK 发表于 2012-7-22 11:54
【1】你这个模拟串口不太方便,一改晶振就得改延时函数,我那个只要改这里就行  #define MAIN_Fosc  1200 ...

好的。。谢谢楼主指点。。我先试下读CODE里面的。

你那个串口函数,我就抄走啦。。嘻嘻。


我写的那个是前几天临时测用写的一个。
(251215041)

打赏出0元收入0元

发表于 2012-7-22 13:38:08 | 显示全部楼层
谢谢楼主。刚才试了,改读CODE里面的ID。
指针:idata_point的定议更改如下:
        unsigned char code *idata_point;
同时对应的CODE地址也改为(1024*4-1)-7=4089;15F204的ROM为4K,最后7字节首地址.
之后再试,就有值出来了。
回读的值与ISP下载器上显示的值相同。


感谢BXAK 的帮助。。谢谢。
(251034401)

打赏出0元收入0元

发表于 2012-7-24 15:48:48 | 显示全部楼层
好帖,先留下记号。有空慢慢看
(251028971)

打赏出0元收入0元

发表于 2012-7-24 17:19:18 | 显示全部楼层
高手佩服啊好好学一下
(250997350)

打赏出0元收入0元

发表于 2012-7-25 02:06:19 | 显示全部楼层
学习下……
(250061693)

打赏出0元收入0元

发表于 2012-8-4 22:00:36 | 显示全部楼层
这个电压表测量的范围是多少到多少的?
(249910314)

打赏出0元收入0元

发表于 2012-8-6 16:03:35 | 显示全部楼层
学习了,我想自己做个
(249811338)

打赏出0元收入0元

发表于 2012-8-7 19:33:11 | 显示全部楼层
正在痛苦 的学习中啊!!!!!
(249811306)

打赏出0元收入0元

发表于 2012-8-7 19:33:43 | 显示全部楼层
请求指导啊  在线等各位指导啊
(249811236)

打赏出0元收入0元

发表于 2012-8-7 19:34:53 | 显示全部楼层
p1M1不设置可以吗
(249809244)

打赏出0元收入0元

发表于 2012-8-7 20:08:05 | 显示全部楼层
mark           
(249806435)

打赏出0元收入0元

发表于 2012-8-7 20:54:54 | 显示全部楼层
我还有一个IO驱动的呢。。见我的帖子。
(249806051)

打赏出0元收入0元

发表于 2012-8-7 21:01:18 | 显示全部楼层
(249805337)

打赏出0元收入0元

 楼主| 发表于 2012-8-7 21:13:12 | 显示全部楼层
chinayuyi2011 发表于 2012-8-4 22:00
这个电压表测量的范围是多少到多少的?

简单的实验程序罢了,范围:0~5V,
想要测宽压,就加两个电阻分压,如1:10电阻分压后可测范围:0~50V,当然程序要小改,要用STC15F204EA的10位ADC
(249804616)

打赏出0元收入0元

 楼主| 发表于 2012-8-7 21:25:13 | 显示全部楼层
zgf5539 发表于 2012-8-7 19:34
p1M1不设置可以吗

STC的使用ADC时,对应的IO要设置成高阻或者开漏模式,这样ADC的输入阻抗高,
STC15F204EA、STC12C5A60S2系列 直接设置 P1ASF寄存器就行,不用设置P1M1、P1M0,
没有 P1ASF寄存器 的型号就要通过设置P1M1、P1M0
(249803297)

打赏出0元收入0元

 楼主| 发表于 2012-8-7 21:47:12 | 显示全部楼层
bg6agf 发表于 2012-8-7 21:01
http://www.amobbs.com/thread-5261332-1-1.html

原理差不多,利用了RC,
但对我来说,既然用595,干脆就3线驱动算了

(249799096)

打赏出0元收入0元

发表于 2012-8-7 22:57:13 | 显示全部楼层
关键是现在我用两路AD采样,偏偏一路电压的正确而另一路四错误的,十分苦恼啊
(249798996)

打赏出0元收入0元

发表于 2012-8-7 22:58:53 | 显示全部楼层
两路的程序检查过用的是同一处理方式,找不出错误啊,麻烦用过的指点一下 啊  !用的是STC15F204
(249798703)

打赏出0元收入0元

发表于 2012-8-7 23:03:46 | 显示全部楼层
好东西,进来学习来了。
(249797970)

打赏出0元收入0元

发表于 2012-8-7 23:15:59 | 显示全部楼层
能帮我联系下楼主吗   急求啊  我新来的   不能发消息   谢谢啊
(249757281)

打赏出0元收入0元

 楼主| 发表于 2012-8-8 10:34:08 | 显示全部楼层
zgf5539 发表于 2012-8-7 22:58
两路的程序检查过用的是同一处理方式,找不出错误啊,麻烦用过的指点一下 啊  !用的是STC15F204 ...

参考STC15F204EA里面的程序例程,想读取  哪通道ADC  直接在  形参里输入通道号  就行
  1. /*Define ADC operation const for ADC_CONTR*/
  2. #define ADC_POWER   0x80              //ADC power control bit
  3. #define ADC_FLAG    0x10              //ADC complete flag
  4. #define ADC_START   0x08              //ADC start control bit
  5. #define ADC_SPEEDLL 0x00               //540 clocks
  6. #define ADC_SPEEDL  0x20              //360 clocks
  7. #define ADC_SPEEDH  0x40              //180 clocks
  8. #define ADC_SPEEDHH 0x60              //90 clocks

  9. /*----------------------------
  10. Software delay function
  11. ----------------------------*/
  12. void Delay(uint16 n)
  13. {
  14.         uint16 x;
  15.         while (n--)
  16.         {
  17.                 x = 5000;
  18.                 while (x--);
  19.         }
  20. }

  21. /*----------------------------
  22. Initial ADC sfr
  23. ----------------------------*/
  24. void InitADC()
  25. {
  26.         P1ASF = 0xff;                         //Open 8 channels ADC function
  27.         ADC_RES = 0;                          //Clear previous result
  28.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  29.         Delay(2);                             //ADC power-on and delay
  30. }

  31. /*----------------------------
  32. Get ADC result
  33. ----------------------------*/
  34. uint8 GetADCResult(uint8 ch)
  35. {
  36.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  37.         _nop_();                              //Must wait before inquiry
  38.         _nop_();
  39.         _nop_();
  40.         _nop_();
  41.         while (!(ADC_CONTR & ADC_FLAG));  //Wait complete flag
  42.         ADC_CONTR &= ~ADC_FLAG;            //Close ADC
  43.         return ADC_RES;                       //Return ADC result
  44. }
复制代码
(249624748)

打赏出0元收入0元

发表于 2012-8-9 23:23:01 | 显示全部楼层
又可以学习了
(248009881)

打赏出0元收入0元

发表于 2012-8-28 15:57:28 | 显示全部楼层
关注一下,STC15F204EA简易电压表
(247554299)

打赏出0元收入0元

发表于 2012-9-2 22:30:30 | 显示全部楼层
学习学习
(246688472)

打赏出0元收入0元

发表于 2012-9-12 23:00:57 | 显示全部楼层
MARK               
(244001398)

打赏出0元收入0元

发表于 2012-10-14 01:25:31 | 显示全部楼层
试了一下,简单好用
(223969181)

打赏出0元收入0元

发表于 2013-6-2 21:55:48 | 显示全部楼层
楼主强人,以后准备仿制一个
(223967056)

打赏出0元收入0元

发表于 2013-6-2 22:31:13 | 显示全部楼层
学习了,牛人
(223916846)

打赏出0元收入0元

发表于 2013-6-3 12:28:03 | 显示全部楼层
菜鸟一个,不明白个中的原理,不知有没有人解析一下.
(223911846)

打赏出0元收入0元

发表于 2013-6-3 13:51:23 | 显示全部楼层
为什么线之间的数据不会互相干扰的?
(223890485)

打赏出0元收入0元

发表于 2013-6-3 19:47:24 来自手机 | 显示全部楼层
认真学习下,谢谢!
(223799053)

打赏出0元收入0元

发表于 2013-6-4 21:11:16 | 显示全部楼层
有时间试下2个IO口驱动1602……
(223700917)

打赏出0元收入0元

发表于 2013-6-6 00:26:52 | 显示全部楼层
长知识了
(223660270)

打赏出0元收入0元

发表于 2013-6-6 11:44:19 | 显示全部楼层
MARK                                
(223022071)

打赏出0元收入0元

发表于 2013-6-13 21:00:58 | 显示全部楼层
Voltage = 250*Value/TL431;

这句什么意思呢?不应该是Voltage = ADC*VCC/256吗?

解释一下咯
(219923114)

打赏出0元收入0元

发表于 2013-7-19 17:50:15 | 显示全部楼层
厉害啊,,谢谢楼主分享
(219858889)

打赏出0元收入0元

发表于 2013-7-20 11:40:40 | 显示全部楼层
做的不错,
(206345493)

打赏出0元收入0元

发表于 2013-12-23 21:23:56 | 显示全部楼层
好东西,楼主太强大了!
(206191383)

打赏出0元收入0元

发表于 2013-12-25 16:12:26 | 显示全部楼层
不错,谢谢分享!
(206182866)

打赏出0元收入0元

发表于 2013-12-25 18:34:23 | 显示全部楼层
楼主 能把整个工程打包发上来不 学习一下
(206105865)

打赏出0元收入0元

发表于 2013-12-26 15:57:44 | 显示全部楼层
挺不错的
(206071673)

打赏出0元收入0元

发表于 2013-12-27 01:27:36 | 显示全部楼层
太强大了,两个I/O搞定了
(206043804)

打赏出0元收入0元

发表于 2013-12-27 09:12:05 | 显示全部楼层
太厉害了,不知道要测负电压怎么搞。
(205697084)

打赏出0元收入0元

发表于 2013-12-31 09:30:45 | 显示全部楼层
如果是10位的,Value/TL431*2500 程序该如何写
(204803867)

打赏出0元收入0元

发表于 2014-1-10 17:37:42 | 显示全部楼层
能分享下15f204ea的头文件么,谢谢
(204788753)

打赏出0元收入0元

发表于 2014-1-10 21:49:36 | 显示全部楼层
大赞大赞
(199970435)

打赏出0元收入0元

发表于 2014-3-7 16:14:54 | 显示全部楼层
mark  标记看看
(143204497)

打赏出0元收入0元

发表于 2015-12-24 16:33:52 | 显示全部楼层
求详细的原理图
(143181818)

打赏出0元收入0元

发表于 2015-12-24 22:51:51 | 显示全部楼层
llx04 发表于 2015-12-24 16:33
求详细的原理图

不用求。你只要把贴看完,就能看到了。这楼还不怎么高。
(143129859)

打赏出0元收入0元

发表于 2015-12-25 13:17:50 | 显示全部楼层
1602怎么取汉字的模的?
(143123283)

打赏出0元收入0元

发表于 2015-12-25 15:07:26 | 显示全部楼层
顶一个   
(143120959)

打赏出0元收入0元

发表于 2015-12-25 15:46:10 | 显示全部楼层
LZ, 你的测量电压输入,为什么不用分压啊。
(143120769)

打赏出0元收入0元

发表于 2015-12-25 15:49:20 | 显示全部楼层
BXAK 发表于 2012-2-11 16:26
回复【3楼】lengshuicha 冷水茶
---------------------------------------------------------------------- ...

你这个怎么没有TL431的基准电压部分?
(143119614)

打赏出0元收入0元

发表于 2015-12-25 16:08:35 | 显示全部楼层
秋夜木语 发表于 2015-12-25 13:17
1602怎么取汉字的模的?

自己动手做
(139665363)

打赏出0元收入0元

发表于 2016-2-3 15:39:26 | 显示全部楼层
恩学习了谢谢楼主
(137522457)

打赏出0元收入0元

发表于 2016-2-28 10:54:32 | 显示全部楼层
长见识了,谢谢!
(16019512)

打赏出0元收入0元

发表于 2020-1-4 17:43:37 | 显示全部楼层
yuyu87 发表于 2012-2-11 09:01
不错~ 之前也做了一个用STC采集电压的,8位还好吧,
就是AD零点不准,需软件校准 ...

如何软件校准呀?能否说具体一点方法,谢谢
(14960844)

打赏出0元收入0元

发表于 2020-1-16 23:48:05 | 显示全部楼层
这种驱动方式很是佩服!
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-8 03:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表