/********************************************************************************************************
*文件名: TM7707_OneChannel
*單片機型號: STC12C5608AD
*開發環境: Keil uVision4
*晶震頻率: 單片機11.0592MHZ、TM7707外部晶振2.4576MHZ
*TM7707基準: 2.5V
*功能說明: 1.此驅動程序只采集通道1或者通道2的AD值,單(雙)極性、1倍增益、10HZ、在單極性時AIN1-和AIN2-均接GND
2.從TM7707讀取采集到的24bit AD數據后用串口(STC-ISP串口調試助手)在電腦上顯示6個16進制數
*修改記錄: 1.修改為先寫通道再判斷DRDY拉低
*******************************************************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK_TM7707=P2^1; //定義SCLK時鐘信號端口
sbit DIN_TM7707=P2^0; //定義DIN數據輸入端口
sbit DOUT_TM7707=P1^7; //定義DOUT數據輸出端口
sbit DRDY_TM7707=P1^6; //定義DRDY可讀AD端口
sbit CS_TM7707=P1^5; //定義片選端口或從硬件上將片選端口直接接到GND后無需控制
void delay_us() //短延時函數,晶振11.0592MHZ,延時約1us
{
; ; ;
}
void delay_nms(uchar n) //延時約nms
{
uchar i;
while(n--)
for(i=0;i<125;i++);
}
void Write_byte_TM7707(uchar dat1) //將數據dat1寫入TM7707
{
uchar i;
CS_TM7707=0;
SCLK_TM7707=1;
for(i=0;i<8;i++)
{
SCLK_TM7707=0;
delay_us();
if(dat1&0x80) DIN_TM7707=1; //先寫高位
else DIN_TM7707=0;
delay_us();
SCLK_TM7707=1;
delay_us();
dat1<<=1;
}
SCLK_TM7707=1;
DIN_TM7707=1;
CS_TM7707=1;
}
unsigned char Read_byte_TM7707( ) //從TM7707寄存器讀數據
{
uchar i,dat2=0;
CS_TM7707=0;
SCLK_TM7707=1;
for(i=0;i<8;i++)
{
SCLK_TM7707=0;
delay_us();
dat2=(dat2<<1)|DOUT_TM7707; // 高位先讀
delay_us();
SCLK_TM7707=1;
delay_us();
}
SCLK_TM7707=1;
CS_TM7707=1;
return dat2;
}
/*********************************************************************************************
函數名:UART串口初始化函數
調 用:UART_init();
參 數:無
返回值:無
結 果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
備 注:振蕩晶體為11.0592MHz,PC串口端設置 [ 9600,8,無,1,無 ]
/**********************************************************************************************/
void UART_init(void) //串口初始化
{
SCON=0x50;//SCON:串口工作方式1 8-bit UART為0 1,SM2=0,允許串行接收控制位REN=1,TB8=0,RB8=0,TI=0,RI=0;
TMOD=0x20;//SMOD:定時器1,GATE=0,作定時器C/T=0,方式2 8位自動重裝載定時器則M1 M0=1 0,定時器0中GATE C/T M1 M0均置0。
PCON=0x80;//設置SMOD=1,串行工作的波特率加倍
TH1=0xfa; //Baud rate:9600Hz
TL1=0xfa;
EA=1;//開啟總中斷
ES=1;//開串口中斷
TR1=1;//啟動定時器1運行
}
/*********************************************************************************************
函數名:UART串口發送函數
調 用:UART_T (?);
參 數:需要UART串口發送的數據(8位/1字節)
返回值:無
結 果:將參數中的數據發送給UART串口,確認發送完成后退出
備 注:
/**********************************************************************************************/
void UART_T(unsigned char UART_data) //定義串口發送數據變量
{
SBUF=UART_data; //將接收的數據發送回去
while(!TI); //檢查發送中斷標志位
TI=0; //令發送中斷標志位為0(軟件置零)
}
/*********************************************************************************************
函數名:TM7707初始化
調 用:無
參 數:無
返回值:無
結 果:無
備 注:無
/**********************************************************************************************/
void TM7707_init()
{
uchar i;
DRDY_TM7707=1;
DOUT_TM7707=1;
DIN_TM7707=1;
SCLK_TM7707=1;
for(i=0;i<40;i++) //將DIN_TM7707置高40個時鐘周期使之穩定
{
SCLK_TM7707=0;
delay_us();
SCLK_TM7707=1;
delay_us();
}
delay_us();
delay_us();
delay_us();
}
void main()
{
uchar temp1,temp2,temp3;
UART_init();
TM7707_init();
delay_nms(50);
/*以下為增益在1~4倍下設置的更新速率*/
/* //5HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x0f);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x00); */
//10HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器;DRDY=0,設置寄存器RS2 RS1 RS0=0 1 0,下一步寫R/W=0,STBY=0,通道1時CH1 CH0=0 0;
Write_byte_TM7707(0x07);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x80);
/*//20HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x03);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0xc0);
//30HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x02);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x80);
//50HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x01);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x80);
//60HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x01);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x40);
//100HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x00);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0xc0);
//250HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x00);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x4c);
//500HZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x00);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x26);
//1KHZ
Write_byte_TM7707(0x20); //寫通訊寄存器的下一步寫濾波器高寄存器
Write_byte_TM7707(0x00);
Write_byte_TM7707(0x50); //寫通訊寄存器的下一步寫濾波器低寄存器
Write_byte_TM7707(0x13);*/
Write_byte_TM7707(0x10); //通道1(0 0 0 1 0 0 0 0),寫通訊器的下一步寫設置寄存器;DRDY=0,設置寄存器RS2 RS1 RS0=0 0 1,下一步寫R/W=0,STBY=0,通道1時CH1 CH0=0 0;
//Write_byte_TM7707(0x11); //通道2(0 0 0 1 0 0 0 1),寫通訊器的下一步寫設置寄存器;DRDY=0,設置寄存器RS2 RS1 RS0=0 0 1,下一步寫R/W=0,STBY=0,通道2時CH1 CH0=0 1;
Write_byte_TM7707(0x44); //寫設置寄存器(0 1 0 0 0 1 0 0),自校準模式0 1,1倍增益0 0 0,單極性設置B/U=1,緩沖器短路Buf=0,FSYNC=0;
// Write_byte_TM7707(0x40); //寫設置寄存器(0 1 0 0 0 0 0 0),自校準模式0 1,1倍增益0 0 0,雙極性設置B/U=0,緩沖器短路Buf=0,FSYNC=0; */
while(1)
{
Write_byte_TM7707(0x38); //讀通道1
//Write_byte_TM7707(0x39); //讀通道2
while(DRDY_TM7707==1); //等待DRDY為低電平,表示可以從數據寄存器獲取數據
delay_nms(1);
temp1=Read_byte_TM7707(); //讀高8位
temp2=Read_byte_TM7707(); //讀中間8位
temp3=Read_byte_TM7707(); //讀低8位
if(temp1/16>9) //轉化為十六進制讀數
UART_T(temp1/16+55);
else
UART_T(temp1/16+48);
if(temp1%16>9)
UART_T(temp1%16+55);
else
UART_T(temp1%16+48);
if(temp2/16>9) //轉化為十六進制讀數
UART_T(temp2/16+55);
else
UART_T(temp2/16+48);
if(temp2%16>9)
UART_T(temp2%16+55);
else
UART_T(temp2%16+48);
if(temp3/16>9) //轉化為十六進制讀數
UART_T(temp3/16+55);
else
UART_T(temp3/16+48);
if(temp3%16>9)
UART_T(temp3%16+55);
else
UART_T(temp3%16+48);
UART_T(' '); //空格
UART_T(' ');
}
}
void UartIrqProc(void) interrupt 4 //使能串口中斷后需有中斷處理函數
{
}
|