ADC0832兩路ad轉換仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (17.16 KB, 下載次數: 56)
下載附件
2021-4-22 18:32 上傳
0.png (34.74 KB, 下載次數: 123)
下載附件
2017-7-13 16:48 上傳
0.png (54.91 KB, 下載次數: 128)
下載附件
2017-7-13 16:48 上傳
單片機源程序如下:
- #include <REGX51.H>
- #define uchar unsigned char
- #define uint unsigned int
- sbit AD0832_CS = P1^0 ; //片選信號
- sbit AD0832_CLK = P1^1; //時鐘接口
- sbit AD0832_DI = P1^2; //數據接口
- uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; // 攝氏溫度符號
- sbit RS = P2^0; //LCD數據/命令選擇端(H/L)位聲明
- sbit RW = P2^1; //LCD讀寫控制,寫為0,讀為1
- sbit EN = P2^2; //LCD使能信號端位聲明
- sbit k1=P2^3; //按鍵定義
- sbit k2=P2^4;
- sbit k3=P2^5;
- sbit k4=P2^6;
- int shang=40; //上限溫度定義
- int xia=20;
- uchar data disdata[7];
- uchar data data1[7];
- /***********************************************************************
- 利用按鍵來控制上限下限溫度
- *********************************************************/
- void delay1(unsigned short i)
- {
- while(i--);
- }
- void keypros()
- {
- if(k1==0) //上加
- {
- delay1(1000);
- shang=shang+1;
- }
- if(k2==0) //上減
- {
- delay1(1000);
- shang=shang-1;
- }
- if(k3==0) //下加
- {
- delay1(1000);
- xia=xia+1;
- }
- if(k4==0) //下減
- {
- delay1(1000);
- xia=xia-1;
-
- }
- if((k3==0)&&(k1==0) ) //歸位
- {
- delay1(1000);
- shang=40;
- xia=20;
-
- }
- }
- /*************************lcd1602程序**************************/
- void delay1ms(uint ms)//延時1毫秒(不夠精確的)
- { uint i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<100;j++);
- }
- void wr_com(uchar com)//寫指令//
- {
- delay1ms(1);
- RS=0;
- RW=0;
- EN=0;
- P0=com;
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void wr_dat(uchar dat)//寫數據//
- {
- delay1ms(1);
- RS=1;
- RW=0;
- EN=0;
- P0=dat;
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void wr_new() //寫新字符
- {
- uchar i;
- wr_com(0x40);
- for(i=0;i<8;i++)
- {
- wr_dat(table[i]);
- }
- }
- void lcd_init()//初始化設置//
- { delay1ms(15);
- wr_com(0x38);delay1ms(5);
- wr_com(0x08);delay1ms(5);
- wr_com(0x01);delay1ms(5);
- wr_com(0x06);delay1ms(5);
- wr_com(0x0c);delay1ms(5);
-
-
- }
- uchar GetAD0832(uint Channel)
- {
- uchar i=0 , Data1 =0 , Data2 = 0 ;
- AD0832_CLK = 0 ; //時鐘置低平
- AD0832_DI = 1 ; //開始信號為高電平
- AD0832_CS = 0 ; //片選信號置低,啟動AD轉換芯片
- AD0832_CLK = 1 ; //輸入開始信號(構成一個正脈沖),時鐘上升沿,輸入開始信號
- AD0832_CLK = 0 ; //時鐘下降沿
- //模擬信號輸入模式選擇(1:單模信號,0:雙模差分信號)
- AD0832_DI = 1 ;
- AD0832_CLK = 1 ; //時鐘上升沿,輸入開始信號
- AD0832_CLK = 0 ; //時鐘下降沿
- //模擬信號輸入通道選擇(1:通道CH1,0:通道CH0)
- AD0832_DI = Channel ; //選擇通道0
- AD0832_CLK = 1 ; //時鐘上升沿,輸入開始信號
- AD0832_CLK = 0 ; //時鐘下降沿
-
- AD0832_DI = 1 ; //數據線置高,準備接收數據
- for(i=0;i<8;i++) //從高位移入數據
- {
- AD0832_CLK = 1 ;
- AD0832_CLK = 0 ; //時鐘下降沿,AD0832輸出數據,高位(MSB)先
- Data1 = Data1<<1;
- if(AD0832_DI == 1)
- {Data1 = Data1 | 0x01;} //數據左移位,補0 ,如果數據為“1”,移入1, 如果數據為“0”,移入0,
- }
- for(i=0;i<8;i++) //從低位移入數據
- {
- Data2 = Data2>>1;
- if(AD0832_DI == 1)
- { Data2 = Data2 | 0x80;} //數據右移位,補0,如果數據為“1”,移入1如果數據為“0”,移入0,
- AD0832_CLK = 1 ;
- AD0832_CLK = 0 ; //時鐘下降沿,AD0832輸出數據,高位(MSB)先
- }
- //數據線置高,釋放總線,完成一次轉換
- AD0832_CLK = 1 ;
- AD0832_DI = 1 ;
- AD0832_CS = 1 ;
-
- return (Data1==Data2)?Data1:0; // 如果相等輸出data1 or 0
- }
- void delay(uint i) //延時程序,i是形式參數,i為1時 延時約1MS
- {
- uint j;
- for(;i>0;i--) //變量i由實際參數傳入一個值,因此i不能賦初值
- for(j=0;j<125;j++) //j由0自增到125 所用的時間大約是1MS
- {;}
- }
-
- void main() //主函數
- {
- uchar AD_val1; //儲存A/D轉換后的值
- uchar AD_val2;
- delay1(1000);
- lcd_init();//初始化顯示
- delay1(1000);
-
- while(1)
- {
- keypros() ;
- data1[0] = shang / 10;
- data1[1] = shang % 10;
- data1[2] = xia / 10;
- data1[3] = xia % 10;
-
- wr_com(0xc0); //寫地址 第二行
- wr_dat('0'+data1[0]);
- wr_com(0xc1); //寫地址 第二行
- wr_dat('0'+data1[1]);
- wr_com(0xc3); //寫地址 第二行
- wr_dat('0'+data1[2]);
- wr_com(0xc4); //寫地址 第二行
- wr_dat('0'+data1[3]);
-
- AD_val1= GetAD0832(0); //進行A/D轉換
- if(AD_val1!=0)
- {
-
- disdata[1]=AD_val1/100+0x30;//?位數
-
-
- disdata[2]=AD_val1%100/10+0x30;//?位數
-
-
- disdata[3]=AD_val1%10/1+0x30;//?數位
- delay(5);
- wr_com(0x81);
- wr_dat(disdata[1]);//顯示小數點
- delay(5);
- wr_com(0x82); //寫地址 第一行
- wr_dat(disdata[2]) ;
- delay(5); //延時1ms
- wr_com(0x83); //寫地址 第一行
- wr_dat(disdata[3]) ;
- }
- AD_val2= GetAD0832(1); //進行A/D轉換
- if(AD_val2!=0)
- {
-
- disdata[4]=AD_val2/100+0x30;//?位數
-
-
- disdata[5]=AD_val2%100/10+0x30;//?位數
-
-
- disdata[6]=AD_val2%10/1+0x30;//?數位
- delay(5);
- wr_com(0x85);
- wr_dat(disdata[4]);//顯示小數點
- delay(5);
- wr_com(0x86); //寫地址 第一行
- wr_dat(disdata[5]) ;
- delay(5); //延時1ms
- wr_com(0x87); //寫地址 第一行
- wr_dat(disdata[6]) ;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
代碼肯定還存在很多問題,求大神指導,需要用Proteus7.5版本打開:
adc0832.zip
(90.32 KB, 下載次數: 463)
2017-7-13 13:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|