找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4|回复: 0
打印 上一主题 下一主题
收起左侧

参考程序

[复制链接]
跳转到指定楼层
楼主
ID:814176 发表于 2023-8-26 21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************************************************************
*文件名:     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          //使能串口中断后需有中断处理函数
{

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表