体育资讯网

您现在的位置是:首页 > 分类14 > 正文

分类14

思修电子stm8源码(思修电子stm8视频教程)

hacker2022-06-14 22:49:27分类1441
本文目录一览:1、STM8的CANBUS能用内部晶振吗?

本文目录一览:

STM8的CANBUS能用内部晶振吗?

内部那个时钟是RC的,不是晶振,你可以写入CLK_CKDIVR = 0x00; // 时钟不分频,16M

有一些电子设备需要频率高度稳定的交流信号,而LC振荡器稳定性较差,频率容易漂移(即产生的交流信号频率容易变化)。在振荡器中采用一个特殊的元件——石英晶体,可以产生高度稳定的信号,这种采用石英晶体的振荡器称为晶体振荡器。

本人正在学习stm8,使用IAR编程,求代码把蜂鸣器弄响

你用的是“ ST MCU 三合一体验套件 ” 里面的那套STM8S的开发板嚒·?

如果是的话可以参考以下例程:是在微雪电子那采购的官方套件光盘中的示例程序,不知道能不能帮到你! 有分的话给点分用用,嘿嘿!

/*============================================================================*/

/* PROJECT: DRIVING BUZZER THROUGH STM8 TIMER2 PWM DEMO SYSTEM */

/* MODULE: main.c */

/* COMPILER: STM8 Cosmic C Compiler */

/* DATE: Feb 2009 */

/*----------------------------------------------------------------------------*/

/* DESCRIPTION: Demonstration firmware for STM8 Mini Kit */

/* playing a tune through its buzzer. */

/*============================================================================*/

/******************************************************************************

*

* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE

* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY

* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING

* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE

* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

*

* COPYRIGHT 2008 STMicroelectronics

******************************************************************************

*/

/* Includes ------------------------------------------------------------------*/

#include "STM8S105C_S.h" /* Registers and memory mapping file. */

/******************************************************************************/

/* Macro definitions

/******************************************************************************/

/* Music instruction and note coding. */

#define _END_ 0xFF /* Music END. */

#define _PAUSE_ 0xFE /* Pause between different tunes. */

/* Note tone definition...... */

#define _FA0 0x00 /* FA- */

#define _SOL0 0x01 /* SOL- */

#define _LA0 0x02 /* LA- */

#define _SI0 0x03 /* SI- */

#define _DO 0x04 /* DO */

#define _RE 0x05 /* RE */

#define _MI 0x06 /* MI */

#define _FA 0x07 /* FA */

#define _SOL 0x08 /* SOL */

#define _LA 0x09 /* LA */

#define _SI 0x0A /* SI */

#define _DO2 0x0B /* DO+ */

#define _M 0x0C /* MUTE */

#define _RE2 0x0D /* RE+ */

#define _SOL2 0x0E /* SOL+ */

#define _FAd 0x0F /* FA# */

/* Note length definition...... */

#define sq 0x10 /* Semiquaver notes. */

#define q 0x20 /* Quaver notes. */

#define qp 0x30 /* 1.5 quaver notes. */

#define c 0x40 /* Crotchet notes. */

#define cn 0x60 /* 1.5 crotchet notes.*/

#define m 0x80 /* Minim notes. */

/*a note is defined here by a combination of a tone and a length, both parts

being easily retrievable with the AND binary operator: note = tone+length,

and tonelength=0*/

/******************************************************************************/

/* RAM SEGMENT variables */

/******************************************************************************/

/* Global variable used to store the ADC result. */

unsigned int AD_Value;

/* Global variable used to store the Key pressed for changing octave. */

unsigned char Flag_Octave_Chg;

/* Global variable used as index for the array of notes: position in the tune.*/

unsigned int current_note = 0;

/* Global variable used as index for the array of notes. */

unsigned char c1,c1_buf;

/* Music note coding ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

/* FA0 SOL0 LA0 SI0 DO RE MI FA SOL LA SI DO2 MUTE RE2 SOL2 FA# */

/* TIM2 CCR1 High byte. */

const unsigned char Low_Note_h[] /* Lower octave */

