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根线,面包板上实施。 //#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 转换
}
}*/
}
} 下步测试用48MHZ晶振,1.5Mbps串口传输速度,提高采样速度至100k/s 没看到上位机程序呀。
页:
[1]