久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 17213|回復(fù): 23
收起左側(cè)

是STC15F204EA的程序,請(qǐng)人改成STC15W408AS能用的程序

  [復(fù)制鏈接]
ID:126608 發(fā)表于 2016-10-16 07:43 | 顯示全部樓層 |閱讀模式
100黑幣
這是一個(gè)網(wǎng)上公開的程序,因只有STC15W408AS,就照樣做了一個(gè)板,但顯示不正確,請(qǐng)人改成STC15W408AS能用的程序,愿用80黑幣給解決問題的人。
#include<stc15f204ea.h>
//#include<STC15W408AS,H>
#include<intrins.h>
#define    ADC_POWER       0x80                  //ADC 電源控制位
#define    ADC_FLAG        0x10                  //ADC 完成標(biāo)志
#define    ADC_START       0x08                  //ADC 啟動(dòng)控制位
#define    ADC_speed_LL    0x00                  //540 時(shí)鐘
#define    ADC_speed_L     0x20                  //360 時(shí)鐘
#define    ADC_speed_H     0x40                  //180 時(shí)鐘
#define    ADC_speed_HH    0x60                  // 90 時(shí)鐘
typedef unsigned long  uint;
void delay(unsigned int x);            //函數(shù)聲明
void LCD(unsigned int LedNumVal);       //函數(shù)聲明
void Delay1ms();                       //函數(shù)聲明
void Delay150us();                       //函數(shù)聲明
void AD_Init();                           //函數(shù)聲明
uint ADC(uint m);                       //函數(shù)聲明
void Delay350us();                       //函數(shù)聲明
void Delay20ms();                       //函數(shù)聲明
unsigned char code   Disp_Tab[] = {0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f,0xd7};  //  數(shù)組   0-9
unsigned char code   dispbit[4]={0x07,0x0b,0x0d,0x0e};    //位選控制

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

P3M1=0x00;
P3M0=0xff;                  //設(shè)置P3口強(qiáng)推挽輸出
AD_Init();                 //AD初始化
Delay1ms();                 //開始采樣電壓前延時(shí),電路有幾個(gè)電容充電未完成前會(huì)拉低部分元器件電壓(導(dǎo)致采樣電壓不準(zhǔn)),目測(cè)須延時(shí)1S,懶得改程序了

while(1)
{



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

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


        Delay350us();         //采樣電壓時(shí)差
        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電壓轉(zhuǎn)換公式
    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                 各量程精度調(diào)整

    LCD(V);                              //電壓顯示
     }
     }


/*******數(shù)碼管顯示函數(shù)*************/
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];                    // 個(gè)位
    }
     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];                        // 個(gè)位                     if語(yǔ)句 實(shí)現(xiàn) 小數(shù)點(diǎn)自動(dòng)切換

    }


    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);           //  數(shù)碼管消隱                     

  }   

/***********AD初始化***************/
void AD_Init()
{
P1M1=0x30;
P1M0=0x00;                 //設(shè)置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();         //更換通道延時(shí)
    }   
    if(m==5)
    {
        ADC_CONTR &=0xf8;
        ADC_CONTR |=0x05;
        Delay150us();
    }   
    ADC_CONTR |=ADC_START;    //開啟AD轉(zhuǎn)換
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while(!(ADC_CONTR & 0x10));  
    ADC_CONTR &= ~ADC_FLAG;
    return ADC_RES;               //返回轉(zhuǎn)換結(jié)果

}
/*******************延時(shí)函數(shù)**********/
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);
}

