久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
MSP430G2553測(cè)信號(hào)頻率在LCD1602顯示源代碼
[打印本頁]
作者:
CrankRong
時(shí)間:
2018-4-7 20:54
標(biāo)題:
MSP430G2553測(cè)信號(hào)頻率在LCD1602顯示源代碼
MSP430G2553測(cè)信號(hào)頻率在LCD1602顯示代碼,自制,精度較好。
單片機(jī)源程序如下:
#include <msp430.h>
#include "stdint.h"
#include "LCD1602.h"
#include <math.h>
volatile double voltage = 0;
volatile double frequence = 0;
volatile uint8_t flag = 0;
volatile double virtual_fact_plus = 0.0;
volatile double virtual_fact = 0.0;
volatile uint16_t TAcnt = 0;
volatile uint16_t cnt = 0;
volatile uint16_t adcvalue = 0;
volatile uint16_t adcvalueMax = 0;
volatile uint16_t adcvalueMin = 0;
volatile uint32_t cap = 0;
volatile double virtual_ideal_sine = 0.0;
volatile double virtual_ideal_tri = 0.0;
volatile uint16_t num = 0;
volatile uint32_t timestamp = 0;
volatile uint32_t time = 0;
void PrintVoltage(double voltage);
/*函數(shù)聲明*/
void InitSystemClock(void);
void InitADC(void);
void InitTimer_A1(void);
void GetVpp(void);
void GetFreq(void);
void GetVirtual(void);
void tell_Rec(void);
uint32_t GetCurrentTime(void);
void Enable_P1_3(void);
void InitUART(void);
void UARTSendString(uint8_t *pbuff,uint8_t num);
void PrintVoltage(double voltage);
void PrintFreq(double freq);
/*
* @fn: void InitSystemClock(void)
* @brief: 初始化系統(tǒng)時(shí)鐘
* @para: none
* @return: none
* @comment:初始化系統(tǒng)時(shí)鐘
*/
void InitSystemClock(void)
{
/*配置DCO為1MHz*/
DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
/*配置SMCLK的時(shí)鐘源為DCO*/
BCSCTL2 &= ~SELS;
/*SMCLK的分頻系數(shù)置為1*/
BCSCTL2 &= ~(DIVS0 | DIVS1);
}
/*
* @fn: void InitADC(void)
* @brief: 初始化ADC
* @para: none
* @return: none
* @comment:初始化ADC
*/
void InitADC(void)
{
/*設(shè)置ADC時(shí)鐘MCLK*/
ADC10CTL1 |= ADC10SSEL_2;
/*ADC 2分頻*/
ADC10CTL1 |= ADC10DIV_0;
/*設(shè)置ADC基準(zhǔn)源*/
ADC10CTL0 |= SREF_1;
/*設(shè)置ADC采樣保持時(shí)間64CLK*/
ADC10CTL0 |= ADC10SHT_2;
/*設(shè)置ADC采樣率200k*/
ADC10CTL0 &= ~ADC10SR;
/*ADC基準(zhǔn)選擇2.5V*/
ADC10CTL0 |= REF2_5V;
/*開啟基準(zhǔn)*/
ADC10CTL0 |= REFON;
/*選擇ADC輸入通道A0*/
ADC10CTL1 |= INCH_0;
/*允許A0模擬輸入*/
ADC10AE0 |= BIT0;
/*開啟ADC*/
ADC10CTL0 |= ADC10ON;
}
/*
* @fn: void InitTimer_A1(void)
* @brief 初始化Timer_A1進(jìn)行計(jì)數(shù)
* @para: none
* @return: none
* @comment:初始化Timer_A1
*/
void InitTimer_A1(void)
{
/*設(shè)置時(shí)鐘源為SMCLK*/
TA1CTL |= TASSEL_2;
/*設(shè)置工作模式為Up Mode*/
TA1CTL |= MC_1;
/*設(shè)置定時(shí)間隔*/
TA1CCR0 = 49999;// 50ms 1MHz 1/1MHz 1ns 50ms / 1ns = 50000 50000 - 1 = 49999
/*開啟TAIFG中斷*/
TA1CTL |= TAIE;
}
/*計(jì)算峰峰值*/
void GetVpp(void)
{
for(cnt = 0; cnt < 10000; cnt ++)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
if(adcvalueMax < ADC10MEM)
adcvalueMax = ADC10MEM;
if(adcvalueMin > ADC10MEM)
adcvalueMin = ADC10MEM;
}
voltage = (adcvalueMax - adcvalueMin) * 2.5 / 1023;
}
/*計(jì)算波形頻率*/
void GetFreq(void)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
while(fabs((double)(adcvalueMax - ADC10MEM)) > 20)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
}
timestamp = GetCurrentTime();
while(num < 1000)
{
while(fabs((double)(ADC10MEM - adcvalueMin)) > 100)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
}
while(fabs((double)(adcvalueMax - ADC10MEM)) > 100)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
}
num ++;
}
num = 0;
time = GetCurrentTime() - timestamp;
/*計(jì)算信號(hào)頻率*/
frequence = 16000000000.0 / (float)(GetCurrentTime() - timestamp);
}
/*計(jì)算有效值*/
void GetVirtual(void)
{
virtual_fact_plus = 0.0;
for(cnt = 0; cnt < 10000; cnt ++)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
virtual_fact_plus += pow((ADC10MEM * 2.5 / 1023), 2);
}
virtual_fact = sqrt(virtual_fact_plus / 10000);
}
/*判斷方波*/
void tell_Rec(void)
{
for(cnt = 0; cnt < 10000; cnt ++)
{
/*開始轉(zhuǎn)換*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待轉(zhuǎn)換完成*/
while(ADC10CTL1&ADC10BUSY);
if(fabs((double)(ADC10MEM - adcvalueMin)) < 100 || fabs((double)(adcvalueMax - ADC10MEM)) < 100)
num ++;
__delay_cycles(100);
}
if(num > 9800)
flag = 2; //方波
else if(2 == flag) flag = 0;
num = 0;
}
/*
* @fn: uint32_t GetCurrentTime(void)
* @brief: 得到當(dāng)前計(jì)時(shí)器計(jì)數(shù)大小
* @para: none
* @return: currenttime = cnt * 50000 + TA1CCR2
* @comment:得到當(dāng)前計(jì)時(shí)器計(jì)數(shù)大小
*/
uint32_t GetCurrentTime(void)
{
return((uint32_t)(TAcnt * 50000 + TA1R));
}
/*
* @fn: void Enable_P1_3(void)
* @brief: 使能P1.3口中斷
* @para: none
* @return: none
* @comment:使能P1.3口中斷
*/
void Enable_P1_3(void)
{
P1DIR &= ~BIT3;
/*使能P1.3口的上拉電阻*/
P1REN |= BIT3;
P1OUT |= BIT3;
/*打開P1.3口中斷*/
P1IE |= BIT3;
/*設(shè)定為下降沿觸發(fā)*/
P1IES |= BIT3;
/*清除中斷標(biāo)志位*/
P1IFG &= ~BIT3;
}
void InitUART(void)
{
/*復(fù)位USCI_Ax*/
UCA0CTL1 |= UCSWRST;
/*選擇USCI_Ax為UART模式*/
UCA0CTL0 &= ~UCSYNC;
/*配置UART時(shí)鐘源為SMCLK*/
UCA0CTL1 |= UCSSEL1;
/*配置波特率為9600@1MHz*/
UCA0BR0 = 0x68;
UCA0BR1 = 0x00;
UCA0MCTL = 0x31;
/*使能端口復(fù)用*/
P1SEL |= BIT1 + BIT2;
P1SEL2 |= BIT1 + BIT2;
/*清除復(fù)位位,使能UART*/
UCA0CTL1 &= ~UCSWRST;
}
/*
* @fn: void UARTSendString(uint8_t *pbuff,uint8_t num)
* @brief: 通過串口發(fā)送字符串
* @para: pbuff:指向要發(fā)送字符串的指針
* num:要發(fā)送的字符個(gè)數(shù)
* @return: none
* @comment:通過串口發(fā)送字符串
*/
void UARTSendString(uint8_t *pbuff,uint8_t num)
{
uint8_t cnt = 0;
for(cnt = 0;cnt < num;cnt ++)
{
while(UCA0STAT & UCBUSY);
UCA0TXBUF = *(pbuff + cnt);
}
}
/*
* @fn: void PrintFloat(float num)
* @brief: 通過串口發(fā)送電壓,單位為V,保留兩位小數(shù)
* @para: voltage:電壓
* @return: none
* @comment:通過串口發(fā)送浮點(diǎn)數(shù),可發(fā)送1位整數(shù)位+3位小數(shù)位
*/
void PrintVoltage(double voltage)
{
uint8_t charbuff[] = {0, '.', 0, 0, 0};
uint16_t temp = (uint16_t)(voltage * 1000);
charbuff[0] = (uint8_t)(temp / 1000) + '0';
charbuff[2] = (uint8_t)((temp % 1000) / 100) + '0';
charbuff[3] = (uint8_t)((temp % 100) / 10)+ '0';
charbuff[4] = (uint8_t)(temp % 10) + '0';
UARTSendString(charbuff, 5);
UARTSendString("V\n", 2);
}
/*
* @fn: void PrintFreq(float freq)
* @brief: 通過串口發(fā)送頻率,單位為Hz,保留兩位小數(shù)
* @para: freq:頻率
* @return: none
* @comment:通過串口發(fā)送頻率
*/
void PrintFreq(double freq)
{
uint32_t temp = (uint32_t)(freq);
uint8_t charbuff[] = {0, 0, 0, 0, 0};//最大999999.99Hz
int8_t cnt = 0;
for(cnt = 4; cnt >= 0; cnt --)
{
charbuff[cnt] = (uint8_t)(temp % 10) + '0';
temp /= 10;
}
UARTSendString("frequence = ", 12);
UARTSendString(charbuff, 2);
UARTSendString(".", 1);
UARTSendString(charbuff + 2, 3);
UARTSendString("kHz\n", 4);
}
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
InitSystemClock();
InitADC();
InitTimer_A1(); //計(jì)數(shù)
InitUART();
delay_nms(10);
Print_Name();
Enable_P1_3();
__bis_SR_register(GIE);/*打開全局中斷*/
while(1)
{
num = 0;
GetVpp();
if(fabs((double)(adcvalueMax - adcvalueMin)) < 50)
{
flag = 1; //直流
frequence = 0.0;
}
else if(1 == flag) flag = 0;
if(1 != flag)
{
GetFreq();
if(frequence < 0.1)
frequence = 150.0;
else frequence -= frequence * 135.0 / 10000.0;
TAcnt = 0;
}
GetVirtual();
tell_Rec();
if(2 != flag && 1 != flag)
{
virtual_ideal_sine = sqrt(pow((adcvalueMax + adcvalueMin) * 2.5 / 2046, 2) + (pow(voltage / 2, 2) / 2));
virtual_ideal_tri = sqrt((pow(adcvalueMax * 2.5 / 1023, 2) + pow(adcvalueMin * 2.5 / 1023, 2) + adcvalueMax * adcvalueMin * 6.25 / pow(1023, 2)) / 3);
if(fabs(virtual_fact - virtual_ideal_sine) < 0.02)
flag = 3; //正弦波
else if(fabs(virtual_fact - virtual_ideal_tri) < 0.02)
flag = 4;
else flag = 0;
}
/*switch(flag)
{
case 0:UARTSendString("unknown type\n", 13); break;
case 1:UARTSendString("Direct\n", 7); break;
case 2:UARTSendString("Rectangle\n", 10); break;
case 3:UARTSendString("Sine\n", 5); break;
case 4:UARTSendString("Triangle\n", 9); break;
default: break;
}
UARTSendString("Vpp = ", 6);
PrintVoltage(voltage);
PrintFreq(frequence);
PrintVoltage(virtual_fact);
delay_nms(1000);
*/
}
return 0;
}
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Time_Tick(void)
{
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
Wave-Detect.rar
(92.52 KB, 下載次數(shù): 71)
2018-4-7 20:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
ljt16
時(shí)間:
2018-4-20 02:57
這個(gè)把串口程序也加進(jìn)去為什么build 工程時(shí)為什么會(huì)報(bào)錯(cuò)呢
作者:
ljt16
時(shí)間:
2018-4-20 03:57
這個(gè)是從msp430g2553p1.0輸入嗎,為什么串口發(fā)送數(shù)據(jù)顯示不出來
作者:
李軒昂
時(shí)間:
2018-7-20 20:27
ljt16 發(fā)表于 2018-4-20 03:57
這個(gè)是從msp430g2553p1.0輸入嗎,為什么串口發(fā)送數(shù)據(jù)顯示不出來
現(xiàn)在解決了嗎
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
四虎网站
|
国产传媒av
|
波多野吉衣一二三区乱码
|
亚洲天堂2014
|
日本伊人久久
|
日本一级大毛片a一
|
亚洲伊人av
|
男女瑟瑟视频
|
激情婷婷综合
|
国产成人福利
|
91亚色视频
|
99re久久
|
亚洲第一色网
|
国产精品一区二区在线播放
|
欧美日韩一区在线观看
|
一区二区网站
|
国产欧美日韩在线
|
激情视频一区
|
国产成人在线免费视频
|
不卡视频一区二区
|
国产成人精品亚洲男人的天堂
|
91欧美激情一区二区三区成人
|
欧洲精品一区
|
久草福利
|
黄色免费网站视频
|
国产精品久久久久久久久久久久久
|
亚洲激情综合
|
天天色天天
|
我要看一级黄色片
|
日韩亚洲在线
|
亚洲欧美在线观看
|
亚洲福利网
|
成人综合婷婷国产精品久久
|
99视频精品
|
国产精品二区一区二区aⅴ污介绍
|
一区二区日韩
|
中文久久久
|
国产老头视频
|
亚洲激情综合
|
亚洲精品免费观看
|
国产97视频
|