找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 234|回复: 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 单片机教程网

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