|
这个是我大二做的,今天看到了就发出来。采集模拟信号转换成数字信号,多路采集。仿真中的采集信号用不同电压的电源代替。上位机发送数字0—7,决定采集哪几路的信号,发送8开启采集,发送其他任意值,关闭采集。串口仿真软件打包50多M上传不了,链接: https://pan.baidu.com/s/1govHCJrInQgtji9Sl9CH-A 提取码: jzy2。用法等后面再介绍,最近比较忙。有需要上位机,AD采集的可以先看自己摸索,软件很简单很硬件用法一样
仿真图
串口仿真运行图
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define sint signed int //16bit -32768~32767
#define delay1us _nop_();_nop_();_nop_(); // delay 1 us(for fos=12M)
sbit minh=P2^3;
sbit ad_din=P3^6;
sbit ad_dout=P3^5;
sbit ad_clk=P3^4;
sbit ad_cs=P3^7;
uchar flag_td,flag_time,flag,a,t0_num,n,h;
unsigned int ad_val;
float ad_vo;
uchar code xt[]={
0xf0,0xf1,0xf2,0xf3,
0xf4,0xf5,0xf6,0xf7
};//用于通道选择
uchar td[7];
uchar xstd[7];
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void clkt()
{
ad_clk=1;
ad_clk=0;
}
void clktf()
{
ad_clk=0; //delay1us;
ad_clk=1; //delay1us;
}
sint getdata()//uchar chx)
{
sint hd=0x00,ld=0x00; sint t;
sint dat=0x00;
uchar ch=0xe0; //1 11 0 ;0 000
ad_cs=1;
ad_cs=0;
ad_clk=1;
for(t=0;t<6;t++)
{
ad_din=0x80&ch;
ad_clk=0;//delay1us;
ad_clk=1;//delay1us;
ch<<=1;
}
for(t=0;t<13;t++)
{
ad_clk=0;
hd<<=1;
ad_clk=1;
delay1us;delay1us;delay1us;
hd|=ad_dout; delay1us;delay1us;delay1us;
}
ad_cs=1;
return hd;
}
void init()
{
TMOD=0x21;
TL0=(65536-5000)/256;
TH0=(65536-5000)%256;
TH1=0xfd;
TL1=0xfd;
TR1=1;//启动定时器一
ET0=1;//中断允许位
SM0=0;
SM1=1;
REN=1;//允许串行接受位;
EA=1;//开总中断
ES=1;//开串口中断
}
void main()
{
init();
while(1)
{
if(flag==1)
{
flag=0;
ES=0;
TI=1;
if((0<=flag_td)&&(flag_td<=7))
{
if(n<=7)
{
printf("I get %bd\n",flag_td);//b为char型变量的存储格式。
td[n++]=xt[flag_td];
xstd[h++]=flag_td;
}
else
{
puts("the input is error!");
}
}
else if(flag_td==8)
{
puts("turn on ad!\n");
TR0=1;
h=0;
}
else
{
puts("turn off ad!\n");
n=0;
h=0;
TR0=0;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_time==1)
{
char m,p;
flag_time=0;
P2=td[m++];
if(m>=n)
m=0;
p=xstd[h++];
if(h>=n)
h=0;
ad_val=getdata();
ad_vo=(float)ad_val*2.0/4096.0;
ES=0;
TI=1;
printf("The %bd voltage is %fv\n",p,ad_vo);
while(!TI);
TI=0;
ES=1;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_num++;
if(t0_num==2)
{
t0_num=0;
flag_time=1;
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
if(a==0)
flag_td=0;
else if(a==1)
flag_td=1;
else if(a==2)
flag_td=2;
else if(a==3)
flag_td=3;
else if(a==4)
flag_td=4;
else if(a==5)
flag_td=5;
else if(a==6)
flag_td=6;
else if(a==7)
flag_td=7;
else if(a==8)
flag_td=8;
else
flag_td=9;
}
|
|