找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15071|回复: 23
收起左侧

是STC15F204EA的程序,请人改成STC15W408AS能用的程序

  [复制链接]
ID:126608 发表于 2016-10-16 07:43 | 显示全部楼层 |阅读模式
100黑币
这是一个网上公开的程序,因只有STC15W408AS,就照样做了一个板,但显示不正确,请人改成STC15W408AS能用的程序,愿用80黑币给解决问题的人。
#include<stc15f204ea.h>
//#include<STC15W408AS,H>
#include<intrins.h>
#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 时钟
typedef unsigned long  uint;
void delay(unsigned int x);            //函数声明
void LCD(unsigned int LedNumVal);       //函数声明
void Delay1ms();                       //函数声明
void Delay150us();                       //函数声明
void AD_Init();                           //函数声明
uint ADC(uint m);                       //函数声明
void Delay350us();                       //函数声明
void Delay20ms();                       //函数声明
unsigned char code   Disp_Tab[] = {0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f,0xd7};  //  数组   0-9
unsigned char code   dispbit[4]={0x07,0x0b,0x0d,0x0e};    //位选控制

/************主函数**********************/
void main()
{
uint Vcc,Int,V,Int_S, Vcc_S;
unsigned char m,M;

P3M1=0x00;
P3M0=0xff;                  //设置P3口强推挽输出
AD_Init();                 //AD初始化
Delay1ms();                 //开始采样电压前延时,电路有几个电容充电未完成前会拉低部分元器件电压(导致采样电压不准),目测须延时1S,懒得改程序了

while(1)
{



    Delay20ms();
    Int_S=0;
    Vcc_S=0;
    m=0;

        for(m;m<24;m++)
    {


        Delay350us();         //采样电压时差
        Int_S += ADC(4);
        Vcc_S += ADC(5);   
        Int = Int_S/24;
        Vcc = Vcc_S/24;        //采样24次电压求平均值

    }
    M=20*Int/Vcc;
    if(M>16) V=19150*Int/Vcc;
    else if(M>11) V=19100*Int/Vcc;         //大于11V电压转换公式
    else if(M>10) V=19150*Int/Vcc;         //10V-11V
    else if(M>5) V=19200*Int/Vcc;         //5V-10V
    else if(M>3) V=19350*Int/Vcc;         //3V-5V
    else if(M>1) V=19550*Int/Vcc;         //1V-3V
    else if(M>=0) V=20000*Int/Vcc;         //0-1V                 各量程精度调整

    LCD(V);                              //电压显示
     }
     }


/*******数码管显示函数*************/
void LCD(unsigned int LedNumVal)
{  
   unsigned int LedOut[4];           //变量定义


        if(LedNumVal>9999)
    {
     LedOut[0]=Disp_Tab[LedNumVal%100000/10000];            // 千位           
     LedOut[1]=Disp_Tab[LedNumVal%10000/1000]|0x20;                // 百位   
     LedOut[2]=Disp_Tab[LedNumVal%1000/100];                // 十位
     LedOut[3]=Disp_Tab[LedNumVal%100/10];                    // 个位
    }
     if(LedNumVal<10000)   
    {        
     LedOut[0]=Disp_Tab[LedNumVal%10000/1000]|0x20;            // 千位           
     LedOut[1]=Disp_Tab[LedNumVal%1000/100];                   // 百位   
     LedOut[2]=Disp_Tab[LedNumVal%100/10];                    // 十位
     LedOut[3]=Disp_Tab[LedNumVal%10];                        // 个位                     if语句 实现 小数点自动切换

    }


    P3=LedOut[3];
    P11=0;
    delay(700);
    P11=1;


    P3=LedOut[2];
    P12=0;
    delay(700);
    P12=1;

    P3=LedOut[1];
    P10=0;
    delay(700);
    P10=1;

    P3=LedOut[0];
    P13=0;
    delay(700);
    P13=1;

    delay(700);           //  数码管消隐                     

  }   

