stm8 tim4 测速显示

发布者:梦幻微笑最新更新时间:2020-02-13 来源: eefocus关键字:stm8  tim4  测速显示 手机看文章 扫描二维码
随时随地手机看文章

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


实验名称及内容:PWM测速度并显示


配套书籍:《深入浅出STM8单片机入门、进阶与应用实例》《STM8实战》


实验平台及编程人员:骨灰级菜鸟

/

#include"iostm8s208mb.h"//主控芯片的头文件

#include “stdio.h”

/端口/引脚定义/

#define LCDRS_SET PF_ODR|=0x01 //置位PF0

#define LCDRS_CLR PF_ODR&=0xFE //清0PF0

#define LCDRW_SET PF_ODR|=0x08 //置位PF3

#define LCDRW_CLR PF_ODR&=0xF7 //清0PF3

#define LCDEN_SET PF_ODR|=0x10 //置位PF4

#define LCDEN_CLR PF_ODR&=0xEF //清0PF4

/常用数据类型定义/

#define u8 uint8_t

#define u16 uint16_t

#define u32 uint32_t

typedef unsigned char uint8_t; 定义可移植的无符号8位整数关键字

typedef unsigned short uint16_t;定义可移植的无符号16位短整数关键字

typedef unsigned long uint32_t;定义可移植的无符号32位长整数关键字

unsigned long CNT;

unsigned int SPEED;

unsigned int VALUE;

/用户自定义区域/

char table1[16]=“VALUE:”; //LCD1602显示字符串数组1显示效果用

u8 table2[16]=“FIGNTING!!!”; //LCD1602显示字符串数组2显示效果用

/全局变量定义/

unsigned char PWM =0; //定义全局变量用于控制占空比

unsigned char num; //定义循环变量NUM

/函数初始化定义/

void delay(u16 Count); //延时函数

void TIM2_PWM_Init(void); //PWM初始化函数

void KEY_Init(void); //按键端口函数

void KEY_Scan(void); //按键扫描函数

void TIM4_Init(void); //TIM4初始化函数

void Exti_Init(void); //外部中断初始化函数

void Write_Com(unsigned char com); //向1602液晶写命令函数声明

void Write_Inf(unsigned char inf);//向1602液晶写数据函数声明

void LCD_Init(void); //1602液晶初始化函数声明

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

int main(void)

{

u8 x;

//如果CLK_CMSR中的主时钟源为HSI,则CLK_CMSR=0xE1

//如果CLK_CMSR中的主时钟源为LSI,则CLK_CMSR=0xD2

//如果CLK_CMSR中的主时钟源为HSE,则CLK_CMSR=0xB4

CLK_CKDIVR = 0x00;

if(CLK_CMSR!=0xE1) //判断主时钟状态寄存器CLK_CMSR中的主时钟源是否是HSI,若不是则进入if程序段(时钟源为16兆)

{

CLK_SWCR |= 0x01;//1.首先要配置时钟切换使能位SWEN=1,使能切换过程

CLK_SWR = 0xE1;//2.选择主时钟源,对主时钟切换寄存器CLK_SWR写入欲切换时钟

while((CLK_SWCR & 0x08)==0);//3.等待时钟切换控制寄存器CLK_SWCR中的切换中断标志位SWIF=1

CLK_SWCR=0;//4.清除相关标志位

}


LCD_Init(); //1602液晶函数函数初始化


TIM2_PWM_Init();

TIM4_Init();

KEY_Init();

Exti_Init();

for(num=0;num<6;num++)

{

Write_Inf(table1[num]);//在LCD第一行写入字符串

delay(50);

}


for(num=0;num<16;num++)

{

Write_Com(0x80+0x40+num) ;//将地址设为LCD的第二行

Write_Inf(table2[num]);

delay(50);

}


asm("rim");   //MAIN程序的优先级由3级降低至0级(开总中断)    

while(1)

1

2

{

x = sprintf(table1,“Value=%d”,VALUE ); 打印value的值整型


Write_Com(0x80+0x06);

for(num=6;num<16;num++)Write_Inf(0x20);

Write_Com(0x80+0x06);

for(num=6;num{

Write_Inf(table1[num]);//在LCD第一行写入字符串

delay(50);

}

TIM2_CCR2L=PWM; //占空比50

//KEY_Scan();

}

}

/TIM2_PWM_Init()函数***********/

void TIM2_PWM_Init(void)

{

TIM2_CR1 =0x80; //预装载使能、边沿对齐,向上计数、禁止计数

TIM2_PSCR=0x07; //计数周期预分频8,计数周期1us

TIM2_ARRH=0; //预装载值100,PWM频率为10KHZ

TIM2_ARRL=250; //读写16位寄存器,高位先读写

TIM2_CCMR2=0x78; //通道2为PWM模式1、使CCR预装载

TIM2_CCR2H=0;

TIM2_CCR2L=PWM; //占空比50

TIM2_CCER1=0x30; //通道1关闭,开启通道2

TIM2_CCER2=0x00; //关闭通道3

//TIM2_EGR=0x01; // 产生更新事件,初始化寄存器

TIM2_CR1|=0x01; //使能计数器 CEN=1

}

/TIM4_PWM_Init()函数**********/

void TIM4_Init(void)

{

TIM4_CR1=0x80;//预装载使能、边沿对齐,向上计数、禁止计数

TIM4_PSCR=0x07;//计数器预分频值128,计数周期1us

TIM4_ARR=250;//预装载值250,每2ms断一次

TIM4_IER=0x01;//使能更新中断

asm(“rim”);//开关中断


TIM4_EGR=0x01;//产生更新事件,初始化寄存器

TIM4_CR1|=0x01;//使能计数器 CEN=1

}

/外部中断初始化函数*****/

void Exti_Init(void)

{

PE_DDR=0x00; //将PE口设置为输入

PE_CR1=0x00;

PE_CR2=0x04; //PE2端口悬浮输入(使能外部中断)

EXTI_CR2=0x10; //PE口仅下降沿触发中断


}

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

//延时函数delay(),有形参count用于控制延时函数执行次数,无返回值

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

void delay(u16 Count)

{

u8 i,j;

while (Count–)//Count形参控制延时次数

{

for(i=0;i<50;i++)

for(j=0;j<20;j++);

}

}

/KEY_Init()函数*******/

void KEY_Init(void)

{

PG_DDR&=0x00; //将PG端口设为输入

PG_CR1|=0x30;//将PG4和PG5设为上拉输入

PG_CR2&=0x00;

}

/KEY_Scan()函数/

void KEY_Scan(void)

{

unsigned char KEYNUM;

static unsigned char KeyNumFor;

KEYNUM=PG_IDR&0x30; //读取PG端口,保留PG4和PG5两位

delay(100);

if (KEYNUM0x20&&KeyNumFor0x30) //s1按下

{

PWM++;


if(PWM>=250)

{

 PWM=250;

}


}

else if (KEYNUM0x10&&KeyNumFor0x30&&PWM>0) //s2按下

{

PWM–;

if(PWM<=1)

{

PWM=1;

}

}

KeyNumFor=KEYNUM;

}

/LCD1602初始化函数*******/

//LCD1602初始化函数LCD1602_DIS,无返回值无形参

//

/向1602液晶写命令函数****/

//向1602液晶写命令函数,有形参com, 无返回值

//

void Write_Com(unsigned char com)

{

LCDRW_CLR;//将R/W端清0表示写操作

LCDRS_CLR;//将R/S端清0表示写命令

PB_ODR=com;//命令由PORTB端口送出

delay(50);

LCDEN_SET;//将E端置高

delay(50);

LCDEN_CLR;//将E端置低产生下降沿,命令写入

}

/向1602液晶写命令函数****/

//向1602液晶写数据函数,有形参inf, 无返回值

//

void Write_Inf(unsigned char inf)

{

LCDRW_CLR;//将R/W端清0表示写操作

LCDRS_SET;//将RS端置1表示写数据

PB_ODR=inf;//命令由PORTB端口送出

delay(50);

LCDEN_SET;//将E端置高

delay(50);

LCDEN_CLR;//将E端置低产生下降沿,命令写入

}

/向1602液晶初始化****/

//向1602液晶初始化

//

void LCD_Init(void)

{

PF_DDR|=0x19;//将PF0 PF3 PF4设置成推挽输出

PF_CR1|=0x19;

PF_CR2|=0x00;


PB_DDR|=0xFF;//将PB端口设置成推挽输出

PB_CR1|=0xFF;

PB_CR2|=0x00;


LCDRS_CLR;

LCDRW_CLR;

LCDEN_CLR;


Write_Com(0x38); //配置162显示,8位数据线格式,57点阵

Write_Com(0x0C);//设置开显示,无光标

Write_Com(0x06);//写字符后地址自动加1

Write_Com(0x01);//显示清0,数据指针清0

}

/中断函数***************/

#pragma vector=0x05

__interrupt void EXTI_PORTA_IRQHandler(void)

{

}

#pragma vector=0x06

__interrupt void EXTI_PORTB_IRQHandler(void)

{

}

#pragma vector=0x07

__interrupt void EXTI_PORTC_IRQHandler(void)

{

}

#pragma vector=0x08

__interrupt void EXTI_PORTD_IRQHandler(void)

{

}

#pragma vector=0x09

__interrupt void EXTI_PORTE_IRQHandler(void)

{

CNT++;

}

#pragma vector=0x0A

__interrupt void CAN_RX_IRQHandler(void)

{


}

#pragma vector=0x0B

__interrupt void CAN_TX_IRQHandler(void)

{

}

#pragma vector=0x0C

__interrupt void SPI_TX_IRQHandler(void)

{

}

#pragma vector=0x0D

__interrupt void TIM1_UP_OV_IRQHandler(void)

{

}

#pragma vector=0x0E

__interrupt void TIM1_CAPTURE_IRQHandler(void)

{

}

#pragma vector=0x0F

__interrupt void TIM2_UP_OV_IRQHandler(void)

{

}

#pragma vector=0x10

__interrupt void TIM2_CAPTURE_IRQHandler(void)

{

}

#pragma vector=0x11

__interrupt void TIM3_UP_OV_IRQHandler(void)

{

}

#pragma vector=0x12

__interrupt void TIM3_CAPTURE_IRQHandler(void)

{

}

#pragma vector=0x13

__interrupt void UART1_TX_IRQHandler(void)

{

}

#pragma vector=0x14

__interrupt void UART1_RX_IRQHandler(void)

{

}

#pragma vector=0x15

__interrupt void I2C_IRQHandler(void)

{

}

#pragma vector=0x16

__interrupt void UART3_TX_IRQHandler(void)

{

}

#pragma vector=0x17

__interrupt void UART3_RX_IRQHandler(void)

{

}

#pragma vector=0x18

__interrupt void ADC_IRQHandler(void)

{

}

#pragma vector=0x19

__interrupt void TIM4_UP_OV_IRQHandler(void)

{

static u16 TIM4CNT;


TIM4_SR&=0xFE;//清0更新标志

TIM4CNT++;

if(TIM4CNT>249)

{

TIM4CNT = 0;

SPEED=CNT;

CNT=0;

VALUE=SPEED120/500;

}

}

#pragma vector=0x1A

__interrupt void FLASH_END_IRQHandler(void)

{

}

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

结果是测出了直流电机的速度显示在显示屏上

过程调试中出现了很多错误

比如中断函数的引脚

void Exti_Init(void)

PE_DDR=0x00; //将PE口设置为输入

PE_CR1=0x00;

PE_CR2=0x04; //PE2端口悬浮输入(使能外部中断)

EXTI_CR2=0x10; //PE口仅下降沿触发中断

PE对应得是CR2

PA PB PC PD对应得是CR1这种的结果就导致中断函数CNT++

自动运行(在电机不发动脉冲的前提下)

还有void LCD_Init(void):这个IAR环境一直在报错

显示的是 Error[Pe169]: expected a declaration

Warning[Pe606]: this pragma must immediately precede a declaration C:UsersAdministratorDesktoptextmain.c 228

最后发现初始化这个函数时是不需要;这个标点符号的

还有就是呢自己板子杜邦线总是会断

自己做的电路也总是接触不良各种接触不良

还有就是连线的错误各种问题

IAR环境的结构关系

函数的结构关系都不能错,加油

慢慢来 会更好。来个图记录下成果。

在这里插入图片描述

PWM来测量速度,上面显示的是每分钟多少转

在这里插入图片描述

这是板子和电路图

在这里插入图片描述

这个是自己焊接的,连接电路的时候接触不良,技术不够硬

在这里插入图片描述

最后显示值是95,也就会value的值,发出了95 个脉冲

关键字:stm8  tim4  测速显示 引用地址:stm8 tim4 测速显示

上一篇:STM8S TIM4 初始化设置
下一篇:STM32学习笔记——利用通用定时器TIM2进行精确延时

推荐阅读最新更新时间:2024-11-07 12:46

STM8系统讲解应用经验
简介:stm8s外设资源丰富,性能优越,性价比高,这里分享下自己的开发经验,给有兴趣的朋友。 先看下配置。 不错吧,而它的价格只有3元,0系列的产品则仅有1元多点。很诱人吧。更诱人的是,学好了这个,再学STM32将变的顺手起来。外设的控制大致是一样的。切入正题,下边的说明将针对直接寄存的控制,不用库开发。(8实在没必要) GPIO的控制: 每组IO都有5个寄存器负责分别是 PX_ODR :输出状态控制寄存器 PX_DDR :数据方向控制寄存器 PX_CR1 :上拉电阻控制寄存器 PX_CR2 :外部中断控制寄存器 PX_IDR: 读端口状态寄存器 下边列出几种常用的端口配置: 推 挽输出低电平 PX_DDR=0XFF;PX
[单片机]
<font color='red'>STM8</font>系统讲解应用经验
STM8学习笔记---定时器输出7路PWM波
STM8S003F3P6单片机共有三个定时器定时器1、定时器2、定时器4。其中定时器1为16位高级定时器,定时器2为16位通用定时器,定时器4为8位基本定时器。定时器1和定时器2可以输出PWM波。其中定时器1有4个通道,定时器2有3个通道。 现在让定时器1和定时器2所有通道同时输出PWM波。 首先初始化定时器IO口 通过最小系统图可以看出定时器通道对应的IO口为: TIM1_CH1– PC6, TIM1_CH2– PC7, TIM1_CH3– PC3, TIM1_CH4– PC4, TIM2_CH1– PC5, TIM2_CH2– PD3, TIM2_CH3– PA3, 将定时器对应的IO口都设置为推挽输出模式。因为要
[单片机]
<font color='red'>STM8</font>学习笔记---定时器输出7路PWM波
stm8 16位定时器TIM1
第一步:TIM1概述 STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。STM8S系列的定时器TIM1,TIM5和TIM6之间没有共享任何资源,但是它们可以TIM5/TIM6定时器的同步中的描述来同步和连接。在拥有TIM1,TIM2,TIM3和TIM4定时器的STM8S系列产品中,定时器是没有连接在一起的。 可以看到TIM1是可以向上、向下、向上/向下自动装载的。分频系数为1~65535之间的任意数值。
[单片机]
IAR STM8工程中断的使用
IAR的工程建立比较简单,直接先建立工作区然后保存,不保存无法调试。把官方的INC放到工程目录下,在C/C++编辑连接包含这个文件的绝对路径(最简单的搞法)。把c文件添加进去就可以了,它的中断很简单你只要写一个如下的.c文件就能用了: #pragma vector=1 __interrupt void TRAP_IRQHandler(void) { } #pragma vector=2 __interrupt void TLI_IRQHandler(void) { } #pragma vector=3 __interrupt void AWU_IRQHandler(void) { } #pragma vector=
[单片机]
STM8单片机串口发送引脚和接收引脚分开使用
在使用STM8S003单片机时,需要用到ADC采样功能,STM8S003总共有5个ADC采样口,但是其中两个采样口是和串口复用的,如果当ADC口用,就不能用串口,如果当串口用,就不能用ADC口。 通过芯片管脚的原理图可以看到PD5口可以当作模拟采样第5通道使用,也可以用当做串口发送口使用。PD6口可以当做模拟采样第6通道使用,也可以当做串口接收口使用。 在项目中需要将串口当做AD口使用,但是也需要串口向外发送监控数据。AD功能和串口功能需要同时使用,于是想到,串口只用到了发送引脚,那么能不能将串口的接收引脚当做AD功能用。这样PD5口作为串口发送引脚使用,PD6口作为模拟采样第6通道使用。 先写一个简单的测试程序测试一
[单片机]
<font color='red'>STM8</font>单片机串口发送引脚和接收引脚分开使用
STM8学习-内部时钟切换
在STM8内部有时钟切换功能,可以在需要时变换时钟的频率。板子为STM8_Discovery,LED为PD0。 程序如下: //软件环境:IAR FOR STM8 V1.0 //作者:Nicole //功能:STM8的内部时钟分频切换 //日期:2010.11.04 #include iostm8s105c6.h // 函数功能:延时函数 // 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ void DelayMS(unsigned int ms) { unsigned char i; while(ms != 0) { for(i=0;i 250;i++) { }
[单片机]
STM8系列单片机开发环境搭建
一、 开发环境搭建 1、 安装STVD开发环境 安装包ST+Visual+Develop+%28STVD%29+4.2.1+,安装过程中直接下一步下一步就OK。 2、 安装C语言编译器 STVD 仅能编译汇编 和烧写STM8系列单片机程序,所以需要Cosmic_C C编译器配合使用。 安装包STM8_Cosmic_C编译器破解版for_STVD,安装过程中直接下一步下一步就OK,最后需破解,将破解License直接替换掉安装路径下的License即可。 3、 安装ST-Link驱动 安装包en.stsw-link009 说明:官网下载很麻烦,建议先官网上找到具体安装包名称,然后百度搜索资源,实在没有资源在去官网下载。以上1
[单片机]
STM8S学习笔记之二(STM8 GPIO输出功能)
拿到STM8板子之后,在IAR官方下载IAR for STM8s 30天试用版本,在电脑上安装后发现在安装IAR时,STLink的驱动也会全部自动的安装上去,方便啊。。因为之前我的AVR都是在IAR上开发的,所有对这个软件并不陌生,打开软件新建工程,Debug模式下,设置使用STLink仿真,将空白文件成功烧写进去了,看来,开饭环境搭建还是很简单的。。 接下来,进入主题,STM8S的IO口控制,这是学习一个单片机最最最基础的东西了。 STM8单片机IO与AVR差不多,可以配置为输入输出,同时还可以带上拉电阻下拉电阻。还有就是跟STM32几乎相同,某些IO口可以配置成模拟输入,模拟输入,复用端口,也可以配置成中
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved