找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5255|回復(fù): 3
收起左側(cè)

stm8s單片機(jī)簡(jiǎn)易1kHz至1MHz方波信號(hào)頻率計(jì)源碼

[復(fù)制鏈接]
ID:312538 發(fā)表于 2018-6-7 09:43 | 顯示全部樓層 |閱讀模式
小王子實(shí)戰(zhàn)@簡(jiǎn)易1kHz至1MHz方波信號(hào)頻率計(jì)

/***********************************************************
* 實(shí)驗(yàn)名稱及內(nèi)容:簡(jiǎn)易1kHz至1MHz方波信號(hào)頻率計(jì)
* 配套書籍:《深入淺出STM8單片機(jī)入門、進(jìn)階與應(yīng)用實(shí)例》
* 實(shí)驗(yàn)平臺(tái)及編程人員:思修電子工作室"祥云小王子"開發(fā)版 Long
***************************************************************/
#include "iostm8s208mb.h"//主控芯片的頭文件
/************************常用數(shù)據(jù)類型定義**********************/
#define u8  uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char    uint8_t;
typedef unsigned short   uint16_t;
typedef unsigned long    uint32_t;
/***********************端口/引腳定義區(qū)域**********************/
#define  LCDRS          PF_ODR_ODR0     //LCD1602數(shù)據(jù)/命令選擇端口
#define  LCDRW          PF_ODR_ODR3     //LCD1602讀寫控制端口
#define  LCDEN          PF_ODR_ODR4     //LCD1602使能信號(hào)端口
#define  LCDDATA        PB_ODR          //LCD1602數(shù)據(jù)端口D0至D7
/**********************用戶自定義數(shù)據(jù)區(qū)域**********************/
u8 table1[]="=Frequency Test=";//LCD1602顯示字符串?dāng)?shù)組1顯示界面
u8 table2[]="f:            Hz";//LCD1602顯示字符串?dāng)?shù)組2顯示界面
u8 table3[]={'0','1','2','3','4','5','6','7','8','9'};//數(shù)字字符
static u16 A_num,B_num,SYS_num;//定義A_num、B_num變量用于裝載兩次邊沿時(shí)間
//SYS_num用于存放周期計(jì)數(shù)值
static unsigned long F_num;//用于存放頻率值
#define SYS_CLOCK 8034400UL//定義系統(tǒng)當(dāng)前fmaster頻率值
/************************函數(shù)聲明區(qū)域*************************/
void delay(u16 Count);//延時(shí)函數(shù)聲明
void GPIO_init(void);//GPIO端口初始化配置函數(shù)聲明
void TIM1_init(void);//TIM1初始化函數(shù)聲明
void LCD1602_init(void);//LCD1602初始化函數(shù)
void LCD1602_DIS_CHAR(u8 x,u8 y,u8 z);//在設(shè)定地址寫入字符數(shù)據(jù)
void LCD1602_Write(u8 cmdordata,u8 writetype);//寫入液晶模組命令或數(shù)據(jù)
void LCD1602_DIS(void);//顯示字符函數(shù)
/**************************主函數(shù)區(qū)域*************************/
int main(void)
{
  u8 i,baiwan,shiwan,wan,qian,bai,shi,ge;//i為循環(huán)控制,其它為取位變量
  CLK_CKDIVR=0x08;//設(shè)置系統(tǒng)時(shí)鐘為HSI內(nèi)部8MHz時(shí)鐘
  delay(10);//延時(shí)等待穩(wěn)定
  GPIO_init();//初始化相關(guān)GPIO引腳配置
  LCD1602_init();//LCD1602初始化
  LCD1602_DIS();//顯示字符
  TIM1_init();//TIM1相關(guān)功能配置初始化
  TIM1_CCER1&=0xFE;//捕獲功能禁止
  LCD1602_Write(0xC0,0);//選擇第二行
  for(i=0;i<16;i++)
  {
      LCD1602_Write(table2[ i],1);//寫入table2[]內(nèi)容
      delay(5);
  }
  while(1)
  {
    TIM1_CCR1H=0x00;//清除捕獲/比較寄存器1高8位
    TIM1_CCR1L=0x00;//清除捕獲/比較寄存器1低8位
    TIM1_CCER1|=0x01;//捕獲功能使能
    while((TIM1_SR1&0x02)==0);//等待捕獲比較1標(biāo)志位CC1IF變?yōu)椤?”
    A_num=(u16)TIM1_CCR1H<<8;//取回捕獲/比較寄存器1高8位
    A_num|=TIM1_CCR1L;//取回捕獲/比較寄存器1低8位并與高8位拼合
    while((TIM1_SR1&0x02)==0);//等待捕獲比較1標(biāo)志位CC1IF變?yōu)椤?”
    B_num=(u16)TIM1_CCR1H<<8;//取回捕獲/比較寄存器1高8位
    B_num|=TIM1_CCR1L;//取回捕獲/比較寄存器1低8位并與高8位拼合
    TIM1_CCER1&=0xFE;//捕獲功能禁止
    SYS_num=B_num-A_num;//得到信號(hào)周期計(jì)數(shù)值
    F_num=(8*SYS_CLOCK)/SYS_num;//計(jì)算頻率值
    baiwan=F_num/1000000;//取出百萬(wàn)位
    shiwan=F_num%1000000/100000;//取出十萬(wàn)位
    wan=F_num%100000/10000;//取出萬(wàn)位
    qian=F_num%10000/1000;//取出千位
    bai=F_num%1000/100;//取出百位
    shi=F_num%100/10;//取出十位
    ge=F_num%10;//取出個(gè)位
    LCD1602_DIS_CHAR(2,4,table3[baiwan]);//百萬(wàn)位顯示到2行第4字符位
    LCD1602_DIS_CHAR(2,5,'.');//顯示分隔小數(shù)點(diǎn)
    LCD1602_DIS_CHAR(2,6,table3[shiwan]);//十萬(wàn)位顯示到2行第6字符位
    LCD1602_DIS_CHAR(2,7,table3[wan]);//萬(wàn)位顯示到2行第7字符位
    LCD1602_DIS_CHAR(2,8,table3[qian]);//千位顯示到2行第8字符位
    LCD1602_DIS_CHAR(2,9,'.');//顯示分隔小數(shù)點(diǎn)
    LCD1602_DIS_CHAR(2,10,table3[bai]);//百位顯示到2行第10字符位
    LCD1602_DIS_CHAR(2,11,table3[shi]);//十位顯示到2行第11字符位
    LCD1602_DIS_CHAR(2,12,table3[ge]);//個(gè)位顯示到2行第12字符位
  }
}
/****************************************************************/
//延時(shí)函數(shù)delay(),有形參Count用于控制延時(shí)函數(shù)執(zhí)行次數(shù),無(wú)返回值
/****************************************************************/
void delay(u16 Count)
{
  u8 i,j;
  while (Count--)//Count形參控制延時(shí)次數(shù)
  {
    for(i=0;i<50;i++)
      for(j=0;j<20;j++);
  }
}
/****************************************************************/
//GPIO端口初始化配置函數(shù)GPIO_init(),無(wú)形參,無(wú)返回值
/****************************************************************/
void GPIO_init(void)
{
  //1.配置LCD1602數(shù)據(jù)口PB
  PB_DDR=0xFF; //配置PB端口為輸出端口
  PB_CR1=0xFF; //配置PB端口為推挽輸出模式
  PB_CR2=0x00; //配置PB端口為低速斜率輸出
  LCDDATA=0xFF;//初始化PB端口全部輸出高電平
  //2.配置LCD1602液晶RS引腳
  PF_DDR_DDR0=1;//配置PF0為輸出模式
  PF_CR1_C10=1; //配置PF0為推挽輸出模式
  PF_CR2_C20=0; //配置PF0低速率輸出
  //3.配置LCD1602液晶RW引腳
  PF_DDR_DDR3=1;//配置PF3為輸出模式
  PF_CR1_C13=1; //配置PF3為推挽輸出模式
  PF_CR2_C23=0; //配置PF3低速率輸出
  LCDRW=0;      //配置LCD1602為寫入模式
  //4.配置LCD1602液晶EN引腳
  PF_DDR_DDR4=1;//配置PF4為輸出模式
  PF_CR1_C14=1; //配置PF4為推挽輸出模式
  PF_CR2_C24=0; //配置PF4低速率輸出
}
/****************************************************************/
//TIM1功能初始化函數(shù)TIM1_init(),無(wú)形參,無(wú)返回值
/****************************************************************/
void TIM1_init(void)
{
  //1.CC1通道被配置為輸入,IC1映射在TI1FP1上“CC1S[1:0]=01”
  TIM1_CCMR1|=0x01;
  //2.配置采樣率為主時(shí)鐘頻率,無(wú)濾波器“IC1F[3:0]=0000”
  TIM1_CCMR1&=0x0F;
  //3.配置信號(hào)邊沿極性為TI1F或TI2F的低電平或下降沿“CC1P=1”
  TIM1_CCER1|=0x02;
  //4.配置輸入/捕獲1通道預(yù)分頻器因子為8分頻“IC1PSC[1:0]=11”
  TIM1_CCMR1|=0x0C;
  //5.使能TIM1_CH1輸入捕獲功能“CC1E=1”
  TIM1_CCER1|=0x01;
  //6.使能TIM1計(jì)數(shù)器功能“CEN=1”
  TIM1_CR1|=0x01;
}
/****************************************************************/
//LCD1602初始化函數(shù)LCD1602_init(),無(wú)形參和返回值
/****************************************************************/
void LCD1602_init(void)
{
  LCD1602_Write(0x38,0);//配置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  LCD1602_Write(0x0C,0);//設(shè)置開顯示,不顯示光標(biāo)
  LCD1602_Write(0x06,0);//寫字符后地址自動(dòng)加1
  LCD1602_Write(0x01,0);//顯示清0,數(shù)據(jù)指針清0
}
/****************************************************************/
//設(shè)定地址寫入字符函數(shù)LCD1602_DIS_CHAR(),有形參x、y、z無(wú)返回值
//x表示1602液晶的行,y表示列地址,z表示欲寫入的字符
/****************************************************************/
void LCD1602_DIS_CHAR(u8 x,u8 y,u8 z)
{
  u8 address;
  if(x==1)//若欲顯示在第一行
    address=0x80+y;//第一行的行首地址+列地址
  else
    address=0xC0+y;//第二行的行首地址+列地址
  LCD1602_Write(address,0);//設(shè)定顯示地址
  LCD1602_Write(z,1);//寫入字符數(shù)據(jù)
}
/****************************************************************/
//寫入液晶模組命令或數(shù)據(jù)函數(shù)LCD1602_Write(),有形參cmdordata和
//writetype,無(wú)返回值。
/****************************************************************/
void LCD1602_Write(u8 cmdordata,u8 writetype)
{
  if(writetype==0)//判斷寫入類型
    LCDRS=0;//寫入命令信息
  else
    LCDRS=1;//寫入數(shù)據(jù)信息
  LCDDATA=cmdordata;//向數(shù)據(jù)線端口寫入信息
  delay(5);//延時(shí)等待穩(wěn)定
  LCDEN=1;//模塊使能
  delay(5);//延時(shí)等待寫入
  LCDEN=0;//模塊不使能
}
/****************************************************************/
//顯示字符函數(shù)LCD1602_DIS(),無(wú)形參和返回值
/****************************************************************/
void LCD1602_DIS(void)
{
  u8 i;//定義控制循環(huán)變量i
  LCD1602_Write(0x80,0);//選擇第一行
  for(i=0;i<16;i++)
  {
      LCD1602_Write(table1[ i],1);//寫入table1[]內(nèi)容
      delay(5);
  }
  LCD1602_Write(0xC0,0);//選擇第二行
  for(i=0;i<16;i++)
  {
      LCD1602_Write('>',1);//帶延時(shí)逐一顯示字符“>”模擬進(jìn)度條
      delay(50);
  }
}

