/********************************************************************************************************
*文件名: 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 //使能串口中断后需有中断处理函数
{
}
|