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

  • 实验名称及内容:速度显示液晶屏

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

  • 实验平台及编程人员:骨灰级菜鸟
    /
    #include"iostm8s208mb.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;
    typedef unsigned short uint16_t;
    typedef unsigned long uint32_t;
    unsigned int long CNT;
    unsigned int long SPEED;
    unsigned int long VALUE;
    /用户自定义区域
    /
    const unsigned char table1[]=“VALUE”; //LCD1602显示字符串数组1显示效果用
    const unsigned char table2[]=“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)
    {
    //如果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程序段
    {
    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<16;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)

{
Write_Com(0x18);
TIM2_PWM_Init();
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_CR1=0x20; //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(0x0F);//设置开显示,无光标
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)
{
TIM4_SR&=0xFE;//清0更新标志
SPEED=CNT;
CNT=0;
VALUE=SPEED30000/500;
}
#pragma vector=0x1A
__interrupt void FLASH_END_IRQHandler(void)
{
}
//
**************************************************************
这个程序实现了利用PWM的大小调整占空比
外接一个负载直流电机,直流电机的线圈是500匝,1圈是500脉冲。
因为2ms是4个脉冲,通道按键调整占空比最大值250,频率就是500HZ,计算出电机转动是2ms4个脉冲,那么1min=(250060)/500
等于240转/min
那么问题来了。我的显示屏的程序系统提示

我前面已经声明了,为啥还是显示如此呢,求大神解惑,感恩!!!


这个问题解决了,是上层我截图的地方多了个:,所以呢就死活程序错误,看来以后要更仔细了。最后呢显示屏显示出来了。

stm8 占空比测电机速度以及显示在1602液晶显示屏上历程调试相关推荐

  1. 1602液晶显示屏显示字符

    本次实验的效果为实现特定字符在1602液晶显示屏上流动显示 所用开发板为普中科技开发板,电路图如下: 代码如下: #include<reg51.h> #define uchar unsig ...

  2. 51小车测速及OLED显示速度

    1.小车测速 用途:广泛用于电机转速检测,脉冲计数,位置限位等. 有遮挡,输出高电平:无遮挡,输出低电平 接线 VCC 接电源正极3.3-5V GND 接电源负极 DO TTL开关信号输出 AO 此模 ...

  3. 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环

    带你认识PID闭环控制 - 增量式PID实现电机速度闭环 闭环控制是指控制论的一个基本概念.指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系.带有反馈信息的系统 ...

  4. stm32电机控制定时器1_STM32通过PWM控制电机速度

    做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速.分享本文了解如何通过PWM实现对电机速度的控制. PWM控制电机速度的基本原理 PWM(Pulse Width Modulat ...

  5. STM32 电机教程 14 - BLDC 电机速度闭环控制

    前言 无刷直流 (Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,它可在家用电器.汽车.航空航天.消费品.医疗.工业自动化设备和仪器等行业中使用.正如名称 ...

  6. STM32实现四驱小车(五)电机控制任务——电机速度PID控制算法

    目录 一. 绪论 二. 电机速度环PID原理 三. STM32使用CAN总线实现大疆M3508电机的速度闭环控制 四. UCOS-III电机控制任务的实现 一. 绪论 本文接上一篇STM32实现四驱小 ...

  7. ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包

    源代码中包括三个实验的源程序:18B20+1602LCD温度实验,18B20测温1602LCD显示,18b20测温数码管显示实验. 18b20测温数码管显示实验DS18B20的读写程序,数据脚P3.3 ...

  8. inovance变频器说明书参数设置_变频器控制电机速度时,面板调速如何切换为电位器调速...

    若你我之间有缘,关注作者又何妨? 两情若是久长时,又岂在朝朝暮暮. 大家好!我是江郎,一个快要"才尽"的维修工. 引言 什么是数控? 说白了就是计算机数字技术控制机床工作. 那么, ...

  9. 华为鸿蒙系统腾讯首测,华为鸿蒙系统首测,速度超安卓60%?谷歌该咋想,咱也不敢问呐...

    原标题:华为鸿蒙系统首测,速度超安卓60%?谷歌该咋想,咱也不敢问呐 最近,有外媒TechNave对华为的鸿蒙系统进行了报道,根据外媒消息,华为腾讯展开合作,联手了OPPO.VIVO等手机厂家,对华为 ...

最新文章

  1. 孩子斗图老失败,多半是没看这篇博客
  2. mac 安装swoole
  3. cocos2d-html5 onEnter init ctor构造函数 ----js特有特性(和c++有一点不一样)
  4. 线上BUG定位神器(阿尔萨斯)-Arthas2019-0801
  5. mmap映射区和shm共享内存的区别总结
  6. 快排的c++实现(两种实现方式)
  7. 通讯录小程序android,通讯录小程序,找回青春的回忆
  8. 20145307第二次JAVA学习实验报告
  9. 共享变量在线程间的可见性
  10. Navitas GaN IC 驱动 Vivo 可折叠手机
  11. 普通进销存管理系统设计
  12. VLookup函数和单元格引用
  13. HTML页面基本结构浅谈
  14. 7-1 愿天下有情人都是失散多年的兄妹 --DFS
  15. YouTorrent - 全新的“实时”BT种子搜索站
  16. a标签去下划线 菜鸟教程_HTML下划线标签示例教程
  17. Java程序员修炼之路
  18. 《春田花花同学会》--做OL的好处
  19. 【软件工程】 文档 - 银行业务管理 - 结构化设计
  20. Device /dev/sdc excluded by a filter.

热门文章

  1. 国产替代ADA4077, ADA4177, OPAX277,OPAX192 等管脚兼容
  2. 计算机电源原如何确定正常,电脑电源故障迅速准确判断方法
  3. ESD二极管ESD05V56T-2L参数
  4. dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目
  5. web实验一JSP环境配置及开发、运行
  6. 【ROS2要素】xml、GDF、URDF的关系
  7. 联想t168服务器硬盘,联想万全T168服务器板载Sata+raid系统设置图解.doc
  8. kafka发送数据报错: Error connecting to node xxxxx:9092 (id: 1 rack: null)java.net.UnknownHostExceptio
  9. DNS服务器的配置以及相关知识
  10. 今天带你体验79毫秒启动一个SpringBoot项目