|
這里用到PCF8591 AD DA芯片 和51單片機(jī)機(jī),和一個(gè)電位器。通過 控制 電位器,產(chǎn)生PWM波,控制舵機(jī) 旋轉(zhuǎn)。并在數(shù)碼管上顯示角度。
- /*-----------------------------------------------
- 名稱:IIC協(xié)議 PCF8591ADDA轉(zhuǎn)換
- 內(nèi)容:此程序通過IIC協(xié)議對(duì)DAAD芯片操作,讀取電位器的電壓,并輸出模擬量,用LED亮度漸變指示,晶體選用12MHz
- ------------------------------------------------*/
- #include"reg52.h"
- #include //包含NOP空指令函數(shù)_nop_();
- #define AddWr 0x90 //寫數(shù)據(jù)地址
- #define AddRd 0x91 //讀數(shù)據(jù)地址
- sbit Sda=P1^2; //定義總線連接端口
- sbit Scl=P1^1;
- sbit control_signal=P1^5;
- data unsigned int Display[8];//定義臨時(shí)存放數(shù)碼管數(shù)值
- unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數(shù)共陰碼管段碼表
- unsigned int ADtemp; //定義全局變量
- unsigned int high,low;
- static unsigned int count1;
- /*------------------------------------------------
- 延時(shí)程序
- ------------------------------------------------*/
- void mDelay(unsigned char j)
- {
- unsigned int i;
- for(;j>0;j--)
- {
- for(i=0;i<125;i++)
- {;}
- }
- }
- /*------------------------------------------------
- 初始化定時(shí)器0
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD "=0x01; //定時(shí)器設(shè)置 0.1ms in 11.0592M crystal
- TH0=(65536-78)/256;
- TL0=(65536-78)%256; //定時(shí)0.1mS
- ET0=1;//定時(shí)器中斷打開
- EA=1;//總中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- }
- /*------------------------------------------------
- 啟動(dòng)IIC總線
- ------------------------------------------------*/
- void Start(void)
- {
- Sda=1;
- _nop_();
- Scl=1;
- _nop_();
- Sda=0;
- _nop_();
- Scl=0;
- }
- /*------------------------------------------------
- 停止IIC總線
- ------------------------------------------------*/
- void Stop(void)
- {
- Sda=0;
- _nop_();
- Scl=1;
- _nop_();
- Sda=1;
- _nop_();
- Scl=0;
- }
- /*------------------------------------------------
- 應(yīng)答IIC總線
- ------------------------------------------------*/
- void Ack(void)
- {
- Sda=0;
- _nop_();
- Scl=1;
- _nop_();
- Scl=0;
- _nop_();
- }
- /*------------------------------------------------
- 非應(yīng)答IIC總線
- ------------------------------------------------*/
- void NoAck(void)
- {
- Sda=1;
- _nop_();
- Scl=1;
- _nop_();
- Scl=0;
- _nop_();
- }
- /*------------------------------------------------
- 發(fā)送一個(gè)字節(jié)
- ------------------------------------------------*/
- void Send(unsigned char Data)
- {
- unsigned char BitCounter=8;
- unsigned char temp;
- do
- {
- temp=Data;
- Scl=0;
- _nop_();
- if((temp&0x80)==0x80)
- Sda=1;
- else
- Sda=0;
- Scl=1;
- temp=Data<<1;
- Data=temp;
- BitCounter--;
- }
- while(BitCounter);
- Scl=0;
- }
- /*------------------------------------------------
- 讀入一個(gè)字節(jié)并返回
- ------------------------------------------------*/
- unsigned char Read(void)
- {
- unsigned char temp=0;
- unsigned char temp1=0;
- unsigned char BitCounter=8;
- Sda=1;
- do
- {
- Scl=0;
- _nop_();
- Scl=1;
- _nop_();
- if(Sda)
- temp=temp|0x01;
- else
- temp=temp&0xfe;
- if(BitCounter-1)
- {
- temp1=temp<<1;
- temp=temp1;
- }
- BitCounter--;
- }
- while(BitCounter);
- return(temp);
- }
- /*------------------------------------------------
- 讀取AD模數(shù)轉(zhuǎn)換的值,有返回值
- ------------------------------------------------*/
- unsigned int ReadADC(unsigned char Chl)
- {
- unsigned int Data;
- Start(); //啟始信號(hào)
- Send(AddWr);//0x90
- Ack();
- Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
- //Chl的值分別為0、1、2、3,分別代表1-4通道
- Ack();
- Start();
- Send(AddRd); //讀入地址
- Ack();
- Data=Read(); //讀數(shù)據(jù)
- Scl=0;
- NoAck();
- Stop();
- return Data; //返回值
- }
- /******************************************************************/
- /* 主程序 */
- /******************************************************************/
- void main()
- {
- Init_Timer0();
- while(1)
- {
- unsigned int angle;
- ADtemp=ReadADC(0); //ADtemp的取值范圍是0-255,定時(shí)的時(shí)間范圍是0.5-2.5ms
- high=65075-7.2*ADtemp;
- // ( high=65035-7.8*ADtemp;12MHz)(65535-(460+7.2*ADtemp 11.0592MHz)
- low=47563+7.2*ADtemp;
- // ( low=46035+7.8*ADtemp; ) ( 65535-(17972-7.2*ADtemp 11.0592MHz )
- angle=ADtemp*0.7;
- Display[0]=Datatab[angle/100];//處理0通道電壓顯示
- Display[1]=Datatab[(angle%100)/10];
- Display[2]=Datatab[angle%10];
- while(1)
- {
- P0=Display[count1];//用于動(dòng)態(tài)掃描數(shù)碼管
- P2=count1;
- mDelay(1);
- count1++;
- if(count1==3) //表示掃描3個(gè)數(shù)碼管
- {
- count1=0;
- break;
- }
- }
-
- }
- }
- /******************************************************************/
- /* 定時(shí)器中斷函數(shù)
- /******************************************************************/
- void tim(void) interrupt 1 using 1
- {
- static unsigned char count;
- if (!count)
- {
- control_signal = 1; //給高電平
- TH0=high/256;
- TL0=high%256;
- }
- else
- {
- control_signal=0 ;
- TH0=low/256;
- TL0=low%256;
- }
- count=~count;
- }
復(fù)制代碼 |
評(píng)分
-
查看全部評(píng)分
|