={0x2C,0x27,0x23,0x1F,0x1D,0x1A,0x17,0x16,0x13,0x11,0x0F,0x0E,0x00, 0x0D, 0x09, 0x15 };

const unsigned char Hi_Note_h[] /* Higher octave */

={0x16,0x13,0x11,0x0F,0x0E,0x0D,0x0B,0x0B,0x09,0x08,0x07,0x07,0x00, 0x06, 0x04, 0x0A };

/* TIM2 CCR1 Low byte. */

const unsigned char Low_Note_l[] /* Lower octave */

={0xA4,0xDC,0x82,0xA1,0xEE,0xA9,0xAC,0x62,0xEE,0xC1,0xD0,0xF0,0x00, 0x4F, 0xF7, 0x2C };

const unsigned char Hi_Note_l[] /* Higher octave */

={0x52,0xEE,0xC1,0xD0,0xF7,0x54,0xD6,0x31,0xF7,0xE0,0xE8,0x78,0x00, 0xA7, 0xFB, 0x96 };

/* The actual tune sequence: an array of notes. */

const unsigned char tune[] =

{

_M+sq, _M+sq, /* Two "buffer" mutes needed to manage smoothly the */

/* current_note/current_note_init comparison. */

/*------------------ DO RE MI FA SOL LA SI DO2 --------------------------*/

/*------------------ DO2 SI LA SOL FA MI RE DO --------------------------*/

_DO+c,_RE+c,_MI+c,_FA+c,_SOL+c,_LA+c,_SI+c,_DO2+c,_M+m, _PAUSE_,

_DO2+c,_SI+c,_LA+c,_SOL+c,_FA+c,_MI+c,_RE+c,_DO+c,_M+m, _PAUSE_,

/*---------------------------- 新年好 ------------------------------------*/

_DO+c,_DO+c,_DO+c,_M+sq,_DO+m,_SOL0+m,_MI+c,_MI+c,_M+sq,_MI+m,_DO+m,_DO+c,

_MI+c,_M+sq,_SOL+m,_SOL+m,_FA+c,_MI+c,_M+sq,_RE+m,_RE+m,_M+sq,_RE+c,_MI+c,

_FA+m,_M+sq,_FA+m,_MI+c,_RE+c,_MI+m,_DO+m,_M+sq,_DO+c,_MI+c,_RE+m,_SOL0+m,

_SI0+c,_RE+c,_DO+m,_DO+m,_PAUSE_,

/*--------------------------- 两只老虎 -----------------------------------*/

_DO+c,_RE+c,_MI+c,_DO+c,_DO+c,_RE+c,_MI+c,_DO+c,_MI+c,_FA+c,_SOL+m,_MI+c,

_FA+c,_SOL+m,_SOL+qp,_LA+sq,_SOL+qp,_FA+sq,_MI+c,_DO+c,_SOL+qp,_LA+sq,

_SOL+qp,_FA+sq,_MI+c,_DO+c,_M+sq,_DO+c,_SOL0+c,_DO+m,_M+sq,_DO+c,_SOL0+c,

_DO+m,_M+sq,_PAUSE_,

/*---------------------------- 甜蜜蜜 ------------------------------------*/

_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_MI+q,_SOL+q,_MI+m,

_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,_SOL0+cn,_DO+m,

_DO+c,_RE+c,_MI+cn,_RE+q,_MI+q,_RE+q,_MI+q,_SOL+q,_RE+m,_RE+m,_RE+m,_RE+m,

_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_MI+q,_SOL+q,_MI+m,

_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,_SOL0+cn,_DO+m,

_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LA0+q,_SOL0+cn,_DO+m,_DO+m,_DO+m,_DO+m,_MI+m,

_MI+m,_SOL0+m,_LA0+q,_DO+q,_SOL0+q,_LA0+q,_DO+m,_DO+m,_DO+m,_DO+m,_LA0+c,

_SI0+c,_LA0+c,_SI0+c,_LA0+c,_LA0+q,_DO+q,_LA0+q,_SOL0+q,_SOL0+c,_MI+m,_MI+m,

_MI+m,_MI+m,_LA0+c,_SI0+c,_LA0+c,_SI0+c,_LA0+c,_LA0+q,_DO+q,_LA0+q,_SOL0+q,

_SOL0+c,_MI+m,_MI+m,_MI+m,_M+c,_SOL+q,_LA+q,_SOL+m,_M+c,_SOL+q,_LA+q,_SOL+m,

_M+c,_SOL+q,_LA+q,_SOL+c,_SOL+q,_LA+q,_SOL+c,_SOL+q,_LA+q,_SOL+m,_SOL+m,

_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_RE+q,_SOL+q,_MI+m,

_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,

_SOL0+cn,_DO+m,_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LA0+q,_SOL0+cn,_DO+m,_DO+m,

_DO+m,_DO+m,_MI+m,_MI+m,_SOL0+m,_LA0+q,_DO+q,_SOL0+q,_LA0+q,_DO+m,_DO+m,

_DO+m,_DO+m,_PAUSE_,

/*------------------ _END_ marks to end of the tune ----------------------*/

_END_

};

