#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()
//调用
按键响应
函数
}
}
方波输出接口接灯;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)