g2553的AD转换的程序怎么写啊,居然是10位的,找了好多程序都不对。。

g2553的AD转换的程序怎么写啊,居然是10位的,找了好多程序都不对。。,第1张

#include <msp430g2553.h>

#include "12864.h"

float temp

float voltage

void main(void)

{

unsigned char s1[] ={"宝鸡文理学院"}

unsigned char s2[] ={"MSP430GLAUNCHPAD"}

unsigned char s3[] ={"测得当前峰峰值:"}

unsigned char s4[] ={"V"}

WDTCTL = WDTPW+WDTHOLD// 停止看门狗定时器

P2SEL=0x00//p2.6和p2.7管教默认的山胡第一功能是外部晶体振荡器的接口,设置第二功能-通用IO口

P2DIR |= BIT6+BIT7//设置P2.6,P2.7位输出

P1SEL = 0x01//将IO选择为AD输入

P1DIR = 0

/饥拍*将内部DCO校准至1MHz*/

BCSCTL1 |= CALBC1_1MHZ

DCOCTL |= CALDCO_1MHZ

BCSCTL2 |= SELM_0//MCLK采用1M的内部DCO

BCSCTL2 |= DIVS_2//SMCLK采用250K的时钟

init_lcd()

delay_ms(10)

wr_string(1,0,s1)//写参数格式:wr_string(uchar x,uchar y,uchar *p)

wr_string(0,1,s2)

wr_string(0,2,s3)

ADC10CTL0 |= SREF_1+REF2_5V+REFON+ADC10IE//将AD10基准设置为2.5V 开启AD允许中断

ADC10CTL0 |= ADC10SHT_0+MSC//打开AD转换,过采样率设置为4个采样周期

ADC10CTL1 |= ADC10SSEL_3+SHS_0//选择250K的采样时钟,用ADC10SC触发采集

ADC10CTL1 |= CONSEQ_2+INCH_0//采样模式,通道0

ADC10CTL0 |= ADC10ON

ADC10AE0 |= 0xFF

ADC10CTL0 |= ADC10SC+ENC

_EINT()//允许中断

while(1)

{

float max[10]

float ma=0.

float dave=0

uint i,j

delay_ms(50)

ADC10CTL0 |= ENC+ADC10SC

for(j=0j<10j++)

{

for(i=0i<500i++)

{

temp = ADC10MEM

voltage = temp*25/10230//计算采集到的电压

if(ma<=voltage)

{

ma = voltage//取烂唯羡峰值电压

}

max[j] = ma

}

dave += max[j]/10//求平均值

}

wr_float(1,3,dave)

wr_string(5,3,s4)

}

}

//AD中断服务程序

#pragma vector=ADC10_VECTOR

__interrupt void ADC10_ISR (void)

{

__bic_SR_register_on_exit(LPM0_bits)//将SR里的CPUOFF位置0

}

//定时器输出单元

#pragma vector=TIMER0_A0_VECTOR

__interrupt void ta0_isr(void)

{

TACTL = 0

__bic_SR_register_on_exit(LPM0_bits)//将SR里的CPUOFF位置0

}

#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

}

/**52系列单片机,晶振12MHz,P1.0输出100Hz方波(即周期10ms),方波由T0定时器产生

P1.3接按键

K1,每按一次按键,方波占空比改变一次,依次为:1/10→2/10→……→9/10→1/10,如此循环**/

#include"reg52.h"

//包含52系列头文件

#define

uchar

unsigned

char

//定义

无符号字符型

#define

uint

unsigned

int

//定义

无符号整型

#define

TRUE

1

//定义

逻辑真

#define

FALSE

0

//定义

逻辑假

#define

th0

0xfc

//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为

1ms

#define

tl0

0x18

//1ms

at

12HMz

Fosc

#define

DutyDeno

10

//定义

占空比分母

为:10

sbit

WaveOut=P1^0

//定义

方波输出

接口

sbit

Key1=P1^3

//定义

按键Key1

接口

uchar

DutyNume=1

//定义

占空比分子

变量,并初始化为

1(即

占空比

为:1/10)

void

Timer0()

interrupt

1

//定时器T0

中断

函数

{

static

uchar

duty_time=0

//定义静态变量,作为

占空比

输出时间的参考值(1ms)

TL0=tl0

TH0=th0

//重赋定时器初值,1ms

duty_time=++duty_time%DutyDeno

//该句等效于:duty_time++duty_time%=DutyDeno

if(duty_time<DutyDeno)

WaveOut=1

//若计时时间小于

占空比分子,则输出应为

高电平

else

WaveOut=0

//若计时时间大于

占空比分子,则输出应为

低电平

}

void

TimerInit()

//定时器初始化

函数

{

TMOD=0x01

//T0

16位定时器

EA=1

//唤棚允许系统中断

ET0=1

//允许T0中断

TH0=th0

TL0=tl0

//1ms

初值

TR0=1

//T0开始计时

}

void

KeyResp()

//按键响应

函数

{

static

bit

KeyDownFlag,KeyReadyFlag

//定义

静态标志位,KeyDownFlag

按键按下标志,KeyReadyFlag

按键准备(响应)标志

if(!Key1)

//若按键Key1

被按下

{

KeyDownFlag=TRUE

//按键按下标志薯销

置位

KeyReadyFlag=TRUE

//按键准备标志

置位

}

else

KeyDownFlag=FALSE

//若按键Key1

无按下,则清空

按键按下标志

if(!KeyDownFlag

&&

KeyReadyFlag)

//若

按键已准备,且按键无按下(即

松手状态)

{

DutyNume++

//占空比分子

加1

if(DutyNume==DutyDeno)

DutyNume=1

//若

占空比分子=分母,则返回

1

KeyReadyFlag=FALSE

//按键处理完毕,清

按键准备标志

}

}

void

main()

//主函数

{

TimerInit()

//调用

定时和手则器初始化

函数

while(1)

//循环系统

{

KeyResp()

//调用

按键响应

函数

}

}

方波输出接口接灯;


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

原文地址: https://outofmemory.cn/yw/12479869.html

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

发表评论

登录后才能评论

评论列表(0条)

保存