📄 main.c
字号:
#include <reg52.h>
#include<stdio.h>
#include <string.h>
#include "intrins.h"
sbit wr_62256 =P2^0;
sbit oe_62256 =P2^1;
sbit ce_62256 =P2^2;
sbit SDA = P2^7;
sbit SCL = P2^6 ;
unsigned char slvadr;
sbit TLC1456_so =P1^4;
sbit TLC1456_clk =P1^6;
sbit TLC1456_cs0 =P1^5;
sbit TLC1456_cs1 =P1^3;
sbit TLC1456_clr =P1^7;
void SendD(unsigned int dat,unsigned char num)
{
unsigned char i=0;
if (num==0)
TLC1456_cs0 = 0;
else
TLC1456_cs1 = 0;
for (i=12; i>0; i--)
{
TLC1456_so = dat & 0x0200;
TLC1456_clk = 1;
dat <<= 1;
TLC1456_clk = 0;
}
if (num==0 )
TLC1456_cs0 = 1;
else
TLC1456_cs1 = 1;
TLC1456_clk = 0;
}
sbit TLC1864_sdo =P1^1;
sbit TLC1864_clk =P1^2;
sbit TLC1864_conv =P1^0;
unsigned int get_ADC(void)
{
unsigned char i=0;
unsigned int tmp=0;
TLC1864_conv=0;
TLC1864_sdo=1;
TLC1864_clk=0;
/* _nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_ */
for (i=12;i>0;i--)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
TLC1864_clk=1;
TLC1864_clk=0;
tmp <<= 1;
if ( TLC1864_sdo )
tmp |= 0x01;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
TLC1864_conv=1;
return tmp;
}
#define TRUE 1
#define FALSE 0
void IIC_Start(void);
void IIC_Stop(void);
void IIC_TxByte(unsigned char tx_byte);
unsigned char IIC_RxByte(void);
unsigned char IIC_WaitAck(void);
void IIC_SendAck(void);
void IIC_SendNoAck(void);
/*******************************************************************************
*** 函 数 名: static void IIC_Start(void)
*** 功能描述:
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: Start IIC.
/******************************************************************************/
void IIC_Start(void)
{
EA = 0; //关中断;
SDA = 1; //初始化总线;
SCL = 1;
_nop_();
SDA = 0; //启动总线;
_nop_();
SCL = 0; //准备数据发送,启动IIC之后传输线全部置0;
}
/*******************************************************************************
*** 函 数 名: static void IIC_TxByte(unsigned char tx_byte)
*** 功能描述: 发送一个字节;
*** 全局变量: NO !
*** 输 入: tx_byte
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
void IIC_TxByte(unsigned char tx_byte)
{//SDA:0; SCL:0.
unsigned char i;
for(i=0;i<8;i++)
{
if(tx_byte & 0x80)
SDA = 1; //因为Start函数中以把SCL拉低,数据直接发送;
else
SDA = 0;
tx_byte <<= 1; //因为发送顺序:由Msb——>Lsb;
SCL = 1;
_nop_(); //延时;
SCL = 0;
}
}
/*******************************************************************************
*** 函 数 名: static bool IIC_WaitAck(void)
*** 功能描述: 发送一个字节;
*** 全局变量: NO !
*** 输 入: tx_byte
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
unsigned char IIC_WaitAck(void)
{//SDA:U; SCL:0.
unsigned char waitTime = 0xff; //设置Ack信号超时数;
SDA = 1; //将数据线拉高;
SCL = 1; //启动Ack脉冲;
_nop_();
while(SDA)
{
waitTime--;
if(!waitTime)
{
SCL = 0; //SCL=0;
IIC_Stop();
return FALSE;
}
}
SCL = 0; //操作完成后确认SCL为0,此时SDA=0;
return TRUE;
}
/*******************************************************************************
*** 函 数 名: static unsigned char IIC_RxByte(void)
*** 功能描述: 接收一个字节;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: 接收字节:tmp
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
unsigned char IIC_RxByte(void)
{//SDA:0; SCL:0;
unsigned char tmp = 0;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 0;
SDA = 1; //向I/O口写1后准备读入;
_nop_();
SCL = 1;
_nop_();
tmp <<= 1;
if(SDA)
{
tmp |= 0x01;
}
}
SCL = 0; //SCL=0;
return tmp;
}
/*******************************************************************************
*** 函 数 名: static void IIC_SendAck(void)
*** 功能描述: 发送应答信号;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
void IIC_SendAck(void)
{
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
}
/*******************************************************************************
*** 函 数 名: static void IIC_SendNoAck(void)
*** 功能描述: 发送非应答信号;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
void IIC_SendNoAck(void)
{
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
}
/*******************************************************************************
*** 函 数 名: static void IIC_Stop(void)
*** 功能描述: 终止IIC传输;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为1,同时打开中断;
/******************************************************************************/
void IIC_Stop(void)
{
SDA = 0; //to stop IIC;
SCL = 0;
_nop_();
SCL = 1;
_nop_();
SDA = 1; //IIC Stoped !! 结束IIC之后传输线全部置1;
EA = 1; //Set EA.
}
void init_serialcomm(void)
{
SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收
PCON=0x00;
ES=1;
TMOD=0x21; //定时器工作于方式2,自动装载方式
TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
TL1=0xfd;
TH1=0xfd;
ET0=1;
TR0=1;
TR1=1;
//TI=0;
// EA=1;
//TI=1;
}
void serial () interrupt 4 using 3
{
/* if(RI)
{ RI=0;
ch=SBUF;
TI=1; //置SBUF空
switch(ch)
{
case 0x01 :printf("A"); TI=0;break;
case 0x02 :printf("B"); TI=0;break;
case 0x03 :printf("C"); TI=0;break;
case 0x04 :printf("D"); TI=0;break;
default :printf("fg"); TI=0;break;
}
}*/
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch; while(TI==0); TI=0;
}//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str,unsigned int strlen){
unsigned int k=0;
do { send_char_com(*(str + k)); k++; }
while(k < strlen);
}
void PCF8583_ReadDat(unsigned char addrInter,unsigned char num,unsigned char *buff)
{
unsigned char i;
IIC_Start(); //启动IIC Bus;
IIC_TxByte(0xa0); //PCF8583设备寻址;命令:写;
IIC_WaitAck(); //等待Ack信号;
IIC_TxByte(addrInter); //发送内部寄存器地址;
IIC_WaitAck(); //等待Ack信号;
IIC_Start(); //参考PCF读Read Mode时序;
IIC_TxByte(0xa1); //PCF8583设备寻址,命令:读;
IIC_WaitAck();
for(i=0;i<num-1;i++)
{
buff[i] = IIC_RxByte(); //读一个字节;
IIC_SendAck(); //发送应答信号;
}
buff[num-1] = IIC_RxByte();
IIC_SendNoAck(); //最后一个字节发送非应答信号;
IIC_Stop(); //终止本次传输,IIC Bus空闲;
}
/*******************************************************************************
*** 函 数 名: extern void PCF8583_WriteDat(unsigned char addrInter,unsigned char num,unsigned char *buff)
*** 功能描述: 对PCF8583写;
*** 全局变量: NO !
*** 输 入: addrInter:内部寻址;num:数据长度;buff:数据缓存;
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: IIC Start至Stop间传输的字节数不限;
PCF8583内部寄存器地址附自增功能;
/******************************************************************************/
void PCF8583_WriteDat(unsigned char addrInter,unsigned char num,unsigned char *buff)
{
unsigned char i;
IIC_Start();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -