STC 12C5204AD 数据采集,串口发送;接受数据,显示至屏幕上

STC 12C5204AD 数据采集,串口发送;接受数据,显示至屏幕上,第1张

* ------------------------- 宏晶科技 04/15/2009 -------------------- */

/* --------------------Mobile:0755-82948412,13922805190---------------- */

// 本程序演示 STC12C5AxxAD 系列 MCU 的 A/D 转换功能。时钟 18.432MHz

// 转换结果以 16 进制形式输出到串行口,可以用串行银码芦口调试程序观察输出结果。

//---------------------------------------------------------------------

//#include <REG52.H>

#include <intrins.H>

#include "NEW_8051.H"

//---------------------------------------------------------------------

typedefunsigned char uchar

typedefunsigned intuint

//---------------------------------------------------------------------

//以下选择 ADC 转换速率,只能选择其中一种

//SPEED1 SPEED0 A/D转换所需时间

#define AD_SPEED 0x60 // 0110,0000 1 1 70 个时钟周期转换一次,

//模州 CPU工作频率21MHz时 A/D转换速度约 300KHz

//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次

//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次

//#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次

//---------------------------------------------------------------------

void initiate_RS232 (void)//串口初始化

void Send_Byte(uchar one_byte)//发送一个字节

uchar get_AD_result(uchar channel)

void delay(uchar delay_time) //延时函数

/锋带/---------------------------------------------------------------------

void main()

{

uint ADC_result

initiate_RS232() //波特率 = 115200

P1ASF = 0x02 //0000,0010, 将 P1.1 置成模拟口

//ADRJ = AUXR1^2:

//0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器

//1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

AUXR1 &= ~0x04//0000,0100, 令 ADRJ=0

//AUXR1 |= 0x04 //0000,0100, 令 ADRJ=1

ADC_CONTR |= 0x80 //1000,0000 打开 A/D 转换电源

while(1)

{

ADC_result = get_AD_result(1)//P1.1 为 A/D 当前通道, 测量并发送结果

Send_Byte(0xAA) //为便于观察, 发送 2 个 0xAA

Send_Byte(0xAA)

Send_Byte(ADC_result)

delay(0x1)

}

}

//---------------------------------------------------------------------

void delay(uchar delay_time)// 延时函数

{

uint n

while(delay_time--)

{

n = 6000

while(--n)

}

}

//---------------------------------------------------------------------

#define Fosc 18432000

#define BAUD 115200 //波特率

#define RELOAD_115200 (256 - (Fosc/16*10/BAUD+5)/10 ) //1T模式, 波特率加倍

#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快 12 倍

#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器 BRT 计数。

void initiate_RS232 (void) //串口初始化

{

ES = 0//禁止串口中断

SCON = 0x50 //可变波特率. 8位无奇偶校验

AUXR |= 0x01 //使用独立波特率发生器

PCON |= 0x80 //波特率加倍

BRTx12_enable() //BRT 独立波特率发生器的溢出率快 12 倍

BRT = RELOAD_115200 //设置独立波特率发生器 BRT 的自动重装数

BRT_start() //启动独立波特率发生器 BRT 计数。

ES = 1

}

//---------------------------------------------------------------------

void Send_Byte(uchar one_byte) //发送一个字节

{

TI = 0//清零串口发送中断标志

SBUF = one_byte

while (TI == 0)

TI = 0//清零串口发送中断标志

}

//---------------------------------------------------------------------

uchar get_AD_result(uchar channel)

{

uchar AD_finished=0 //存储 A/D 转换标志

ADC_RES = 0

ADC_RESL = 0

channel &= 0x07 //0000,0111 清0高5位

ADC_CONTR = AD_SPEED

_nop_()

ADC_CONTR |= channel //选择 A/D 当前通道

_nop_()

ADC_CONTR |= 0x80 //启动 A/D 电源

delay(1) //使输入电压达到稳定

ADC_CONTR |= 0x08 //0000,1000 令 ADCS = 1, 启动A/D转换,

AD_finished = 0

while (AD_finished ==0 )//等待A/D转换结束

{

AD_finished = (ADC_CONTR &0x10)//0001,0000 测试A/D转换结束否

}

ADC_CONTR &= 0xE7 //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,

return (ADC_RES) //返回 A/D 高 8 位转换结果

}

#include "stc2052.h"

#include "main.h"

void ADC_init(void)

void del(INT8U x)

void uart_init(void)

void PutHex(INT8U *cp,INT8U len)

void ADC_SPI_Routine(void)

void Putstr(char *cs)

/*用悄历的是5406,12M晶体,波特率不能太大,用2400,

实验过程是 在P1.6脚 接2.5v电压,开AD 读到最终值是80H,7FH 左右*/

void main()

{

EA=0

P1M0=0x40

P1M1=0x00//表示第P1.6作为AD输入

EA=1

uart_init()

ADC_init()

while(1){

del(100)

uart_s_buf[0] = ADC_DATA

uart_s_buf[1]=0x23

PutHex(uart_s_buf,2)

del(1000)

}

}

void ADC_init(void)

{

ADC_CONTR |= 0x06

ADC_CONTR |= 0x80//开启ADC电源

del(1)

ADC_CONTR |= 0x08//启动AD

AUXR |= 0x10

EADC_SPI = 1

}

void del(INT8U yj)

{

INT8U yj2=5000

while(yj!=0)

{

while(yj2!=0)

{

yj2--

}

yj2=1000

yj--

}

}

void uart_init(void)

{

SCON = 0x50

//SCON: mode 1,8-bit UART, enable rcvr

AUXR = 0x80 // 作在1T模式

// PCON = 0x80 // 加速

TMOD = 0x20 //* TMOD: timer 1,mode 2,8-bit reload TL0 NO USED

TH1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */

TL1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */

// ES = 1 /* Enable serial interrupt*/

TR1 = 1

/* Timer 1 run */

}

void PutHex(INT8U *cp,INT8U len)

{

ES=0

TI= 0

while(len--)

{

SBUF=*cp

cp++

while(TI==0) //等待发送结束,死循环,如果TI==0,则死循环,如果TI==1,则执行下条。 同while(TI==0){}

TI=0

}

ES=0

}

void Putstr(char *cs)

{

TI=0

while(*cs) /* 例如 :指向数组的指针,例如

int b[10]

int *a = b

a就是b[0]的地址*a就是b[0]的内容

a+1就是b[1]的地址依此类推

又如char *a = "hank"

那么通过a就能得到整个字符串"hank"

*a是h

*(a+1)是a 所以发送完k后 就是(*cs==0)0了,那启余搜就跳毁没出循环 */

{

SBUF=*cs

cs++

while(TI==0)

TI=0

}

}

void ADC_SPI_Routine(void) interrupt 5

{

EADC_SPI = 0

ADC_CONTR |= 0x08 //ADC_START启动

ADC_CONTR &= 0xef //ADC_FLAG清零

EADC_SPI = 1

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12308386.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存