/***********AD初始化***************/
void AD_Init()
{
P1M1=0x30;
P1M0=0x00;                 //设置P1.4\P1.5高阻
ADC_RES=0x00;
P1ASF=0x30;
ADC_CONTR=ADC_POWER|ADC_speed_LL;
Delay1ms();   

}
/*********电压采样*********/
uint ADC(uint m)
{
        if(m==4)
    {
        ADC_CONTR &=0xf8;    //清空通道
        ADC_CONTR |=0x04;     //更换通道
        Delay150us();         //更换通道延时
    }   
    if(m==5)
    {
        ADC_CONTR &=0xf8;
        ADC_CONTR |=0x05;
        Delay150us();
    }   
    ADC_CONTR |=ADC_START;    //开启AD转换
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while(!(ADC_CONTR & 0x10));  
    ADC_CONTR &= ~ADC_FLAG;
    return ADC_RES;               //返回转换结果

}
/*******************延时函数**********/
void delay(unsigned int x)
{
    char j;
    for(x; x> 0; x--)
        for(j = 400; j > 0; j--);
}
void Delay1ms()        [url=]//@12.000MHz[/url]
{
    unsigned char i, j;
    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
}
void Delay150us()        [url=]//@12.000MHz[/url]
{
    unsigned char i, j;
    i = 2;
    j = 189;
    do
    {
        while (--j);
    } while (--i);
}
void Delay350us()        [url=]//@12.000MHz[/url]
{
    unsigned char i;
    _nop_();
    i = 172;
    while (--i);
}
void Delay20ms()        [url=]//@12.000MHz[/url]
{
    unsigned char i, j;
    i = 39;
    j = 230;
    do
    {
        while (--j);
    } while (--i);
}

回复

使用道具 举报