回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 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 完成標(biāo)志
  5. #define    ADC_START       0x08                  //ADC 啟動(dòng)控制位
  6. #define    ADC_speed_LL    0x00                  //540 時(shí)鐘
  7. #define    ADC_speed_L     0x20                  //360 時(shí)鐘
  8. #define    ADC_speed_H     0x40                  //180 時(shí)鐘
  9. #define    ADC_speed_HH    0x60                  // 90 時(shí)鐘
  10. typedef unsigned long  uint;
  11. void delay(unsigned int x);            //函數(shù)聲明
  12. void LCD(unsigned int LedNumVal);       //函數(shù)聲明
  13. void Delay1ms();                       //函數(shù)聲明
  14. void Delay150us();                       //函數(shù)聲明
  15. void AD_Init();                           //函數(shù)聲明
  16. uint ADC(uint m);                       //函數(shù)聲明
  17. void Delay350us();                       //函數(shù)聲明
  18. void Delay20ms();                       //函數(shù)聲明
  19. unsigned char code   Disp_Tab[] = {0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f,0xd7};  //  數(shù)組   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. /************主函數(shù)**********************/
  31. void main()
  32. {
  33. uint Vcc,Int,V,Int_S, Vcc_S;
  34. unsigned char m,M;

  35. P3M1=0x00;
  36. P3M0=0xff;                  //設(shè)置P3口強(qiáng)推挽輸出
  37. AD_Init();                 //AD初始化
  38. Delay1ms();                 //開始采樣電壓前延時(shí),電路有幾個(gè)電容充電未完成前會(huì)拉低部分元器件電壓(導(dǎo)致采樣電壓不準(zhǔn)),目測(cè)須延時(shí)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();         //采樣電壓時(shí)差
  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電壓轉(zhuǎn)換公式
  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                 各量程精度調(diào)整

  61.     LCD(V);                              //電壓顯示
  62.      }
  63.      }


  64. /*******數(shù)碼管顯示函數(shù)*************/
  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];                    // 個(gè)位
  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];                        // 個(gè)位                     if語(yǔ)句 實(shí)現(xiàn) 小數(shù)點(diǎn)自動(dòng)切換

  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);           //  數(shù)碼管消隱                     

  99.   }   

  100. /***********AD初始化***************/
  101. void AD_Init()
  102. {
  103. P1M1=0x30;
  104. P1M0=0x00;                 //設(shè)置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);         //更換通道延時(shí)
  118.     }   
  119.     if(m==5)
  120.     {
  121.         ADC_CONTR &=0xf8;
  122.         ADC_CONTR |=0x05;
  123.         Delay10ms(2);
  124.     }   
  125.     ADC_CONTR |=ADC_START;    //開啟AD轉(zhuǎn)換
  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;               //返回轉(zhuǎn)換結(jié)果

  136. }
  137. /*******************延時(shí)函數(shù)**********/
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-19 13:24 | 顯示全部樓層
上面的程序是我根據(jù)STC15W408AS改的,你試一下。
回復(fù)

使用道具 舉報(bào)

ID:126608 發(fā)表于 2016-10-20 12:02 | 顯示全部樓層
我試了,和原程序一樣,還是測(cè)量值是反的,5V是0.幾伏,越低越增加,顯示多了個(gè)一閃一閃的。 原理圖.png
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-20 15:52 | 顯示全部樓層
1123212143255 發(fā)表于 2016-10-20 12:02
我試了,和原程序一樣,還是測(cè)量值是反的,5V是0.幾伏,越低越增加,顯示多了個(gè)一閃一閃的。

1.png 參考我的這個(gè)程序做個(gè)不要外部基準(zhǔn)電壓芯片的,那個(gè)帖子很快就會(huì)審核通過了。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-20 16:08 | 顯示全部樓層
你把Q3和C4去掉用10k電阻替代那個(gè)位置試驗(yàn)一下顯示的多少v?我懷疑你TL431接錯(cuò)了
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-20 16:10 | 顯示全部樓層
23.png
回復(fù)

使用道具 舉報(bào)

ID:126608 發(fā)表于 2016-10-21 12:35 | 顯示全部樓層
問題解決了,是劉海龍指導(dǎo)完成的,下載他的51黑論壇_ADC極簡(jiǎn)電壓表,就能量電壓了,多謝了。 照片2016-10-06 18 14 56 718.jpg
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-21 14:58 | 顯示全部樓層
1123212143255 發(fā)表于 2016-10-21 12:35
問題解決了,是劉海龍指導(dǎo)完成的,下載他的51黑論壇_ADC極簡(jiǎn)電壓表,就能量電壓了,多謝了。

不用謝,把懸賞給我就行了,哈哈
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2016-10-21 15:53 | 顯示全部樓層
本帖最后由 npn 于 2016-10-21 15:57 編輯

我建議還是用原來(lái)型號(hào)單片機(jī)的做吧,畢竟有些特殊功能寄存器對(duì)于一些老型號(hào)芯片里面是沒有包含在里面的,主頻也慢好幾倍,所以改起來(lái)難度非常大,有的就不能實(shí)現(xiàn)這個(gè)功能。
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-21 23:38 | 顯示全部樓層
npn 發(fā)表于 2016-10-21 15:53
我建議還是用原來(lái)型號(hào)單片機(jī)的做吧,畢竟有些特殊功能寄存器對(duì)于一些老型號(hào)芯片里面是沒有包含在里面的,主 ...

STC15W408AS比STC15F204EA更高級(jí),STC15F204EA有的STC15W408AS都有,STC15W408AS比STC15F204EA多了一個(gè)串口,程序空間也比他大。
回復(fù)

使用道具 舉報(bào)

ID:126608 發(fā)表于 2016-10-22 05:22 | 顯示全部樓層
請(qǐng)管理員幫忙,把懸賞100黑幣給劉海龍。
回復(fù)

使用道具 舉報(bào)

ID:126608 發(fā)表于 2016-10-28 10:04 | 顯示全部樓層
希望能再發(fā)一個(gè)四位STC15W408AS電壓表
回復(fù)

使用道具 舉報(bào)

ID:145017 發(fā)表于 2016-10-29 10:29 | 顯示全部樓層
希望再發(fā)一個(gè)電壓表
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-29 15:31 | 顯示全部樓層
fdt 發(fā)表于 2016-10-29 10:29
希望再發(fā)一個(gè)電壓表

想再發(fā)一個(gè)什么樣的電壓表呢?
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2016-10-29 15:53 | 顯示全部樓層
1123212143255 發(fā)表于 2016-10-28 10:04
希望能再發(fā)一個(gè)四位STC15W408AS電壓表

硬件:把數(shù)碼管換成4位陰的,多的那只腳連接單片機(jī)P1.7
軟件:顯示函數(shù)加上
  1. diplay_data (4,disdata[v%10]);
復(fù)制代碼
這句
  1. void displayHH4 (unsigned char q){ //第4位數(shù)碼管顯示程序
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:126608 發(fā)表于 2016-10-30 04:56 | 顯示全部樓層
做出來(lái)了,非常好用,再一次表示感謝。
回復(fù)

使用道具 舉報(bào)

ID:99130 發(fā)表于 2017-4-29 19:04 | 顯示全部樓層

這程序的測(cè)量范圍是多大?99.9v?
回復(fù)

使用道具 舉報(bào)

ID:123732 發(fā)表于 2017-4-30 23:04 | 顯示全部樓層
越快樂越墮落 發(fā)表于 2017-4-29 19:04
這程序的測(cè)量范圍是多大?99.9v?

范圍是9.99v
回復(fù)

使用道具 舉報(bào)

ID:99130 發(fā)表于 2017-5-2 18:50 | 顯示全部樓層

如何擴(kuò)大量程?在程序里
回復(fù)

使用道具 舉報(bào)

ID:303099 發(fā)表于 2018-4-18 19:20 | 顯示全部樓層

畫的非常不錯(cuò),哈哈
回復(fù)

使用道具 舉報(bào)

ID:269672 發(fā)表于 2018-6-13 10:33 | 顯示全部樓層
希望在發(fā)一個(gè)用2片74hc595驅(qū)動(dòng)4位數(shù)碼管的電壓表
回復(fù)

使用道具 舉報(bào)

ID:390002 發(fā)表于 2018-8-26 18:06 | 顯示全部樓層
路過看看,為毛還要黑By
回復(fù)

使用道具 舉報(bào)

ID:92556 發(fā)表于 2019-8-29 00:26 來(lái)自手機(jī) | 顯示全部樓層
劉海龍 發(fā)表于 2016-10-19 13:24
上面的程序是我根據(jù)STC15W408AS改的,你試一下。

這大哥很熱心啊!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人日韩 | 欧美国产日韩精品 | 在线看黄免费 | 97成人免费 | 亚洲精品欧美一区二区三区 | 91精品国产一区二区三区香蕉 | 尤物视频在线免费观看 | 国产高清视频 | 亚洲区一| 国产福利在线 | 日韩av第一页 | 亚洲综合在线一区二区 | 男女精品久久 | 欧美日韩国产精品一区二区 | 日韩午夜 | xx性欧美肥妇精品久久久久久 | 日韩在线视频一区二区三区 | 久草在线 | 成年人免费看 | 在线观看亚洲精品 | 人人玩人人干 | 国产婷婷精品 | japanhdxxxx裸体| 日韩精品一区二区三区视频播放 | 91精品国产综合久久久久久蜜臀 | 欧美久久精品一级黑人c片 91免费在线视频 | 日韩手机在线看片 | 成人av网站在线观看 | 伊人久久综合 | 一区二区在线观看免费视频 | 男女污污网站 | 天堂国产 | 国内自拍偷拍 | 国产精品久久久久一区二区三区 | 久久久久久国产免费视网址 | 精品国产久 | 成人免费福利 | 欧美一区二区三区 | 久久久久国产一区二区三区 | 精品国产鲁一鲁一区二区张丽 | 99久久中文字幕三级久久日本 |