欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機+ADC0832差分與單通道程序和注解+仿真電路圖
[打印本頁]
作者:
kc樂樂
時間:
2019-9-26 14:46
標題:
單片機+ADC0832差分與單通道程序和注解+仿真電路圖
新手資料如果錯誤希望諒解。
ADC0832差分仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(14.13 KB, 下載次數: 49)
下載附件
2019-9-27 03:39 上傳
單片機源程序如下(帶詳細的注釋):
#include<reg52.h>
#include<intrins.h>
#include<1602.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code num[]={"0123456789*#"};
sbit ADC_DI=P1^2; //通道端CH0,CH1
sbit ADC_DO=P1^2; //數據端
sbit ADC_CLK=P1^1; //時鐘端
sbit ADC_CS=P1^0; //片選端
sbit DS=P3^5;
sbit SH_CP=P3^6;
sbit ST_CP=P3^7;
void ADC_init() //ADC0832初始化
{
ADC_CS=1; //片選端關閉,低電平有效
ADC_CLK=1; //時鐘端
ADC_DI=1; //數據端
_nop_();_nop_();
}
void ADC_start() //ADC0832啟動
{
ADC_CS=0; //打開片選
_nop_();_nop_();
ADC_CLK=0; //第一個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=1; //打開通道設置
_nop_();_nop_();
ADC_CLK=1; //第一個時鐘脈沖高電平完成第一個時鐘脈沖
_nop_();_nop_();
}
void ADC_select_channel() //ADC0832通道選擇:單通道使用CH0
{
ADC_CLK=0; //第二個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=0; //DI為1是選用單端輸入(單通道),DI為0是選用單道差分輸入(雙通道)
_nop_();_nop_();
ADC_CLK=1; //第二個時鐘脈沖高電平完成第二個時鐘脈沖
_nop_();_nop_();
ADC_CLK=0; //第三個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=0; //第三個脈沖時DI為0選用CH0輸入,DI為1是選用CH1輸入
_nop_();_nop_();
ADC_CLK=1; //第三個時鐘脈沖高電平完成第三個時鐘脈沖
_nop_();_nop_();
}
uchar ADC0832()
{
uchar dat1,dat2,i; //定義二個變量dat1存入前8位dat2存入后8位
ADC_CLK=0; //增加一個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=0; //通道端關閉
_nop_();_nop_();
ADC_DO=1; //數據端打開
_nop_();_nop_();
ADC_CLK=1; //增加一個時鐘脈沖高電平(完成一個時鐘脈沖)
_nop_();_nop_();
for(i=0;i<8;i++) //循環8次時鐘脈沖第四次到第十一次
{
ADC_CLK=0; //第四個時鐘脈沖低電平
_nop_();_nop_();
dat1=dat1<<1; //變量dat1每次循環左移一位,dat1從高位移到低位7位—0位
if(ADC_DO==1) //判斷數據端是否高電平
{
dat1=dat1|0x01; //如果數據端為高電平,變量dat1最低位變成1
}
ADC_CLK=1; //第四個時鐘脈沖高電平完成第四個時鐘脈沖
_nop_();_nop_();
}
for(i=0;i<8;i++) //循環8次時鐘脈沖第十一次到第十九次
{
dat2=dat2>>1; //變量dat2每次循環右移一位,因為dat2從低位到高位0位——7位,
if(ADC_DO==1) //判斷數據端是否高電平
{
dat2=dat2|0x80; //如果數據端為高電平,變量dat2最高位置1
}
ADC_CLK=0; //第十一個時鐘脈沖低電平
_nop_();_nop_();
ADC_CLK=1; //第十一個時鐘脈沖高電平完成第十一個時鐘脈沖
_nop_();_nop_();
}
ADC_CS=1; //片選端關閉
_nop_();_nop_();
if(dat1==dat2) //判斷二個數是否一樣
{
return dat1; //如果一樣就返回uchar ADC0832()=dat1
}
else
{
return 0; //如果不是那就返回0
}
}
void main()
{
uint tmp;
ADC_init();
lcd_init();
while(1)
{
ADC_start();
ADC_select_channel();
tmp=ADC0832();
wirte_lcd_cmd(0x80);
wirte_lcd_date(num[tmp/1000]);
wirte_lcd_date(num[tmp%1000/100]);
wirte_lcd_date(num[tmp%1000%100/10]);
wirte_lcd_date(num[tmp%10]);
}
}
復制代碼
ADC0832單通道
#include<reg52.h>
#include<intrins.h>
#include<1602.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code num[]={"0123456789*#"};
sbit ADC_DI=P1^2; //通道端CH0,CH1
sbit ADC_DO=P1^2; //數據端
sbit ADC_CLK=P1^1; //時鐘端
sbit ADC_CS=P1^0; //片選端
sbit DS=P3^5;
sbit SH_CP=P3^6;
sbit ST_CP=P3^7;
void ADC_init() //ADC0832初始化
{
ADC_CS=1; //片選端關閉,低電平有效
ADC_CLK=1; //時鐘端
ADC_DI=1; //數據端
_nop_();_nop_();
}
void ADC_start() //ADC0832啟動
{
ADC_CS=0; //打開片選
_nop_();_nop_();
ADC_CLK=0; //第一個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=1; //打開通道設置
_nop_();_nop_();
ADC_CLK=1; //第一個時鐘脈沖高電平完成第一個時鐘脈沖
_nop_();_nop_();
}
void ADC_select_channel() //ADC0832通道選擇:單通道使用CH0
{
ADC_CLK=0; //第二個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=1; //DI為1是選用單端輸入(單通道),DI為0是選用單道差分輸入(雙通道)
_nop_();_nop_();
ADC_CLK=1; //第二個時鐘脈沖高電平完成第二個時鐘脈沖
_nop_();_nop_();
ADC_CLK=0; //第三個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=0; //第三個脈沖時DI為0選用CH0輸入,DI為1是選用CH1輸入
_nop_();_nop_();
ADC_CLK=1; //第三個時鐘脈沖高電平完成第三個時鐘脈沖
_nop_();_nop_();
}
uchar ADC0832()
{
uchar dat1,dat2,i; //定義二個變量dat1存入前8位dat2存入后8位
ADC_CLK=0; //增加一個時鐘脈沖低電平
_nop_();_nop_();
ADC_DI=0; //通道端關閉
_nop_();_nop_();
ADC_DO=1; //數據端打開
_nop_();_nop_();
ADC_CLK=1; //增加一個時鐘脈沖高電平(完成一個時鐘脈沖)
_nop_();_nop_();
for(i=0;i<8;i++) //循環8次時鐘脈沖第四次到第十一次
{
ADC_CLK=0; //第四個時鐘脈沖低電平
_nop_();_nop_();
dat1=dat1<<1; //變量dat1每次循環左移一位,dat1從高位移到低位7位—0位
if(ADC_DO==1) //判斷數據端是否高電平
{
dat1=dat1|0x01; //如果數據端為高電平,變量dat1最低位變成1
}
ADC_CLK=1; //第四個時鐘脈沖高電平完成第四個時鐘脈沖
_nop_();_nop_();
}
for(i=0;i<8;i++) //循環8次時鐘脈沖第十一次到第十九次
{
dat2=dat2>>1; //變量dat2每次循環右移一位,因為dat2從低位到高位0位——7位,
if(ADC_DO==1) //判斷數據端是否高電平
{
dat2=dat2|0x80; //如果數據端為高電平,變量dat2最高位置1
}
ADC_CLK=0; //第十一個時鐘脈沖低電平
_nop_();_nop_();
ADC_CLK=1; //第十一個時鐘脈沖高電平完成第十一個時鐘脈沖
_nop_();_nop_();
}
ADC_CS=1; //片選端關閉
_nop_();_nop_();
if(dat1==dat2) //判斷二個數是否一樣
{
return dat1; //如果一樣就返回uchar ADC0832()=dat1
}
else
{
return 0; //如果不是那就返回0
}
}
/*float get_distance()
{
uchar i;float sum=0.0;
for(i=0;i<10;i++)
{
sum=sum+ADC0832();
}
return ((1388/(sum/10.0-5))-2);
}*/
void main()
{
uint tmp;
// float temp;
ADC_init();
lcd_init();
while(1)
{
ADC_start();
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png
(12.11 KB, 下載次數: 46)
下載附件
2019-9-27 03:40 上傳
所有資料51hei提供下載:
ADC0832程序和注解電路圖.rar
(194.2 KB, 下載次數: 91)
2019-9-26 14:45 上傳
點擊文件名下載附件
網上資料
下載積分: 黑幣 -5
ADC0832資料.docx
(66.73 KB, 下載次數: 28)
2019-9-26 14:44 上傳
點擊文件名下載附件
網上資料
下載積分: 黑幣 -5
作者:
tieq1952
時間:
2019-9-27 08:37
謝謝分享!!!
作者:
2790759984
時間:
2020-2-5 16:38
正需要!謝謝分享!
作者:
jjwangxu2008
時間:
2020-3-14 12:46
謝謝分享!!!
作者:
longzhihao
時間:
2021-4-20 14:52
你好,請問雙通道差分的意思是我可以直接轉換2個模擬量嗎?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1