回復(fù)

使用道具 舉報(bào)

ID:992802 發(fā)表于 2021-12-15 16:49 | 顯示全部樓層
樓主 如果要是利用STM8單片機(jī)制作一個(gè)頻率計(jì),測(cè)量0-1KHZ方波信號(hào)的頻率,利用OLED顯示頻率,通過串口讀取信號(hào)頻率。應(yīng)該怎么寫程序啊 求指點(diǎn)了
回復(fù)

使用道具 舉報(bào)

ID:992802 發(fā)表于 2021-12-15 16:51 | 顯示全部樓層
樓主 麻煩問下要是利用STM8單片機(jī)制作一個(gè)頻率計(jì),測(cè)量0-1KHZ方波信號(hào)的頻率,利用OLED顯示頻率,通過串口讀取信號(hào)頻率。應(yīng)該怎么寫程序啊 求樓主指點(diǎn)哈
回復(fù)

使用道具 舉報(bào)

ID:1104990 發(fā)表于 2023-12-18 19:52 | 顯示全部樓層
JWChen 發(fā)表于 2021-12-15 16:49
樓主 如果要是利用STM8單片機(jī)制作一個(gè)頻率計(jì),測(cè)量0-1KHZ方波信號(hào)的頻率,利用OLED顯示頻率,通過串口讀取 ...

麻煩問一下,找到怎么做了嗎,同問題求助
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表