TLC549轉換器電路Proteus仿真原理圖如下:
51hei.gif (130.33 KB, 下載次數: 29)
下載附件
2023-10-20 14:20 上傳
TLC549.png (12.91 KB, 下載次數: 32)
下載附件
2023-10-20 14:16 上傳
單片機源程序如下:
- /*
- *軟 件 標 題:TLC549 AD采樣子程序
- *軟 件 說 明:從TLC549讀取采樣值
- *_________________________________________
- *
- */
- #include <REGX51.H>//頭文件
- #include "intrins.h"
- #define Wait1us _nop_();
- #define Wait2us {_nop_();_nop_();}
- #define Wait4us {Wait2us;Wait2us;}
- #define Wait8us {Wait4us;Wait4us;}
- #define Wait10us {Wait8us;Wait2us;}
- #define Wait30us {Wait10us;Wait8us;Wait4us;Wait2us;}
- /************定義接口總線**************/
- sbit Clock = P1 ^ 5; //時鐘口線
- sbit DataOut = P1 ^ 4; //數據輸出口線
- sbit ChipSelect = P1 ^ 3; //片選口線
- /************接口總線定義結束**********/
- /*********函數名稱:ADCSelChannel********
- *
- *功能:轉換指定通道的模擬量為數字量
- *
- *說明:
- *
- *位置:1
- *
- ****************************************/
- unsigned char ADCSelChannel(void)
- {
- unsigned char ConvertValue = 0;
- unsigned char i;
- ChipSelect = 1; //芯片復位
- ChipSelect = 0;
- ChipSelect = 1;
- Clock = 0;
- Wait4us;
- ChipSelect = 0; //芯片起始
- Wait4us; //等待延時
- for (i = 0; i < 8; i ++) //輸入采樣轉換時鐘
- {
- Clock = 1;
- Clock = 0;
- }
- ChipSelect = 1; //開始轉換
- Wait10us; //等待轉換結束
- ChipSelect = 0; //讀取轉換結果
- Wait4us;
- for (i = 0; i < 8; i ++) //
- {
- Clock = 1;
- ConvertValue <<= 1;
- if (DataOut)
- {
- ConvertValue = 0x1;
- }
- Clock = 0;
- }
- ChipSelect = 1;
- return (ConvertValue); //返回轉換結果
- }
復制代碼
- #include <REGX51.H>//頭文件
- #include "intrins.h"//空操作文件
- #include<stdio.h>
- #include<stdlib.h>
- #define uchar unsigned char//宏定義char
- #define uint unsigned int//宏定義int
- void delay(long i){while(i--);}
- uchar code tb[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管段選
- uchar code seg_bit_scan[]={0xef,0xdf,0xbf,0x7f}; //各個數碼管對應的位選數據
- sbit data_temp=P1^4;//數據線(讀出數據)
- sbit cs=P1^3;//片選
- sbit sclk=P1^5;//io口時鐘
- uint j; uchar qian,bai,shi,ge;
- void chuli(uint num) //顯示程序
- {
-
- qian=num/1000%10; //千,百,十,個處理
- bai=num/100%10;
- shi=num/10%10;
- ge=num%10;
-
- }
- uint ad_549() //TLC549處理
- {
- uchar i;
- uint data_ad=0;
- cs=1;//先拉高電平 //初始化,啟動
- sclk=0;//clk拉低電平
- cs=0;//cs拉低電平
- _nop_();//空操作 5微妙
-
- for(i=8;i>0;i--)//循環讀取8位A/D轉換結果
- {
- data_ad<<=1;
- data_ad=data_temp|data_ad;
- sclk=1;
- _nop_();_nop_();
- sclk=0;
- _nop_();
- }//循環八次 讀到一個8個2進制數
- cs=1;//cs拉高電平
- sclk=0;
- if (data_ad==0xff) data_ad=data_ad+1.953125 ;
- data_ad=data_ad*19.53125;//采集到的0--255,對應0--5V
- return(data_ad);//返回ad的數據
- }
- void timer0_isr(void) interrupt 1//定時器的0中斷服務函數
- {
-
- TR0=0;//關閉定時器0
- TL0=(65536-10000)%256;//賦初值
- TH0=(65536-10000)/256;//賦初值
- j++;
- if(j>=4) //變量j加一次 //如果j大于4
- j=0;//j等于0
-
- TR0=1;//重新啟動定時器0
- }
- void timer0_init (void)//定時器0中斷初始化函數
- {
- EA=0;//關閉總中斷
- TMOD=0x01;//確定定時器0的工作方式為1
- TR0=0;//關閉定時器0
- TL0=(65536-10000)%256;//賦初值
- TH0=(65536-10000)/256;//賦初值
- PT0=1;//
- ET0=1;//打開定時器0的中斷開關
- EA=1;//打開總中斷開關
- TR0=1;//啟動定時器0
- }
- void main(void)//主程序
- {
-
- uint i;//變量i
- timer0_init ();//初始化定時器0 啟動定時器0
-
- while(1)//循環函數
- {
- P0=0xff;
- i=ad_549();//把ad_549讀到的數賦給i
- chuli(i);//顯示最終結果(啟動ad_549轉換)
-
- switch(j)
- {
- case 0: P0 = tb[ge]; break;
- case 1: P0 = tb[shi]; break;
- case 2: P0 = tb[bai];break;
- case 3: P0 = tb[qian]&0x7f; break;
- default: break;
- }
-
- P2 = seg_bit_scan[j]; //與j對應,P2輸出數碼管的位選信號
- delay(8);
- }
- }
-
復制代碼
仿真程序下載:
A_D轉換器應用-已測可用.zip
(334.45 KB, 下載次數: 15)
2023-10-20 08:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|