|
楼主 |
发表于 2013-9-19 12:10:25
|
显示全部楼层
#include "stc12c5a60s2.h" /*stc12c5a60s2.h为STC12C5A60S2单片机寄存器定义头文件*/
#include<intrins.h> //_nop_()延时函数的头文件
//定义位变量,ADS8363的控制引脚功能名定义
sbit M1 = P0^4;
sbit M0 = P0^5;
sbit SDI = P0^6;
sbit CONVST = P0^7;
sbit RD = P4^6;
sbit CS = P4^1;
sbit CLOCK = P4^5;
sbit BUSY = P4^4;
sbit SDOA = P5^0;
sbit SDOB = P5^1;
sbit LED=P4^2;
/***********************各子程序的声明***********************/
void delay(long delaytime);
void ADS_read();
void ADS_init();
void Uart2_Init();
void Uart2_Send_Data(unsigned char Buf);
void Delay_ms(unsigned int ms);
unsigned char xdata ADDRT[256];
unsigned int dater;
unsigned char ad_result_data1; //AD转换高八位
unsigned char ad_result_data2; //AD转换低八位
int i=0;
/***********************主程序***********************/
void main(void)
{
Uart2_Init();
while(1)
{
ADS_read();
Uart2_Send_Data(ad_result_data1);
Uart2_Send_Data(ad_result_data2);
}
}
/***********************延时函数子程序***********************/
/*
void delay(long delaytime)
{
while(delaytime>0)delaytime--;//子函数的实现代码
}
*/
/***********************ADS8363读数据子程序***********************/
void ADS_read()
{
ad_result_data1=0xFF;
ad_result_data2=0xFF;
CS=0;
CLOCK=1; //时钟线置为高电平,该条指令占用一个时钟周期
CS=0; //指令需要占用一个时钟周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //到此为半个时钟周期
CLOCK=0; //时钟线置低
CONVST=1; //CONVST置高
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //到此为一个时钟周期
CLOCK=1;
RD=1; //RD置为高电平
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //到此为半个时钟周期
CLOCK=0;
CONVST=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //到此为一个时钟线周期,即8个执行周期
CLOCK=1;
RD=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //到此为一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data1=ad_result_data1<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data1=ad_result_data1&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
ad_result_data2=ad_result_data2<<1; //1个执行周期
//MOV A,0X09 1个执行周期
//ADD A,ACC(0XE0) 1个执行周期
//MOV 0X09,A 1个执行周期
//MOV A,dater(0x08) 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//MOV dater(0x08),A 1个执行周期
_nop_(); //"_nop_()"指令需要占用一个时钟周期
CLOCK=0;
ad_result_data2=ad_result_data2&SDOA;
/*下面是该条对应的汇编指令*/
//MOV C,SODA(0xC8.0) 1个执行周期
//CLR A 1个执行周期
//RLC A 1个执行周期,带进位循环左移
//ANL 0x0D,A 1个执行周期
//CLR A 1个执行周期
//MOV DATER(OxOC),A 1个执行周期
_nop_();
CLOCK=1;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=1;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=1;
RD=1;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=0;
CONVST=1;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=1;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=0;
CONVST=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=1;
RD=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CLOCK=0;
_nop_(); //"_nop_()"指令需要占用一个时钟周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CS=1;
}
/***********************ADS8363初始化子程序***********************/
/*
void ADS_init()
{
}
/*********************************************************************/
/***********************************************
函数名称:Uart2_Init
功 能:串口2初始化函数
入口参数:无
返 回 值:无
备 注:
以下是Fosc=11.0592MHz,左侧为12T模式, 右侧为1T模式, SMOD=0时的自动重装数和波特率
RELOAD_COUNT=0xff Baud=28,800 bps
RELOAD_COUNT=0xfe Baud=14,400 bps
RELOAD_COUNT=0xfd Baud=9,600 bps Baud=115,200bps
RELOAD_COUNT=0xfa Baud=4,800 bps
RELOAD_COUNT=0xf4 Baud=2,400 bps
RELOAD_COUNT=0xe8 Baud=1,200 bps
STC12C5A60S2单片机串口2只能选择独立的波特率发生器,不能使用定时器1做为波特率发生器
************************************************/
void Uart2_Init(void)
{
S2CON=0x50; //0101 0000 模式1: 1 位起始位; 8 位数据; 1 位停止位;允许接收
BRT=0xfd; //波特率9600
AUXR=0x11; //串口选择独立波特率发生器,并且启动发生器
}
/***********************************************
函数名称:Uart2_Send_Data
功 能:串口2发送数据函数
入口参数:无
返 回 值:无
备 注:无
************************************************/
void Uart2_Send_Data(unsigned char Buf) //串口2发送数据子程序入口,这里不使用中断
{
//根据需要填入程序代码,注意中断请求标志的清零
//-------------------------串口2的接收中断请求清零方式方式----------------------
//因为串口2的控制寄存器S2CON不能直接位寻址(串口1可以直接位寻址)
// S2CON=S2CON & 0xfe; //清零S2TI
S2BUF=Buf;
while(!(S2CON&0x02));
S2CON=S2CON & 0xfd; //清零S2TI
Delay_ms(500);
}
/***********************************************
函数名称:Delay_ms
功 能:STC 1T单片机1ms延时程序
入口参数:ms:延时的毫秒数
返 回 值:无
备 注:示波器实测1.05ms 外部时钟11.0592MHz
************************************************/
void Delay_ms(unsigned int ms)
{
unsigned int i;
while( (ms--) != 0)
{
for(i = 0; i < 600; i++);
}
}
|
|