ID:123732 发表于 2016-10-19 09:38 | 显示全部楼层
  1. #include<STC15W408AS.H>
  2. #include<intrins.h>
  3. #define    ADC_POWER       0x80                  //ADC 电源控制位
  4. #define    ADC_FLAG        0x10                  //ADC 完成标志
  5. #define    ADC_START       0x08                  //ADC 启动控制位
  6. #define    ADC_speed_LL    0x00                  //540 时钟
  7. #define    ADC_speed_L     0x20                  //360 时钟
  8. #define    ADC_speed_H     0x40                  //180 时钟
  9. #define    ADC_speed_HH    0x60                  // 90 时钟
  10. typedef unsigned long  uint;
  11. void delay(unsigned int x);            //函数声明
  12. void LCD(unsigned int LedNumVal);       //函数声明
  13. void Delay1ms();                       //函数声明
  14. void Delay150us();                       //函数声明
  15. void AD_Init();                           //函数声明
  16. uint ADC(uint m);                       //函数声明
  17. void Delay350us();                       //函数声明
  18. void Delay20ms();                       //函数声明
  19. unsigned char code   Disp_Tab[] = {0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f,0xd7};  //  数组   0-9
  20. unsigned char code   dispbit[4]={0x07,0x0b,0x0d,0x0e};    //位选控制
  21. void Delay10ms(uint n)
  22. {
  23.     uint x;
  24.     while (n--)
  25.     {
  26.         x = 5000;
  27.         while (x--);
  28.     }
  29. }
  30. /************主函数**********************/
  31. void main()
  32. {
  33. uint Vcc,Int,V,Int_S, Vcc_S;
  34. unsigned char m,M;

  35. P3M1=0x00;
  36. P3M0=0xff;                  //设置P3口强推挽输出
  37. AD_Init();                 //AD初始化
  38. Delay1ms();                 //开始采样电压前延时,电路有几个电容充电未完成前会拉低部分元器件电压(导致采样电压不准),目测须延时1S,懒得改程序了

  39. while(1)
  40. {



  41.     Delay20ms();
  42.     Int_S=0;
  43.     Vcc_S=0;
  44.     m=0;

  45.         for(m;m<24;m++)
  46.     {


  47.         Delay350us();         //采样电压时差
  48.         Int_S += ADC(4);
  49.         Vcc_S += ADC(5);   
  50.         Int = Int_S/24;
  51.         Vcc = Vcc_S/24;        //采样24次电压求平均值

  52.     }
  53.     M=20*Int/Vcc;
  54.     if(M>16) V=19150*Int/Vcc;
  55.     else if(M>11) V=19100*Int/Vcc;         //大于11V电压转换公式
  56.     else if(M>10) V=19150*Int/Vcc;         //10V-11V
  57.     else if(M>5) V=19200*Int/Vcc;         //5V-10V
  58.     else if(M>3) V=19350*Int/Vcc;         //3V-5V
  59.     else if(M>1) V=19550*Int/Vcc;         //1V-3V
  60.     else if(M>=0) V=20000*Int/Vcc;         //0-1V                 各量程精度调整

  61.     LCD(V);                              //电压显示
  62.      }
  63.      }


  64. /*******数码管显示函数*************/
  65. void LCD(unsigned int LedNumVal)
  66. {  
  67.    unsigned int LedOut[4];           //变量定义


  68.         if(LedNumVal>9999)
  69.     {
  70.      LedOut[0]=Disp_Tab[LedNumVal%100000/10000];            // 千位           
  71.      LedOut[1]=Disp_Tab[LedNumVal%10000/1000]|0x20;                // 百位   
  72.      LedOut[2]=Disp_Tab[LedNumVal%1000/100];                // 十位
  73.      LedOut[3]=Disp_Tab[LedNumVal%100/10];                    // 个位
  74.     }
  75.      if(LedNumVal<10000)   
  76.     {        
  77.      LedOut[0]=Disp_Tab[LedNumVal%10000/1000]|0x20;            // 千位           
  78.      LedOut[1]=Disp_Tab[LedNumVal%1000/100];                   // 百位   
  79.      LedOut[2]=Disp_Tab[LedNumVal%100/10];                    // 十位
  80.      LedOut[3]=Disp_Tab[LedNumVal%10];                        // 个位                     if语句 实现 小数点自动切换

  81.     }


  82.     P3=LedOut[3];
  83.     P11=0;
  84.     delay(700);
  85.     P11=1;


  86.     P3=LedOut[2];
  87.     P12=0;
  88.     delay(700);
  89.     P12=1;

  90.     P3=LedOut[1];
  91.     P10=0;
  92.     delay(700);
  93.     P10=1;

  94.     P3=LedOut[0];
  95.     P13=0;
  96.     delay(700);
  97.     P13=1;

  98.     delay(700);           //  数码管消隐                     

  99.   }   

  100. /***********AD初始化***************/
  101. void AD_Init()
  102. {
  103. P1M1=0x30;
  104. P1M0=0x00;                 //设置P1.4\P1.5高阻
  105. ADC_RES=0x00;
  106. P1ASF=0x30;
  107. ADC_CONTR=ADC_POWER|ADC_speed_LL;
  108. Delay10ms(2);   

  109. }
  110. /*********电压采样*********/
  111. uint ADC(uint m)
  112. {        uint ADC_10BIT_RES;
  113.         if(m==4)
  114.     {
  115.         ADC_CONTR &=0xf8;    //清空通道
  116.         ADC_CONTR |=0x04;     //更换通道
  117.         Delay10ms(2);         //更换通道延时
  118.     }   
  119.     if(m==5)
  120.     {
  121.         ADC_CONTR &=0xf8;
  122.         ADC_CONTR |=0x05;
  123.         Delay10ms(2);
  124.     }   
  125.     ADC_CONTR |=ADC_START;    //开启AD转换
  126.     _nop_();
  127.     _nop_();
  128.     _nop_();
  129.     _nop_();
  130.     while(!(ADC_CONTR & ADC_FLAG));  
  131.     ADC_CONTR &= ~ADC_FLAG;
  132.         ADC_10BIT_RES=ADC_RES;      //得到高8位
  133.     ADC_10BIT_RES<<=2;
  134.     ADC_10BIT_RES+=ADC_RESL;     //得到低2位
  135.     return ADC_10BIT_RES;               //返回转换结果

  136. }
  137. /*******************延时函数**********/
  138. void delay(unsigned int x)
  139. {
  140.     char j;
  141.     for(x; x> 0; x--)
  142.         for(j = 400; j > 0; j--);
  143. }
  144. void Delay1ms()        //@12.000MHz[/url]
  145. {
  146.     unsigned char i, j;
  147.     i = 2;
  148.     j = 239;
  149.     do
  150.     {
  151.         while (--j);
  152.     } while (--i);
  153. }
  154. void Delay150us()       //@12.000MHz[/url]
  155. {
  156.     unsigned char i, j;
  157.     i = 2;
  158.     j = 189;
  159.     do
  160.     {
  161.         while (--j);
  162.     } while (--i);
  163. }
  164. void Delay350us()        //@12.000MHz[/url]
  165. {
  166.     unsigned char i;
  167.     _nop_();
  168.     i = 172;
  169.     while (--i);
  170. }
  171. void Delay20ms()        //@12.000MHz[/url]
  172. {
  173.     unsigned char i, j;
  174.     i = 39;
  175.     j = 230;
  176.     do
  177.     {
  178.         while (--j);
  179.     } while (--i);
  180. }
复制代码
回复

使用道具 举报

ID:123732 发表于 2016-10-19 13:24 | 显示全部楼层
上面的程序是我根据STC15W408AS改的,你试一下。
回复

使用道具 举报

ID:126608 发表于 2016-10-20 12:02 | 显示全部楼层
我试了,和原程序一样,还是测量值是反的,5V是0.几伏,越低越增加,显示多了个一闪一闪的。 原理图.png
回复

使用道具 举报

ID:123732 发表于 2016-10-20 15:52 | 显示全部楼层
1123212143255 发表于 2016-10-20 12:02
我试了,和原程序一样,还是测量值是反的,5V是0.几伏,越低越增加,显示多了个一闪一闪的。

1.png 参考我的这个程序做个不要外部基准电压芯片的,那个帖子很快就会审核通过了。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:123732 发表于 2016-10-20 16:08 | 显示全部楼层
你把Q3和C4去掉用10k电阻替代那个位置试验一下显示的多少v?我怀疑你TL431接错了
回复

使用道具 举报

ID:123732 发表于 2016-10-20 16:10 | 显示全部楼层
23.png
回复

使用道具 举报

ID:126608 发表于 2016-10-21 12:35 | 显示全部楼层
问题解决了,是刘海龙指导完成的,下载他的51黑论坛_ADC极简电压表,就能量电压了,多谢了。 照片2016-10-06 18 14 56 718.jpg
回复

使用道具 举报

ID:123732 发表于 2016-10-21 14:58 | 显示全部楼层
1123212143255 发表于 2016-10-21 12:35
问题解决了,是刘海龙指导完成的,下载他的51黑论坛_ADC极简电压表,就能量电压了,多谢了。

不用谢,把悬赏给我就行了,哈哈
回复

使用道具 举报

ID:57657 发表于 2016-10-21 15:53 | 显示全部楼层
本帖最后由 npn 于 2016-10-21 15:57 编辑

我建议还是用原来型号单片机的做吧,毕竟有些特殊功能寄存器对于一些老型号芯片里面是没有包含在里面的,主频也慢好几倍,所以改起来难度非常大,有的就不能实现这个功能。
回复

使用道具 举报

ID:123732 发表于 2016-10-21 23:38 | 显示全部楼层
npn 发表于 2016-10-21 15:53
我建议还是用原来型号单片机的做吧,毕竟有些特殊功能寄存器对于一些老型号芯片里面是没有包含在里面的,主 ...

