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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這個電路有會設計的兄弟嗎

[復制鏈接]
跳轉到指定樓層
樓主
ID:190577 發表于 2024-9-15 09:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
對50Hz的正弦電壓的正半波進行AD轉換,要求半個周期內轉換100個點的值,并求出100個點的平均值和有效值,并通過LCD顯示和通過串口傳到PC機的串口助手上。(先判斷正半波的零點)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:592807 發表于 2024-9-15 17:05 | 只看該作者
不懂你什么意思?這不就是個ADC采集嗎?先用一個二極管濾掉負半周只保留正半周,然后ADC采集后將二極管壓降加回去。就是個普通的ADC采集啊。
回復

使用道具 舉報

板凳
ID:849913 發表于 2024-9-15 19:31 | 只看該作者
正好去年寫過類似的程序 是取樣40個點 你可以自己改一下延時和循環次數 參考一下吧
#include "stc15.h"
#include "intrins.h"

#define FOSC    11059200L
#define BAUD    115200

typedef unsigned char u8;
typedef unsigned int u16;

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個時鐘
#define ADC_SPEEDL  0x20            //360個時鐘
#define ADC_SPEEDH  0x40            //180個時鐘
#define ADC_SPEEDHH 0x60            //90個時鐘
#define S1_S0 0x40              
#define S1_S1 0x80   

void InitUart();
void InitADC();
void Init_timer();
void qie_huan();
void SendData(u8 dat);
u16 GetADCResult(u8 ch);
void Delay(u16 n);
void ShowResult(u16 ch);
u16 dat1;
u8 mod,dac_end,sync;
u16 se[8]={0,0,0,0,0,0,0,0},sm[8]={0,0,0,0,0,0,0,0};
bit busy;
sbit led=P3^2;
sbit led1=P3^3;

/*----------------------------
讀取ADC結果
----------------------------*/
u16 GetADCResult(u8 ch)
{
          u16 dat;
    ADC_CONTR = ADC_POWER | ADC_SPEEDH | ch ;       
    ADC_CONTR|= ADC_START;
        _nop_();                        //等待4個NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
    dat= (ADC_RES<<8)&0xff00|ADC_RESL;                //返回ADC結果
        return dat;
}


void qie_huan()           //串口引腳選擇函數
{

   ACC = P_SW1;
   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
   P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)

//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//  P_SW1 = ACC;  
}

/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
    SCON = 0x5a;                //設置串口為8位可變波特率
    T2L = (65536 - (FOSC/4/BAUD));
    T2H = (65536 - (FOSC/4/BAUD)) >> 8;
   AUXR |= 0x10;                //T2為1T模式, 并啟動定時器2
   AUXR |= 0x04;
   AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
   ES=1;
   EA=1;
}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1ASF = 0xff;                   //設置P1口為AD口
    ADC_RES = 0;
        ADC_RESL=0;
        CLK_DIV |= 0x20;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                       //ADC上電并延時
}


void Init_timer()
{
          AUXR |= 0x80;                   //定時器0為1T模式
//  AUXR &= 0x7f;                   //定時器0為12T模式

    TMOD &= 0xF0;                    //設置定時器為模式0(16位自動重裝載)
    TL0 = 0xF0;                //設置定時初始值
        TH0 = 0x31;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷
    EA = 1;
}
/*----------------------------
發送串口數據
----------------------------*/
void SendData(u8 dat)
{
    while (busy);                    //等待前一個數據發送完成
    busy = 1;                         //清除發送標志
    SBUF = dat;                     //發送當前數據
}


/*----------------------------
發送ADC結果到PC
----------------------------*/
void ShowResult(u16 ch)
{
    u8 h,l;

  h=ch>>8;
  l=ch;
        SendData(l);     //顯示高2位結果
        SendData(h);     //顯示高2位結果
}


/*----------------------------
軟件延時
----------------------------*/
void Delay(u16 n)
{
    u16 x;
    while (n--)
    {
        x = 5000;
        while (x--);
    }
}

void Delay500us()                //@11.0592MHz
{
        unsigned char i, j;
        _nop_();
        _nop_();
        i = 6;
        j = 93;
        do
        {
                while (--j);
        } while (--i);
}



void main()
{
    u8 i,j;

        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
   
        qie_huan();
        Init_timer();
    InitUart();                     //初始化串口
    InitADC();                      //初始化ADC

while(1)
{
                   TR0 = 1;
                ET0 = 1;
        for(i=0;i<40;i++)
        {
                Delay500us();
                for(j=0;j<8;j++)
                 {
                 se[j]=GetADCResult(j);
                 if(se[j]>sm[j])
                   {
                          sm[j]=se[j];
                   }
                 }
        }
         
                  
                 for(i=0;i<8;i++)
                 {
                           ShowResult(sm[i]);
                        sm[i]=0;
                 }
               
                 while (!mod||(sync!=49));
                  TR0 = 0;
                     ET0 = 0;
                    mod=0;
                      sync=48;
//          while (mod&&(sync==49))
//    {
//              TR0 = 0;
//                    ET0 = 0;
//                 for(i=0;i<8;i++)
//                 {
//                           ShowResult(sm[i]);
//                        sm[i]=0;
//                 }
//                mod=0;
//                TR0 = 1;
//                ET0 = 1;
//                sync=48;
//    }
}
        while(1);
}


/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
           dat1++;
         led1=!led1;
         if(dat1>20)
         {
                   mod=1;
                dat1=0;
                led=!led;
         }
}

/*UART 中斷服務程序
-----------------------------*/

void Uart() interrupt 4
{
  if(RI)
  {
     RI = 0; //清除RI位
            sync=SBUF;
  }
  if(TI)
  {
        TI = 0;                 //清除TI位
        busy = 0;
  }               
        
}



回復

使用道具 舉報

地板
ID:466250 發表于 2024-9-15 19:53 | 只看該作者
不難,對單片機的處理速度有要求
回復

使用道具 舉報

5#
ID:326998 發表于 2024-9-15 21:08 | 只看該作者
一個周期20ms,10ms 100個點,即100us一次采樣,一般都可以達到,要看轉換精度了
回復

使用道具 舉報

6#
ID:190577 發表于 2024-9-16 09:56 | 只看該作者
老董 發表于 2024-9-15 19:31
正好去年寫過類似的程序 是取樣40個點 你可以自己改一下延時和循環次數 參考一下吧
#include "stc15.h"
# ...

好的,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色资源站| 97超碰在线播放 | 黄色大片在线免费观看 | 在线观看国产视频 | 久久午夜精品福利一区二区 | 久久午夜精品 | 午夜精品一区 | 一级毛片视频在线 | 国产精品久久久久久亚洲调教 | 国产影音先锋 | 性xxxxx| 中文成人在线 | 中文字幕91av | 免费成人在线网站 | 一区二区三区免费 | 四虎在线视频 | 国产精品国产精品国产专区不卡 | 欧美精品久久 | 成年男女免费视频网站 | 国产激情自拍视频 | 亚洲国产精品一区二区久久 | 国产99热在线 | 久久久久国产精品午夜一区 | 色99视频| 亚洲精品电影在线观看 | 国产一区二区高清在线 | 欧美精品一区二区在线观看 | 九九九久久国产免费 | 亚洲一区二区在线播放 | 国产精品永久免费视频 | 国产精品99精品久久免费 | 欧美在线亚洲 | 每日更新av| 国内精品久久久久久久 | 有码一区 | 91国内精精品久久久久久婷婷 | 国产综合久久 | 精品91视频 | 亚洲成人国产 | 91精品久久久久久久久中文字幕 | 欧美一级特黄aaa大片在线观看 |