历史上的今天
今天是:2024年11月01日(星期五)
2021年11月01日 | stm8 占空比测电机速度以及显示在1602液晶显示屏上历程调试
2021-11-01 来源:eefocus
/*******************************************************************
实验名称及内容:速度显示液晶屏
配套书籍:《深入浅出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)12{
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;
}1234}
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
那么问题来了。我的显示屏的程序系统提示
我前面已经声明了,为啥还是显示如此呢,求大神解惑,感恩!!!

这个问题解决了,是上层我截图的地方多了个:,所以呢就死活程序错误,看来以后要更仔细了。最后呢显示屏显示出来了。
史海拾趣
|
问:请TI公司的DSP技术专家GeorgeShen先生和AccountManager王剑先生做一下自我介绍。(10:36:50 AM)答:大家好,这里是TI公司的盛戎华、王剣,很高兴和大家一起讨论TI的DSP产品。 Good morning! Hello this is George Sheng, an Field Application Eng ...… 查看全部问答> |
|
首次发帖---国内最详细的linux基础教程(不过是第一版)---网域时代的教程 确实详细,只是版本有点老,贡献一下,供参考。 点击此处下载 或粘帖:http://download.eeworld.net/source/2251570… 查看全部问答> |
|
2410 内部 1 ram起始地址被映射到哪里?容量有多大? 2 rom起始地址被映射到哪里?容量有多大? 2410 启动方式: 3 2410外启动时,第一条指令时在哪里执行的? & ...… 查看全部问答> |
|
大家好! 我们要开发一个sim卡的读卡器 gsm协议中提到了dialling number的概念,但是并没有明确提出通讯录是如何存储的, 请教大家dialling number和通讯录之间是什么关系?是不是通过读取dialling number就 可以读取通讯录了? 谢谢! … 查看全部问答> |
|
我用高精度LVDT传感器测位移,LVDT信号调理电路是厂家自带的,我现在保持测头固定不动,隔半分钟测量一次,每次测量值(一次采样100个数据求平均值)下降一个mV,请问这是怎么回事?就算是LVDT受温度影响也不至于变化这么快吧?难道信号调理电路有 ...… 查看全部问答> |
|
用ATMEGA16控制NRF905进行简单的收发,调了一周了,希望哪位大侠能帮俺播开云雾!! 发送段代码: #include <iom16v.h>#include <macros.h>#define uint unsigned int#define uchar unsigned char#define Low_TX_EN PORTD&=~(1 << PD7)#define High ...… 查看全部问答> |




