📄 analog.c
字号:
#include "stdio.h"
#include "reg52.h"
#include <intrins.h>
#include "absacc.h"
//-----------------------------------------------------------------------------
//全局常量
//-----------------------------------------------------------------------------
int flag;
#define SYSCLK 11059200 //系统时钟频率12MHz
#define BAUDRATE 9600 // UART 波特率9600bps
//X25045
#define WREN 0x06
#define WRDI 0x04
#define RDSR 0x05
#define WRSR 0x01
#define READ0 0x03
#define READ1 0x0b
#define WRITE0 0x02
#define WRITE1 0x0a
//DS12887
#define uchar unsigned char
#define uint unsigned int
#define P128870 XBYTE[0xfe00]
#define P128871 XBYTE[0xfe01]
#define P128872 XBYTE[0xfe02]
#define P128873 XBYTE[0xfe03]
#define P128874 XBYTE[0xfe04]
#define P128875 XBYTE[0xfe05]
#define P128876 XBYTE[0xfe06]
#define P128877 XBYTE[0xfe07]
#define P128878 XBYTE[0xfe08]
#define P128879 XBYTE[0xfe09]
#define P12887a XBYTE[0xfe0a]
#define P12887b XBYTE[0xfe0b]
#define P12887c XBYTE[0xfe0c]
#define P12887d XBYTE[0xfe0d]
#define P12887e XBYTE[0xfe0e]
#define P12887f XBYTE[0xfe0f]
//X25045
#define X25045 XBYTE[0XFdFF]
//ds8255
#define P8255A XBYTE[0x1fff]
#define P8255B XBYTE[0x5fff]
#define P8255C XBYTE[0x9fff]
#define P8255chol XBYTE[0xdfff]
//---------------------------------------------------------------------------
//全局变量
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void UART0_INIT(); //串中初始化
void LED_Flash();
void cl_dog();
void setup12887(uchar *p);
void read12887(uchar *p);
void start12887();
unsigned char Read1B(unsigned char cAddress,bit bRegion); //读出上次关机的时间
void Write1B(unsigned char cData,unsigned char cAddress,bit bRegion);
int read2543(uchar cData,int n);//2543
void dac_5604(unsigned char ch, float out);
void msdelay(int i);
//-----------------------------------------------------------------------------
//端口定义x25045
//-----------------------------------------------------------------------------
sbit CS=P2^1; //单片机p2.7为片选
sbit SO=P1^2; //数据输出
sbit SI=P1^1; // 数据输入
sbit SK=P1^0; //时钟
//2543
sbit CS2543=P2^3;
//5604
sbit CS5604=P2^4;
sbit FS=P1^3;
//指示灯
sbit xianshiC=P2^2;
#define xianshi XBYTE[0Xfbff]
/*主函数*/
void main()
{ unsigned int i;
unsigned char ch1;
uchar *p;
uchar time[8]={'0','0','0','0','0','0','0','0'};
p=&time;//
UART0_INIT();
CS5604=1;
CS2543=1;
SBUF=0X34; //缓冲寄存器
// cl_dog();
for(i=0;i<8;i++)
{
*p++=Read1B(i,0);//读出上次关机的时间
}
p=&time;
if(time[0]==0)
{
setup12887(p);for(i=0;i<10;i++){;}
}
start12887();
// read12887(5);
while(1)
{ int Dataoutput;
//ch1=0x80;
printf("start test\n ");
Dataoutput=read2543(0x09,100);
printf("channel=:0x09,A/D=%u\n",Dataoutput);
//dac_5604(ch1,2.8);
// printf("the test is over\n ");//
//
// xianshi=0x00;
// for(i=0;i<0xffff;i++){;}
//xianshi=0xff;
// for(i=0;i<0xffff;i++){;}
// printf("input digital\n ");
//data_output=ad2543(channel,500);
//
// printf("input digital\n");
//printf("channel=:%u,Analog=: %u\n",channel,data_output);
}
}
//void LED_Flash()
// { short int i;
// xianshi=0x00;
// for(i=0;i<0xffff;i++){;}
// xianshi=0xff;
// for(i=0;i<0xffff;i++){;}
// }
// void Loop_Test() ////指示灯亮息
// {
// uchar B_out=1,i;
// for(i=0;i<8;i++)
// {
// write8255(B_out);
// LED_Flash();
// B_out=B_out<<1;
// }
// }
void UART0_INIT(void) //串行口初始化
{
SCON=0X50;//串口工作方工1,读允许
TMOD=0X22;//定时器1工作在方式2;定时器0工作在方式2
PCON=0X00;
TCON=0X21;//
IP=0X01;
TI=1;
IT0=0;
TR1=1;
TR0=0;
TL0=0X00;
TH0=0X00;
TL1 = 0xfa; // 按波特率设置定时器1 初值fa为4800 fd为9600
TH1 = 0xfa; // 按波特率设置定时器1 重装值fa为4800 fd为9600
}
//-------------------------------------
//x25045
//-------------------------------------
unsigned char Read8()//读8位数据
{
bit bData;
unsigned char cLoop;
unsigned char cData;
for(cLoop=0;cLoop<8;cLoop++)
{
msdelay(40);
SK=1;
msdelay(40);
SK=0;
msdelay(40);
bData=SO;
cData<<=1; //没有值怎么移位???
if(bData)
{
cData|=0x01;
}
}
return cData;
}
void Write8(unsigned char cData)//写8位数据
{
unsigned char cLoop;
for(cLoop=0;cLoop<8;cLoop++)
{
if((cData&0x80)==0)
{
SI=0;
}
else
{
SI=1;
}
msdelay(10);
SK=0;
msdelay(10);
SK=1;
msdelay(10);
cData<<=1;
}
}
unsigned char ReadSR()//读状态寄存器 ?
{
unsigned char cData;
CS=0;
Write8(RDSR);
_nop_();_nop_();_nop_();
cData=Read8();
CS=1;
return cData;
}
unsigned char WriteSR(unsigned char cData)//写状态寄存器
{
unsigned char cTemp;
cTemp=ReadSR();
//if((cTemp&0x01)==1)
//{
// printf("write SR wrong: \n");
// return 0;////////////////////////以上两句在实际使用时,要加上;
//}
CS=0;
Write8(WREN);
CS=1;
CS=0;
Write8(WRSR);
Write8(cData);
CS=1;
//printf("write SR right: \n");
return 1; //怎么始终返回是1
}
void Write1B(unsigned char cData,unsigned char cAddress,bit bRegion)
/* 写入一个字节,cData为写入的数,cAddress为写入地址,bRegion为页 */
{
//while((ReadSR()&0x01)==1)
//{
//}
CS=0;
Write8(WREN);
CS=1;
CS=0;
if(bRegion==0)
{
Write8(WRITE0);
}
else
{
Write8(WRITE1);
}
Write8(cAddress);
Write8(cData);
SK=0;
CS=1;
}
unsigned char Read1B(unsigned char cAddress,bit bRegion)
/* 读入一个字节,cAddress为读入地址,bRegion为页 */
{
unsigned char cData;
//while((ReadSR()&0x01)==1)
//{
//}
CS=0;
if(bRegion==0)
{
Write8(READ0);
}
else
{
Write8(READ1);
}
Write8(cAddress);
cData=Read8();
CS=1;
return cData;
}
void cl_dog(void)//禁止看门狗
{
unsigned char cdata;
unsigned char tdata;
tdata=0;
cdata=ReadSR();//读当前状态寄存器
cdata=cdata|0x30;
do
{
tdata=WriteSR(cdata);//写状态寄存器,禁止看门狗
}while(tdata==0);
}
//--------------------------
//ds12887
//---------------------------
void setup12887(uchar *p) //设置系统时间
{
uchar i;
i=P12887d;
P12887a=0x70;
P12887b=0xa2;
P128870=*p++;
P128871=0xff;
P128872=*p++;
P128873=0xff;
P128874=*p++;
P128875=0xff;
P128876=*p++;
P128877=*p++;
P128878=*p++;
P128879=*p++;
P12887b=0x22;
P12887a=0x20;
i=P12887c;
}
void read12887(uchar *p) //读取系统时间
{
uchar a;
do{ a=P12887a; }
while((a&0x80)==0x80);
*p++=P128870;
*p++=P128872;
*p++=P128874;
*p++=P128876;
*p++=P128877;
*p++=P128878;
*p++=P128879;
}
void start12887(void) //启动时钟
{
uchar i;
i=P12887d;
P12887a=0x70; P12887b=0xa2; P128871=0xff; P128873=0xff; P128875=0xff;
P12887b=0x22; P12887a=0x20;
i=P12887c;
}
//2543 read function
int read2543(int channel,int n)//write cData to the chip,example,00000011 is select the AN3,and MSB is before
{ unsigned char i;
int cData;
int value=0;
cData=channel;
CS2543=0;
for(i=0;i<12;i++)
{
SK=1;
SI=(bit)(cData&0x0008);
msdelay(n);
SK=0;
cData=cData<<1;
msdelay(n);
}
IE=0x81; //open interrupt
SK=1;
CS2543=1;
for(i=0;i<2; )
{
if (flag)
{
cData=channel;
CS2543=0;
for(i=0;i<12;i++)
{
SK=1;
value=value<<1;
SI=(bit)(cData&0x0008);
msdelay(n);
if(SO)
{
SK=0;
value |=0x0001;
msdelay(n);
}
else
{
SK=0;
value &=0xfffe;
msdelay(n);
}
cData=cData<<1;
}
IE=0x00; //close interrupt
SK=1;
CS2543=1;
flag=0;
}
}
return value;
}
//中断函数
void EOCinterrupt() interrupt 0
{
flag=1;
}
//TLC5604
void dac_5604(unsigned char ch,float out)
{
unsigned int i,n,cod;
cod=(out*1024)/5;//2*Vref 参考电压
// printf(" 输出 1 input digtial %d\n",cod);
cod<<=6;
FS=1;
for(i=0;i<5;i++){;}
CS5604=0;
FS=0;
// cod=0xffff;
for(n=0;n<4;n++) /*确定输出在(A,B,C,D)通道*/
{ if((ch&0X80)==0x80)
SI=1;
else
SI=0;
ch<<=1;
SK=0;
for(i=0;i<10;i++){;}
SK=1;
for(i=0;i<10;i++){;}
}
for(n=0;n<10;n++) /*输出模拟信号*/
{
if((cod&0X8000)==0x8000)
SI=1;
else
SI=0;
cod<<=1;
SK=0;
for(i=0;i<10;i++){;}
SK=1;
for(i=0;i<10;i++){;}
}
// printf(" 输出 input digtial :%d\n",cod);
for(i=0;i<10;i++){;}
SI=0;
SK=0;
for(i=0;i<10;i++){;}
SK=1;
for(i=0;i<10;i++){;}
SI=0;
SK=0;
for(i=0;i<10;i++){;}
SK=1;
// msdelay(200);
FS=1;
CS5604=1;
// msdelay(50);
// for(i=0;i<200;i++){;}
}
//-----------------------------------------------------
//延时函数
//-----------------------------------------------------
void msdelay(int i)
{
int m;
for(m=0;m<i;m++){;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -