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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17151|回復: 23
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
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);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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.幾伏,越低越增加,顯示多了個一閃一閃的。
回復

使用道具 舉報

5#
ID:123732 發表于 2016-10-20 15:52 | 只看該作者
1123212143255 發表于 2016-10-20 12:02
我試了,和原程序一樣,還是測量值是反的,5V是0.幾伏,越低越增加,顯示多了個一閃一閃的。

參考我的這個程序做個不要外部基準電壓芯片的,那個帖子很快就會審核通過了。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:123732 發表于 2016-10-20 16:08 | 只看該作者
你把Q3和C4去掉用10k電阻替代那個位置試驗一下顯示的多少v?我懷疑你TL431接錯了
回復

使用道具 舉報

7#
ID:123732 發表于 2016-10-20 16:10 | 只看該作者

回復

使用道具 舉報

8#
ID:126608 發表于 2016-10-21 12:35 | 只看該作者
問題解決了,是劉海龍指導完成的,下載他的51黑論壇_ADC極簡電壓表,就能量電壓了,多謝了。
回復

使用道具 舉報

9#
ID:123732 發表于 2016-10-21 14:58 | 只看該作者
1123212143255 發表于 2016-10-21 12:35
問題解決了,是劉海龍指導完成的,下載他的51黑論壇_ADC極簡電壓表,就能量電壓了,多謝了。

不用謝,把懸賞給我就行了,哈哈
回復

使用道具 舉報

10#
ID:57657 發表于 2016-10-21 15:53 | 只看該作者
本帖最后由 npn 于 2016-10-21 15:57 編輯

我建議還是用原來型號單片機的做吧,畢竟有些特殊功能寄存器對于一些老型號芯片里面是沒有包含在里面的,主頻也慢好幾倍,所以改起來難度非常大,有的就不能實現這個功能。
回復

使用道具 舉報

11#
ID:123732 發表于 2016-10-21 23:38 | 只看該作者
npn 發表于 2016-10-21 15:53
我建議還是用原來型號單片機的做吧,畢竟有些特殊功能寄存器對于一些老型號芯片里面是沒有包含在里面的,主 ...

STC15W408AS比STC15F204EA更高級,STC15F204EA有的STC15W408AS都有,STC15W408AS比STC15F204EA多了一個串口,程序空間也比他大。
回復

使用道具 舉報

12#
ID:126608 發表于 2016-10-22 05:22 | 只看該作者
請管理員幫忙,把懸賞100黑幣給劉海龍。
回復

使用道具 舉報

13#
ID:126608 發表于 2016-10-28 10:04 | 只看該作者
希望能再發一個四位STC15W408AS電壓表
回復

使用道具 舉報

14#
ID:145017 發表于 2016-10-29 10:29 | 只看該作者
希望再發一個電壓表
回復

使用道具 舉報

15#
ID:123732 發表于 2016-10-29 15:31 | 只看該作者
fdt 發表于 2016-10-29 10:29
希望再發一個電壓表

想再發一個什么樣的電壓表呢?
回復

使用道具 舉報

16#
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. }
復制代碼
回復

使用道具 舉報

17#
ID:126608 發表于 2016-10-30 04:56 | 只看該作者
做出來了,非常好用,再一次表示感謝。
回復

使用道具 舉報

18#
ID:99130 發表于 2017-4-29 19:04 | 只看該作者

這程序的測量范圍是多大?99.9v?
回復

使用道具 舉報

19#
ID:123732 發表于 2017-4-30 23:04 | 只看該作者
越快樂越墮落 發表于 2017-4-29 19:04
這程序的測量范圍是多大?99.9v?

范圍是9.99v
回復

使用道具 舉報

20#
ID:99130 發表于 2017-5-2 18:50 | 只看該作者

如何擴大量程?在程序里
回復

使用道具 舉報

21#
ID:303099 發表于 2018-4-18 19:20 | 只看該作者

畫的非常不錯,哈哈
回復

使用道具 舉報

22#
ID:269672 發表于 2018-6-13 10:33 | 只看該作者
希望在發一個用2片74hc595驅動4位數碼管的電壓表
回復

使用道具 舉報

23#
ID:390002 發表于 2018-8-26 18:06 | 只看該作者
路過看看,為毛還要黑By
回復

使用道具 舉報

24#
ID:92556 發表于 2019-8-29 00:26 來自手機 | 只看該作者
劉海龍 發表于 2016-10-19 13:24
上面的程序是我根據STC15W408AS改的,你試一下。

這大哥很熱心。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩免费福利视频 | 激情国产视频 | 中文字幕视频一区 | 成人自拍视频 | 亚洲精品一区二区三区蜜桃久 | 一区二区三区四区在线 | 精品一区二区三区四区在线 | 久草色播 | 亚洲高清在线 | 欧美一区二区三区在线免费观看 | 一区二区三区视频在线 | 狠狠操av| 伊人春色在线观看 | 精品中文字幕视频 | 婷婷综合网 | 宅男噜噜噜66一区二区 | 九色 在线 | 99色在线视频 | 自拍偷拍视频网 | 国产免费观看一区 | 欧美一区二区在线视频 | 国产一区二区不卡 | 亚洲欧美综合 | 欧美不卡网站 | 日韩精品视频一区二区三区 | 精品一区二区三区四区五区 | 九九热精品视频 | 国产精品99久久久久久宅男 | 久草在线在线精品观看 | 久久久免费电影 | 麻豆毛片| 啪啪毛片 | 狠狠干影院 | 国产视频一视频二 | 不卡在线视频 | 欧洲一级毛片 | 精品视频免费 | 久久久99精品免费观看 | 成人三级av | 国产精品久久国产精品99 gif | 中文字幕四虎 |