/******************************************************************************/

/* Function definitions */

/******************************************************************************/

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: Buzz_Init */

/* INPUT/OUTPUT: None. */

/* DESCRIPTION: Initialize the TIM2 as PWM mode for BUZZ control. */

/* -------------------------------------------------------------------------- */

void Buzz_Init ( void )

{

PD_DDR |= 0x10; /* Configure PD4 as output (for the PWM). */

PD_CR1 |= 0x10; /* PD4 Push pull output. */

TIM2_CCMR1 |= 0x70; /* Output mode PWM2. */

TIM2_CCER1 |= 0x03; /* CC polarity low,enable PWM output */

TIM2_ARR = 0; /* Freq control register: ARR */

TIM2_CCR1 = 0; /* Dutycycle control register: CCR */

TIM2_PSCR |= 0x00; /* fCK_CNT is equal to fCK_PSC. */

TIM2_CR1 |= 0x01; /* Enable TIM2. */

current_note = 1;

}

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: Buzz_Wait */

/* INPUT/OUTPUT: Note duration (4bit MSB information) / None. */

/* DESCRIPTION: 1) Sample AIN voltage and store in AD_Value. */

/* 2) Polling wait routine for note duration(based on 4ms delay).*/

/* duration: Quaver (2), crotchet (4) or minim (8) selection. */

/* ---------------------------------------------------------------------------*/

void Buzz_Wait(unsigned char duration)

{

int i = 0;

unsigned char uc = 0;

unsigned long Temp;

/* Sample AIN voltage in ADC single mode. */

ADC_CR1 |= 0x01; /* First set ADON to power on the ADC module. */

i = 6; /* Wait 7us to ensure the ADC power on finished.*/

while(i--);

ADC_CR1 |= 0x01; /* Set ADON again to start AD convert. */

while(!(ADC_CSR 0x80));/* Waiting for AD convert finished (EOP=1). */

/* Store ADC value to AD_Value */

AD_Value = ((((unsigned int)ADC_DRH)2)+ADC_DRL)2;

if (AD_Value 0x01)

{ AD_Value = 0x01; }

if (AD_Value 0xC0)

{ AD_Value = 0xC0; }

if (Flag_Octave_Chg==1)

{

Temp = ((((unsigned int) Low_Note_h [c1_buf])8)+Low_Note_l [c1_buf]);

}

else

{

Temp = ((((unsigned int) Hi_Note_h [c1_buf])8)+Hi_Note_l [c1_buf]);

}

Temp = (Temp*AD_Value)9;

/* The new duty cycle value is written in CCR */

TIM2_CCR1H=(unsigned char)(((unsigned int)Temp 0xff00)8);

TIM2_CCR1L=(unsigned char)((unsigned int)Temp 0x00ff);

/* Delay time = duration * Y */

while ( uc duration ) /* The following loop is run "duration" times. */

{

while ( i 1200 ) /* This loop "Y" waits approximately 4.3ms. */

{

i++;

}

i = 0;

uc++;

}

}

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: Buzz_PlayTune */

/* INPUT/OUTPUT: None. */

/* DESCRIPTION: Plays a music score (one tune at a time). */

/* -------------------------------------------------------------------------- */

void Buzz_PlayTune ( void )

{

unsigned ui;

unsigned long temp_DCR;

unsigned char temp;

while(1)

{

if(tune[current_note] == _END_)

{

/* End of the music, reset to beginning. 1 is a mute at the */

/* beginning of the array of notes; differs from 0. */

current_note = 1;

break;

}

else if(tune[current_note] == _PAUSE_)

{

/* End of a tune, save the position in the music, stop playing. */

current_note++;

break;

}

else

{

c1 = tune[current_note];

/* Loads a note (or mute) on the relevant registers */

/* The note information is carried only by the 4 lowest bits. */

c1_buf= c1 0x0f;

if (Flag_Octave_Chg==1)

{

temp_DCR = ((((unsigned int)Low_Note_h [c1_buf])8)+Low_Note_l[c1_buf]);

TIM2_ARRH = Low_Note_h [c1_buf];

TIM2_ARRL = Low_Note_l [c1_buf];

}

else

{

temp_DCR = ((((unsigned int) Hi_Note_h [c1_buf])8)+Hi_Note_l [c1_buf]);

TIM2_ARRH = Hi_Note_h [c1_buf];

TIM2_ARRL = Hi_Note_l [c1_buf];

}

temp_DCR = (temp_DCR*AD_Value)9;

/* The new duty cycle value is written in DCR0. */

temp=((unsigned int)temp_DCR 0xff00)8;

TIM2_CCR1H=(unsigned char)temp;

temp=((unsigned int)temp_DCR 0x00ff);

TIM2_CCR1L=(unsigned char)temp;

/* Waits for the duration of the note. */

/* The duration info is carried by the 4 highest bits. */

Buzz_Wait(c10xF0);

/* Progressing in the array of notes: the tune. */

current_note++;

}

}

}

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: GPIO_Init */

/* INPUT/OUTPUT: None. */

/* DESCRIPTION: Initialize the GPIO for LED,TLI. */

/* -------------------------------------------------------------------------- */

void GPIO_Init(void)

{

/* LED IO Configuration */

/* LD3: PD3 */

/* LD2: PD1 */

/* LD1: PD0 */

PD_DDR |= 0x0D; /* Output. */

PD_CR1 |= 0x0D; /* PushPull. */

PD_CR2 = 0x00; /* Output speed up to 2MHz. */

/* PD7 external interrupt */

EXTI_CR1 = 0x00; /* External interrupt (TLI) sensitivity. */

EXTI_CR2 = 0x00;

PD_DDR =~0x80; /* PD7: Input */

PD_CR2 |= 0x80; /* Enable TLI interrupt. */

}

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: CLK_Init */

/* INPUT/OUTPUT: None. */

/* DESCRIPTION: Initialize the clock source */

/* -------------------------------------------------------------------------- */

void CLK_Init(void)

{

/* Configure HSI prescaler*/

CLK_CKDIVR = ~0x10; /* 01: fHSI= fHSI RC output/2. */

/* Configure CPU clock prescaler */

CLK_CKDIVR |= 0x01; /* 001: fCPU=fMASTER/2. */

}

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: ADC_Init */

/* INPUT/OUTPUT: None. */

/* DESCRIPTION: Initialize the AD converter. */

/* -------------------------------------------------------------------------- */

void ADC_Init(void)

{

ADC_CR2 = 0x00;

ADC_CR1 = 0x00;

ADC_CSR = 0x03;

ADC_TDRL = 0x20;

}

/* -------------------------------------------------------------------------- */

/* ROUTINE NAME: TIM_Init */

/* INPUT/OUTPUT: None. */

/* DESCRIPTION: Initialize the TIM4 as LED timebase. */

/* -------------------------------------------------------------------------- */

void TIM_Init(void)

{

/* TIM4 Peripheral Configuration */

/* Time Base configuration */

TIM4_PSCR = 0x04; /* Configure TIM4 prescaler. */

TIM4_ARR = 0xFF; /* Configure TIM4 period. */

/*TIM4 counter enable */

TIM4_CR1 |= 0x01; /* Enable TIM4. */

TIM4_IER |= 0x01; /* Enable TIM4 OVR interrupt. */

}