STC15W408AS比STC15F204EA更高级,STC15F204EA有的STC15W408AS都有,STC15W408AS比STC15F204EA多了一个串口,程序空间也比他大。
回复

使用道具 举报

ID:126608 发表于 2016-10-22 05:22 | 显示全部楼层
请管理员帮忙,把悬赏100黑币给刘海龙。
回复

使用道具 举报

ID:126608 发表于 2016-10-28 10:04 | 显示全部楼层
希望能再发一个四位STC15W408AS电压表
回复

使用道具 举报

ID:145017 发表于 2016-10-29 10:29 | 显示全部楼层
希望再发一个电压表
回复

使用道具 举报

ID:123732 发表于 2016-10-29 15:31 | 显示全部楼层
fdt 发表于 2016-10-29 10:29
希望再发一个电压表

想再发一个什么样的电压表呢?
回复

使用道具 举报

ID:123732 发表于 2016-10-29 15:53 | 显示全部楼层
1123212143255 发表于 2016-10-28 10:04
希望能再发一个四位STC15W408AS电压表

硬件:把数码管换成4位阴的,多的那只脚连接单片机P1.7
软件:显示函数加上
  1. diplay_data (4,disdata[v%10]);
复制代码
这句
  1. void displayHH4 (unsigned char q){ //第4位数码管显示程序
  2.         unsigned char i;
  3.         i = q & 0x01;
  4.         if(i == 0x01){
  5.                 H4 = 0;a = 1;}delay(PWM);dis_off();
  6.         i = q & 0x02;
  7.         if(i == 0x02){
  8.                 H4 = 0;b = 1;}delay(PWM);dis_off();
  9.         i = q & 0x04;
  10.         if(i == 0x04){
  11.                 H4 = 0;c = 1;}delay(PWM);dis_off();
  12.         i = q & 0x08;
  13.         if(i == 0x08){
  14.                 H4 = 0;d = 1;}delay(PWM);dis_off();
  15.         i = q & 0x10;
  16.         if(i == 0x10){
  17.                 H4 = 0;e = 1;}delay(PWM);dis_off();
  18.         i = q & 0x20;
  19.         if(i == 0x20){
  20.                 H4 = 0;f = 1;}delay(PWM);dis_off();
  21.         i = q & 0x40;
  22.         if(i == 0x40){
  23.                 H4 = 0;g = 1;}delay(PWM);dis_off();
  24.         i = q & 0x80;
  25.         if(i == 0x80){
  26.                 H4 = 0;dp = 1;}delay(PWM);dis_off();
  27. }
复制代码
回复

使用道具 举报

ID:126608 发表于 2016-10-30 04:56 | 显示全部楼层
做出来了,非常好用,再一次表示感谢。
回复

使用道具 举报

ID:99130 发表于 2017-4-29 19:04 | 显示全部楼层

这程序的测量范围是多大?99.9v?
回复

使用道具 举报

ID:123732 发表于 2017-4-30 23:04 | 显示全部楼层
越快乐越堕落 发表于 2017-4-29 19:04
这程序的测量范围是多大?99.9v?

范围是9.99v
回复

使用道具 举报

ID:99130 发表于 2017-5-2 18:50 | 显示全部楼层

如何扩大量程?在程序里
回复

使用道具 举报

ID:303099 发表于 2018-4-18 19:20 | 显示全部楼层

画的非常不错,哈哈
回复

使用道具 举报

ID:269672 发表于 2018-6-13 10:33 | 显示全部楼层
希望在发一个用2片74hc595驱动4位数码管的电压表
回复

使用道具 举报

ID:390002 发表于 2018-8-26 18:06 | 显示全部楼层
路过看看,为毛还要黑By
回复

使用道具 举报

ID:92556 发表于 2019-8-29 00:26 来自手机 | 显示全部楼层
刘海龙 发表于 2016-10-19 13:24
上面的程序是我根据STC15W408AS改的,你试一下。

这大哥很热心啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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