stm8 占空比测电机速度以及显示在1602液晶显示屏上历程调试
/*******************************************************************
实验名称及内容:速度显示液晶屏
配套书籍:《深入浅出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液晶显示屏上历程调试相关推荐
- 1602液晶显示屏显示字符
本次实验的效果为实现特定字符在1602液晶显示屏上流动显示 所用开发板为普中科技开发板,电路图如下: 代码如下: #include<reg51.h> #define uchar unsig ...
- 51小车测速及OLED显示速度
1.小车测速 用途:广泛用于电机转速检测,脉冲计数,位置限位等. 有遮挡,输出高电平:无遮挡,输出低电平 接线 VCC 接电源正极3.3-5V GND 接电源负极 DO TTL开关信号输出 AO 此模 ...
- 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环
带你认识PID闭环控制 - 增量式PID实现电机速度闭环 闭环控制是指控制论的一个基本概念.指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系.带有反馈信息的系统 ...
- stm32电机控制定时器1_STM32通过PWM控制电机速度
做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速.分享本文了解如何通过PWM实现对电机速度的控制. PWM控制电机速度的基本原理 PWM(Pulse Width Modulat ...
- STM32 电机教程 14 - BLDC 电机速度闭环控制
前言 无刷直流 (Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,它可在家用电器.汽车.航空航天.消费品.医疗.工业自动化设备和仪器等行业中使用.正如名称 ...
- STM32实现四驱小车(五)电机控制任务——电机速度PID控制算法
目录 一. 绪论 二. 电机速度环PID原理 三. STM32使用CAN总线实现大疆M3508电机的速度闭环控制 四. UCOS-III电机控制任务的实现 一. 绪论 本文接上一篇STM32实现四驱小 ...
- ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包
源代码中包括三个实验的源程序:18B20+1602LCD温度实验,18B20测温1602LCD显示,18b20测温数码管显示实验. 18b20测温数码管显示实验DS18B20的读写程序,数据脚P3.3 ...
- inovance变频器说明书参数设置_变频器控制电机速度时,面板调速如何切换为电位器调速...
若你我之间有缘,关注作者又何妨? 两情若是久长时,又岂在朝朝暮暮. 大家好!我是江郎,一个快要"才尽"的维修工. 引言 什么是数控? 说白了就是计算机数字技术控制机床工作. 那么, ...
- 华为鸿蒙系统腾讯首测,华为鸿蒙系统首测,速度超安卓60%?谷歌该咋想,咱也不敢问呐...
原标题:华为鸿蒙系统首测,速度超安卓60%?谷歌该咋想,咱也不敢问呐 最近,有外媒TechNave对华为的鸿蒙系统进行了报道,根据外媒消息,华为腾讯展开合作,联手了OPPO.VIVO等手机厂家,对华为 ...
最新文章
- 孩子斗图老失败,多半是没看这篇博客
- mac 安装swoole
- cocos2d-html5 onEnter init ctor构造函数 ----js特有特性(和c++有一点不一样)
- 线上BUG定位神器(阿尔萨斯)-Arthas2019-0801
- mmap映射区和shm共享内存的区别总结
- 快排的c++实现(两种实现方式)
- 通讯录小程序android,通讯录小程序,找回青春的回忆
- 20145307第二次JAVA学习实验报告
- 共享变量在线程间的可见性
- Navitas GaN IC 驱动 Vivo 可折叠手机
- 普通进销存管理系统设计
- VLookup函数和单元格引用
- HTML页面基本结构浅谈
- 7-1 愿天下有情人都是失散多年的兄妹 --DFS
- YouTorrent - 全新的“实时”BT种子搜索站
- a标签去下划线 菜鸟教程_HTML下划线标签示例教程
- Java程序员修炼之路
- 《春田花花同学会》--做OL的好处
- 【软件工程】 文档 - 银行业务管理 - 结构化设计
- Device /dev/sdc excluded by a filter.
热门文章
- 国产替代ADA4077, ADA4177, OPAX277,OPAX192 等管脚兼容
- 计算机电源原如何确定正常,电脑电源故障迅速准确判断方法
- ESD二极管ESD05V56T-2L参数
- dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目
- web实验一JSP环境配置及开发、运行
- 【ROS2要素】xml、GDF、URDF的关系
- 联想t168服务器硬盘,联想万全T168服务器板载Sata+raid系统设置图解.doc
- kafka发送数据报错: Error connecting to node xxxxx:9092 (id: 1 rack: null)java.net.UnknownHostExceptio
- DNS服务器的配置以及相关知识
- 今天带你体验79毫秒启动一个SpringBoot项目