|
這個是我大二做的,今天看到了就發(fā)出來。采集模擬信號轉(zhuǎn)換成數(shù)字信號,多路采集。仿真中的采集信號用不同電壓的電源代替。上位機發(fā)送數(shù)字0—7,決定采集哪幾路的信號,發(fā)送8開啟采集,發(fā)送其他任意值,關閉采集。串口仿真軟件打包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;
}
|
-
-
adcaiji.7z
2019-10-15 00:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
56.75 KB, 下載次數(shù): 49, 下載積分: 黑幣 -5
|