baiht 发表于 2011-1-1 22:06:23

STC51和USB模拟串口配合制作示波仪

我用STC12C5410AD的CPU,用CH341模拟串口,PC机上VB6.0制作主界面,制作了一个示波仪。
串口传输速度:(CH341),经测试2Mbps不行,测试1Mbps通过。
CPU速度:32M;AD速度最快即210时钟,约7μS。
CPU定时器中断按640时钟,即20μS,即采样周期50K/S,数据量为50KB/S。

电路异常简单,只需连电源,串口线和p3.0,p3.1和p1.0,共计5根线,面包板上实施。

baiht 发表于 2011-1-1 22:18:25

//#include   "reg52.h"
#include   "intrins.h"
#include   "stc12c54.h"
#include <string.h>
unsigned char xdata inputdata;
unsigned char ad_loc,serial_loc,time0_count_L,time0_count_H;
//unsigned char work_state;//0 用于AD测量阶段,1用于数据传送,2用于数据接收,3用于等待阶段
unsigned int time_wait,time_wait_max;
unsigned char scon_input_buffer,scon_loc=0;
bit scon_send_ready;

/*unsigned char flag,a;
void Send_Char(unsigned char send_char)
{
ES   = 0;
TI=0;
SBUF = send_char;   //
while (!TI);
TI=0;
ES   = 1;
}

voidwait(unsigned char i)
{
unsigned char j;
while(i>0)
{
        j=0x80;
        while(j>0)
          j--;       
    i--;
}
}*/


void main()
{

// AUXR=0;
SCON =0x50;         //选择串口工作方式2,打开接收允许
PCON=0x80;                          //SMOD=1高速串口

TMOD =0x21;         //定时器1工作在方式2,定时器0工作在方式1
//TH1 =0xFD;   //当SMOD=0时,其初值计算如下:初值=256-(F/B/32/X)(其中X为分频数1)
//TL1 =0XFD;            //实现波特率115200(系统时钟22.1184MHZ)460800
TH1 =0xFE;   //当SMOD=0时,其初值计算如下:初值=256-(F/B/32/X)(其中X为分频数1)
TL1 =0XFE;            //实现波特率1M(系统时钟32MHZ)


//AUXR=64;            //定时器0工作于12分频状态,定时器1工作于1分频状态
AUXR=64+128;          //定时器0,1均位于1分频状态
ES=1;               //允许串行口中断
time0_count_L=(65536-640)%256; //设计定时器0工作于20us一次中断
time0_count_H=(65536-640)/256;
TH0=time0_count_H;
TL0=time0_count_L;
ad_loc=0;
serial_loc=0;
PS=1;               //设计串行口中断优先级
//work_state=1;
//time_wait_max=5;

P1M0=0xff;   //设置P1口的状态为开漏
P1M1=0xff;
ADC_CONTR=ADC_POWER+ADC_SPEEDHH;
//wait(100);
TR1 =1;               //启动定时器T1
ET1 =0;
TR0=1;      //启动定时器0
ET0=1;      //定时器0请允许中断
ADC_CONTR=ADC_CONTR & 0xEF;
ADC_CONTR=ADC_CONTR | ADC_START ;//启动AD 转换
EA =1;                //单片机中断允许
scon_send_ready=1;    //串口发送已准备好标准

//work_state=1; //测试
while(1)
{
        //if (work_state==1)
        {
                /*serial_loc=0;
                while (serial_loc<250)
                {
                        Send_Char(inputdata);
                        serial_loc++;
                }

                ad_loc=0;
                work_state=3;//进入等待阶段*/
        }
}
}

void time0_interrupt(void)interrupt 1 using 0
{
TR0=0;
TH0=time0_count_H;
TL0=time0_count_L;
TR0=1;
if ((ADC_CONTR & ADC_FLAG)!=0) //已完成测量
{               
        if (ad_loc<250)
        {
                inputdata=ADC_DATA;
                ADC_CONTR=ADC_CONTR & 0xE7 ;//停止 AD 转换
                ad_loc++;
                ADC_DATA=0;
                ADC_CONTR=ADC_CONTR | ADC_START ;//启动 AD 转换               
        }
}

if ((scon_send_ready==1) & (serial_loc<ad_loc)) //
{
        SBUF=inputdata;
        scon_send_ready=0;
        serial_loc++;
        if (serial_loc>=250)
        {
                serial_loc=0;
                ad_loc=0;
                ADC_DATA=0;
                ADC_CONTR=ADC_CONTR | ADC_START ;//启动 AD 转换
        }               
}

}



void UART_Interrupt(void)interrupt 4using 3
{
unsigned char k;
//unsigned int t;
if(RI==1)
{
RI = 0;
k= SBUF;
if ((k>'0') && (k<='9'))
{
        k=k-'0';
    time0_count_L=(65536-20*k)%256; //设计定时器0工作于1ms一次中断
    time0_count_H=(65536-20*k)/256;
}



}
if (TI==1)
{
TI = 0;
scon_send_ready=1;
/*if (serial_loc<ad_loc)
{
        SBUF=inputdata;
        scon_send_ready=0;
        serial_loc++;
        if (serial_loc>=250)
        {
                serial_loc=0;
                ad_loc=0;
                ADC_DATA=0;
                ADC_CONTR=ADC_CONTR | ADC_START ;//启动 AD 转换
        }       
}*/
}
}

baiht 发表于 2011-1-1 22:22:07

下步测试用48MHZ晶振,1.5Mbps串口传输速度,提高采样速度至100k/s

phone 发表于 2011-1-10 15:28:06

没看到上位机程序呀。
页: [1]
查看完整版本: STC51和USB模拟串口配合制作示波仪