/* -------------------------------------------------------------------------- */

/* ROUTINE: main */

/* main entry */

/* -------------------------------------------------------------------------- */

void main ( void )

{

unsigned int j;

_asm("sim"); /* Disable interrupts. */

Flag_Octave_Chg=0;

CLK_Init();

GPIO_Init();

TIM_Init();

ADC_Init();

_asm("rim"); /* Enable interrupts. */

Buzz_Init (); /* Init TIMER peripheral. */

while ( 1 )

{

/* Play the current score. */

Buzz_PlayTune();

Buzz_Wait(0x80); /* Wait around one second. */

}

}

/* --------------------------- End of file -----------------------------------*/

用STM8S105单片机写一个输出频率为2KHz的方波,C语言? 没用过stm8单片机,求入门资料。谢谢!

//此例程是通过TIM2 CH1(PD4脚)通道来输出一个频率2K 占空比可调的方波,占空比可通过PD7脚的按键调

#include "STM8S105K.h"

typedef unsigned char u8;

typedef unsigned int u16;

u16 value;

void SystemInit(void)

{

CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M

CLK_PCKENR1 |= 0x60; //使能TIM2与TIM3与主频连接

PD_CR2 |= 0x80; //使能PD7口外部中断

}

void GPIO_init(void)

{

PD_DDR = 0x1F; //配置PD端口的方向寄存器全输出

PD_CR1 = 0x1F; //设置PD为推挽输出

}

void TIM2_init(void) //TIM2 CH1 工作于模式1

{

TIM2_CCMR1= 0x60; // PWM 模式 1,TIM2 CH1

TIM2_CCER1= 0x03; // CC1配置为输出

TIM2_ARRH = 0x07; // 配置PWM分辨率为10位,ARR=0x07D0

TIM2_ARRL = 0xD0; // PWM频率=8M/0x07D0=2000Hz

TIM2_CR1 |= 0x01; // 计数器使能,开始计数

}

void init_devices(void)

{

asm("sim");

SystemInit();

GPIO_init();

TIM2_init();

_asm("rim"); //开总中断

}

void main( void )

{

init_devices();

while(1)

TIM2_CCR1=value;//改变value值可改变频率

}

/****************************************************************************

*** 函数名 : @near @interrupt void TLI_IRQHandler (void)

*** 功能描述: 中断服务程序

按下PD7口按键来改变占空比

*****************************************************************************/

@near @interrupt void TLI_IRQHandler (void)

{

PD_CR2 = 0x7F; //关PD7外部中断

value+=50;

while(value1000)

value=0;

PD_CR2 |= 0x80; //使能PD7口外部中断

return;

}

求 STM8L的modbus程序主机和从机

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议思修电子stm8源码,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有思修电子stm8源码了它思修电子stm8源码,不同厂商生产的控制设备可以成工业网络,进行集中监控。

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

谁有范红刚写的stm8单片机自学笔记书上的源码啊

这个没有思修电子stm8源码,可以去单片机论坛找找类似思修电子stm8源码的程序。

懂事电子设计 Vgz

发表评论

评论列表

  • 舔夺揽月(2022-06-15 06:59:00)回复取消回复

    ********** * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PROD

  • 鸽吻苍阶(2022-06-15 02:26:01)回复取消回复

    /* FA- */#define _SOL0 0x01 /* SOL- */#define _LA0 0x02 /* LA- */#define _SI0 0x03 /* SI-

  • 俗野冧九(2022-06-15 02:46:37)回复取消回复

    ltage and store in AD_Value. *//* 2) Polling wait routine for note duration(based on 4ms delay).*//*

  • 掩吻不矜(2022-06-15 03:29:36)回复取消回复

    quence: an array of notes. */const unsigned char tune[] ={ _M+sq, _M+sq, /* Two "buffer" mutes needed to manage smoothly the */

  • 世味颜于(2022-06-15 09:55:47)回复取消回复

    -------------------------------------------------------- *//* ROUTINE NAME: TIM_Init