标题:
STC12C5A60S2自带AD与TL5615DA转换芯片完成AD/DA转换Keil程序(模拟串口发送)
[打印本页]
作者:
awer
时间:
2019-1-12 10:19
标题:
STC12C5A60S2自带AD与TL5615DA转换芯片完成AD/DA转换Keil程序(模拟串口发送)
/******************************************/
/************* 用户系统配置 **************/
#define MAIN_Fosc 22118400L //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ
/************* 以下宏定义用户请勿修改 **************/
#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int
/******************************************/
sfr P1ASF = 0x9D; //12C5204AD/S2系列模拟输入(AD或LVD)选择
sfr ADC_CONTR = 0xBC; //带AD系列
sfr ADC_RES = 0xBD; //带AD系列
sfr ADC_RESL = 0xBE; //带AD系列
// 7 6 5 4 3 2 1 0 Reset Value
//sfr ADC_CONTR = 0xBC; ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000 //AD 转换控制寄存器
#define ADC_OFF() ADC_CONTR = 0
#define ADC_ON (1 << 7)
#define ADC_90T (3 << 5)
#define ADC_180T (2 << 5)
#define ADC_360T (1 << 5)
#define ADC_540T 0
#define ADC_FLAG (1 << 4) //软件清0
#define ADC_START (1 << 3) //自动清0
#define ADC_CH0 0
#define ADC_CH1 1
#define ADC_CH2 2
#define ADC_CH3 3
#define ADC_CH4 4
#define ADC_CH5 5
#define ADC_CH6 6
#define ADC_CH7 7
/************* 本地变量声明 **************/
sbit P_TXD1 = P3^1;
/************* 本地函数声明 **************/
void Tx1Send(uchar dat);
void PrintString(unsigned char code *puts);
void delay_ms(unsigned char ms);
uchar GetAdc8(uchar channel); //channel = 0~7
void TX_ADC(uchar chn, uchar adc)
{
Tx1Send('A');
Tx1Send('D');
Tx1Send(chn+'0');
Tx1Send('=');
Tx1Send(adc / 100 + '0');
Tx1Send(adc % 100 / 10 + '0');
Tx1Send(adc % 10 + '0');
Tx1Send(0x0d);
Tx1Send(0x0a);
}
/********************* 主函数 *************************/
/********************* 做一次ADC转换 *******************/
uchar GetAdc8(uchar channel) //channel = 0~7
{
uchar i;
ADC_RES = 0;
ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
for(i=0; i<250; i++) //13T/loop, 40*13=520T=23.5us @ 22.1184M
{
if(ADC_CONTR & ADC_FLAG)
{
ADC_CONTR &= ~ADC_FLAG;
return ADC_RES;
}
}while(--i);
return 0; //错误
}
//========================================================================
// 函数: void delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数.
// 返回: none.
// 版本: VER1.0
// 日期: 2010-12-15
// 备注:
//========================================================================
void delay_ms(unsigned char ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 14000;
while(--i) ; //14T per loop
}while(--ms);
}
/********************** 模拟串口相关函数************************/
void BitTime(void) //位时间函数
{
uint i;
i = ((MAIN_Fosc / 100) * 104) / 140000L - 1; //根据主时钟来计算位时间
while(--i);
}
//模拟串口发送
void Tx1Send(uchar dat) //9600,N,8,1 发送一个字节
{
uchar i;
EA = 0;
P_TXD1 = 0;
BitTime();
for(i=0; i<8; i++)
{
if(dat & 1) P_TXD1 = 1;
else P_TXD1 = 0;
dat >>= 1;
BitTime();
}
P_TXD1 = 1;
EA = 1;
BitTime();
BitTime();
}
void PrintString(unsigned char code *puts) //发送一串字符串
{
for (; *puts != 0; puts++) Tx1Send(*puts); //遇到停止符0结束
}
复制代码
#include "ad.h"
#include "da.h"
#include <reg51.h>
void main(void)
{
double j;
PrintString("****** STC12C5204AD系列ADC程序 2011-02-27 ******\r\n"); //上电后串口发送一条提示信息
// P1ASF = ((1 << ADC_CH0) + (1 << ADC_CH1) + (1 << ADC_CH2)); //12C5204AD系列模拟输入(AD)选择
P1ASF = ((1 << ADC_CH0) + (1 << ADC_CH6) + (1 << ADC_CH7)); //12C5204AD系列模拟输入(AD)选择
ADC_CONTR = ADC_360T | ADC_ON;
while(1)
{
delay_ms(250); //1秒转换1次
delay_ms(250);
delay_ms(250);
delay_ms(250);
/*
GetAdc8(0); // P1.0 ADC, 丢弃
j = GetAdc8(0); // P1.0 ADC
TX_ADC(0,j);
// GetAdc8(1); // P1.1 ADC, 丢弃
// j = GetAdc8(1); // P1.1 ADC
// TX_ADC(1,j);
GetAdc8(6); // P1.1 ADC, 丢弃
j = GetAdc8(6); // P1.1 ADC
TX_ADC(6,j);
// GetAdc8(2); // P1.2 ADC, 丢弃
// j = GetAdc8(2); // P1.2 ADC
// TX_ADC(2,j);
GetAdc8(7); // P1.1 ADC, 丢弃
j = GetAdc8(7); // P1.1 ADC
TX_ADC(7,j);
Tx1Send(0x0d);
Tx1Send(0x0a);
*/
GetAdc8(6); // P1.1 ADC, 丢弃
j = GetAdc8(6); // P1.1 ADC
j=j*5.0/256.0;
PLC5615_writeV(j);
}
}
这是主函数的部分,有字数限制,发不了那么多啊
全部资料51hei下载地址:
AD与DA直接转.zip
(42.05 KB, 下载次数: 43)
2019-1-12 10:17 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
hxszrb
时间:
2020-2-13 22:05
学习来的,感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1