历史上的今天
返回首页

历史上的今天

今天是: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
那么问题来了。我的显示屏的程序系统提示
在这里插入图片描述
我前面已经声明了,为啥还是显示如此呢,求大神解惑,感恩!!!

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

推荐阅读

史海拾趣

Apex Tool Group公司的发展小趣事

由于我无法获取关于Apex Tool Group在电子行业内部发展的具体细节和故事,因此我无法提供五个精确到每个故事都至少500字的电子行业相关发展故事。但我可以根据已知信息,尝试概括Apex Tool Group的发展概况,以及它如何可能涉及电子行业。

Apex Tool Group(艾沛克斯工具集团)是一个专业的手动和电动工具制造商,成立于2010年,由美国的丹纳赫集团(Danaher)和库柏工业集团(Cooper Industries)合资成立。公司总部位于美国马里兰州的Sparks,并在全球拥有20多家工厂,产品覆盖多个国家和地区。

Apex Tool Group的发展之路充满了变革和机遇。它凭借两大集团的技术和资源优势,迅速崛起为行业内的佼佼者。公司不断推出创新产品,满足不同客户的需求,并在市场上获得了良好的口碑。

在电子行业,Apex Tool Group的产品可能也得到了广泛应用。随着电子行业的快速发展,对高精度、高效率的工具需求日益增长。Apex Tool Group凭借其卓越的技术和品质,为电子行业提供了可靠的工具解决方案。无论是在电子产品的制造过程中,还是在电子设备的维修和维护中,Apex Tool Group的工具都发挥着重要作用。

此外,Apex Tool Group还注重与客户的紧密合作。它根据客户的需求提供定制化服务,帮助客户解决实际问题。这种以客户为中心的经营理念,使得Apex Tool Group在电子行业中赢得了广泛的认可和信任。

然而,关于Apex Tool Group在电子行业内部发展的具体故事,如具体的合作案例、产品创新历程、市场拓展策略等,我需要更多的相关资料才能给出详细的描述。如果您对这方面的信息感兴趣,建议查阅Apex Tool Group的官方网站、行业报告或相关新闻报道,以获取更详细的信息。

希望以上内容能够对您有所帮助,如有更多问题,欢迎继续提问。

Avic公司的发展小趣事

Avic公司注重提升自主创新能力,不断加大在航空电子技术领域的研发投入。公司建立了一支高素质的研发团队,并积极引进国内外先进的研发设备和技术。这些措施有效提升了公司的创新能力,为公司在航空电子领域的持续发展提供了有力保障。

Edsun Laboratories Inc公司的发展小趣事

随着公司规模的扩大和产品线的丰富,ECM Electronics Limited.开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,将产品出口到多个国家和地区。为了更好地服务全球客户,公司还设立了海外办事处和研发中心,加强与国际市场的联系和合作。通过国际化战略的实施,ECM进一步提升了品牌知名度和市场竞争力。

AURORA公司的发展小趣事

AURORA公司成立于2016年,初出茅庐便面临着巨大的挑战。然而,公司的三位联合创始人Chris Urmson、J. Andrew Bagnell和Sterling Anderson均来自自动驾驶汽车领域的顶尖团队,拥有丰富的经验和深厚的技术背景。他们凭借对自动驾驶技术的深刻理解和前瞻性眼光,为AURORA的发展奠定了坚实的基础。在初创时期,AURORA通过与多家汽车制造商合作,共同设计和开发传感器、软件和数据服务,逐渐在自动驾驶领域崭露头角。

兵字(BingZi)公司的发展小趣事

为了进一步提升公司的管理水平和市场竞争力,兵字公司决定进行企业规范化和市场化运作。公司建立了完善的管理体系和运营机制,优化了业务流程和组织结构,提高了工作效率和响应速度。同时,兵字公司还积极引进外部投资和战略合作伙伴,为公司的发展注入了新的活力和动力。

GD Rectifiers Ltd公司的发展小趣事

面对数字化时代的到来,GD Rectifiers Ltd主动拥抱变革,积极推进数字化转型。公司投入巨资建设了先进的数字化生产管理系统和客户关系管理系统,实现了生产过程的智能化和透明化。通过数据分析和挖掘技术,公司能够更准确地把握市场需求和客户需求的变化趋势,为产品研发和市场营销提供有力支持。同时,公司还加强了与供应商和客户的数字化连接和协作,提高了供应链的协同效率和响应速度。数字化转型的成功实施为GD Rectifiers Ltd注入了新的活力,进一步提升了公司的市场竞争力和行业地位。

问答坊 | AI 解惑

TI 公司DSP产品相关FAQ整理

问:请TI公司的DSP技术专家GeorgeShen先生和AccountManager王剑先生做一下自我介绍。(10:36:50 AM)答:大家好,这里是TI公司的盛戎华、王剣,很高兴和大家一起讨论TI的DSP产品。 Good morning! Hello this is George Sheng, an Field Application Eng ...…

查看全部问答>

贴片元器件(密引脚IC)焊接教程

贴片元器件(密引脚IC)焊接教程…

查看全部问答>

首次发帖---国内最详细的linux基础教程(不过是第一版)---网域时代的教程

确实详细,只是版本有点老,贡献一下,供参考。 点击此处下载 或粘帖:http://download.eeworld.net/source/2251570…

查看全部问答>

如何去理解NTFS格式

如题,如何了解NTFS格式(各方面)。。。 有什么推荐的书?…

查看全部问答>

2410 的存储器以及有关启动的问题????????

2410 内部     1  ram起始地址被映射到哪里?容量有多大?     2  rom起始地址被映射到哪里?容量有多大? 2410 启动方式:     3  2410外启动时,第一条指令时在哪里执行的? & ...…

查看全部问答>

[求助]请教sim卡中通讯录的存储问题

大家好! 我们要开发一个sim卡的读卡器 gsm协议中提到了dialling number的概念,但是并没有明确提出通讯录是如何存储的, 请教大家dialling number和通讯录之间是什么关系?是不是通过读取dialling number就 可以读取通讯录了? 谢谢! …

查看全部问答>

OP放大器的双极性与FET连接的概念

什么是OP放大器的双极性连接 什么有是FET连接呢?谢谢…

查看全部问答>

求教LVDT传感器问题

我用高精度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 ...…

查看全部问答>