线粒不拿拿体 2024-03-31 15:31 采纳率: 0%
浏览 8
已结题

关于#单片机#的问题:请问把下面代码改成STM32代码后正确吗

本人初学,请问把下面代码改成STM32代码后正确吗?
原代码:

#include"at89x52.h"
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************端口定义**************
//LCD 控制线接口
uchar flag1;
sbit RS=P2^7;
sbit RW=P2^6;
sbit LCDE=P2^5;
//mlx90614 端口定义
sbit SCL=P2^3;//时钟线
sbit SDA=P2^2;//数据线
//************数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************函数声明*****************************************
void start_bit(); //MLX90614 发起始位子程序
void stop_bit(); //MLX90614 发结束位子程序
uchar rx_byte(void); //MLX90614 接收字节子程序
void send_bit(void); //MLX90614 发送位子程序
void tx_byte(uchar dat_byte); //MLX90614 接收字节子程序
void receive_bit(void); //MLX90614 接收位子程序
void delay(uint N); //延时程序
uint memread(void); //读温度数据
void init1602(void); //LCD 初始化子程序
void chk_busy_flg(void); //LCD 判断忙子程序
void dis_cmd_wrt(uchar cmd); //LCD 写命令子程序
void dis_dat_wrt(uchar dat); //LCD 写数据子程序
void display(uint Tem); //显示子程序
//*************主函数*******************************************
void main()
{
uint Tem;
//函数部分
SCL=1;SDA=1;_nop_();
_nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
init1602();
while(1)
{
Tem=memread();
display(Tem);
delay(20);
}
}
//*********输入转换并显示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
 dis_cmd_wrt(0x01);//清屏
if(T>=27315)
{
T=T-27315;
a=T/100;
b=T-a*100;
//---------------------------
if(a>=100)
{
dis_dat_wrt(0x30+a/100);
a=a%100;
dis_dat_wrt(0x30+a/10);
a=a%10;
dis_dat_wrt(0x30+a);
}
else if(a>=10)
{
dis_dat_wrt(0x30+a/10);
a=a%10;
dis_dat_wrt(0x30+a);
}
else
{
dis_dat_wrt(0x30+a);
}
dis_dat_wrt(0x2e);//显示点
//---------------------------
if(b>=10)
{
dis_dat_wrt(0x30+b/10);
// b=b%10;
// dis_dat_wrt(0x30+b);
}
else
{
dis_dat_wrt(0x30);
// dis_dat_wrt(0x30+b);
}
}
//===========================
else
{
T=27315-T;
a=T/100;
 b=T-a*100;
dis_dat_wrt(0x2d);
//--------------------------
if(a>=10)
{
dis_dat_wrt(0x30+a/10);
a=a%10;
dis_dat_wrt(0x30+a);
}
else
{
dis_dat_wrt(0x30+a);
}
dis_dat_wrt(0x2e);//显示点
//--------------------------
if(b>=10)
{
dis_dat_wrt(0x30+b/10);
b=b%10;
dis_dat_wrt(0x30+b);
}
else
{
dis_dat_wrt(0x30);
dis_dat_wrt(0x30+b);
}
}
}
//************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
 SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1)
{
stop_bit();
if(n!=0)
{n--;goto Repeat;}
else
goto exit;
}
else
goto exit;
Repeat:
start_bit();
goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
 SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
uchar rx_byte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
SDA=1;bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
 _nop_();
}
//------------------------------
uint memread(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x07); //Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
//******************LCD 显示子函数***********************
void init1602(void) //初始化 LCD
{
dis_cmd_wrt(0x01);
dis_cmd_wrt(0x0c);
dis_cmd_wrt(0x06);
dis_cmd_wrt(0x38);
}
void chk_busy_flg(void) //LCD 忙标志判断
{
flag1=0x80;
while(flag1&0x80)
{
P0=0xff;
RS=0;
RW=1;
LCDE=1;
flag1=P0;
LCDE=0;
}
}
void dis_cmd_wrt(uchar cmd) //写命令子函数
{
chk_busy_flg();
P0=cmd;
RS=0;
RW=0;
LCDE=1;
LCDE=0;
}
void dis_dat_wrt(uchar dat) //写数据子函数
{
chk_busy_flg();
if(flag1==16)
{
P0=0XC0;
RS=0;
RW=0;
LCDE=1;
LCDE=0;
}
P0=dat;
RS=1;
RW=0;
LCDE=1;
LCDE=0;
}

更改后:

void Delay(unsigned int count)
{
    unsigned int i;
    for(;count!=0;count--)
    {
        i=5000;
        while(i--);
    }
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************????**************
//LCD ?????
#define RS_PIN GPIO_PIN_7
#define RS_PORT GPIOA

#define RW_PIN GPIO_PIN_6
#define RW_PORT GPIOA

#define LCDE_PIN GPIO_PIN_5
#define LCDE_PORT GPIOA

// MLX90614????
#define SCL_PIN GPIO_PIN_3
#define SCL_PORT GPIOB

#define SDA_PIN GPIO_PIN_2
#define SDA_PORT GPIOB
//************????****************
bdata uchar flag;//??????
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************????*****************************************
void start_bit(); //MLX90614 ???????
void stop_bit(); //MLX90614 ???????
uchar rx_byte(void); //MLX90614 ???????
void send_bit(void); //MLX90614 ??????
void tx_byte(uchar dat_byte); //MLX90614 ???????
void receive_bit(void); //MLX90614 ??????
void delay(uint N); //????
uint memread(void); //?????
void init1602(void); //LCD ??????
void chk_busy_flg(void); //LCD ??????
void dis_cmd_wrt(uchar cmd); //LCD ??????
void dis_dat_wrt(uchar dat); //LCD ??????
void display(uint Tem); //?????
//*************???*******************************************
void main()
{
uint Tem;
//????
SCL=1;SDA=1;_nop_();
_nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
init1602();
while(1)
{
Tem=memread();
display(Tem);
delay(20);
}
}
//*********???????*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
 dis_cmd_wrt(0x01);//??
if(T>=27315)
{
T=T-27315;
a=T/100;
b=T-a*100;
//---------------------------
if(a>=100)
{
dis_dat_wrt(0x30+a/100);
a=a%100;
dis_dat_wrt(0x30+a/10);
a=a%10;
dis_dat_wrt(0x30+a);
}
else if(a>=10)
{
dis_dat_wrt(0x30+a/10);
a=a%10;
dis_dat_wrt(0x30+a);
}
else
{
dis_dat_wrt(0x30+a);
}
dis_dat_wrt(0x2e);//???
//---------------------------
if(b>=10)
{
dis_dat_wrt(0x30+b/10);
// b=b%10;
// dis_dat_wrt(0x30+b);
}
else
{
dis_dat_wrt(0x30);
// dis_dat_wrt(0x30+b);
}
}
//===========================
else
{
T=27315-T;
a=T/100;
 b=T-a*100;
dis_dat_wrt(0x2d);
//--------------------------
if(a>=10)
{
dis_dat_wrt(0x30+a/10);
a=a%10;
dis_dat_wrt(0x30+a);
}
else
{
dis_dat_wrt(0x30+a);
}
dis_dat_wrt(0x2e);//???
//--------------------------
if(b>=10)
{
dis_dat_wrt(0x30+b/10);
b=b%10;
dis_dat_wrt(0x30+b);
}
else
{
dis_dat_wrt(0x30);
dis_dat_wrt(0x30+b);
}
}
}
//************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
 SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//---------??????---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1)
{
stop_bit();
if(n!=0)
{n--;goto Repeat;}
else
goto exit;
}
else
goto exit;
Repeat:
start_bit();
goto TX_again;
exit: ;
}
//-----------?????---------
void send_bit(void)
{
if(bit_out==0)
 SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------??????--------
uchar rx_byte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//----------?????----------
void receive_bit(void)
{
SDA=1;bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------??--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
 _nop_();
}
//------------------------------
uint memread(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x07); //Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
//******************LCD ?????***********************
void init1602(void) //??? LCD
{
dis_cmd_wrt(0x01);
dis_cmd_wrt(0x0c);
dis_cmd_wrt(0x06);
dis_cmd_wrt(0x38);
}
void chk_busy_flg(void) //LCD ?????
{
flag1=0x80;
while(flag1&0x80)
{
P0=0xff;
RS=0;
RW=1;
LCDE=1;
flag1=P0;
LCDE=0;
}
}
void dis_cmd_wrt(uchar cmd) //??????
{
chk_busy_flg();
P0=cmd;
RS=0;
RW=0;
LCDE=1;
LCDE=0;
}
void dis_dat_wrt(uchar dat) //??????
{
chk_busy_flg();
if(flag1==16)
{
P0=0XC0;
RS=0;
RW=0;
LCDE=1;
LCDE=0;
}
P0=dat;
RS=1;
RW=0;
LCDE=1;
LCDE=0;
}
  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-31 18:02
    关注

    【相关推荐】



    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7598489
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:当手头上没有示波器,如何通过代码测试stm32外部晶振是否工作
    • 您还可以看一下 朱有鹏老师的STM32标准库的引入视频课程-第3季第6部分课程中的 3.6.1.为什么会有标准外设库小节, 巩固相关知识点
    • 除此之外, 这篇博客: STM32踩坑记录(1):编写代码时遇到STM32无法进入外部中断的原因及解决方法。中的 使用的软件及硬件: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      硬件平台:RoboMaster C板(STM32F407IGT6)、Jlink仿真调试器
      软件平台:keil5
      使用的是标准库+freertos。
      在这里插入图片描述
      在这里插入图片描述

      ##遇到问题时的场景
      在编写RoboMaster C板上的IMU(BMI088)温度闭环控制程序时
      ,需要配置外部中断引脚 INT1_ACCEL_Pin(PC4),然后在中断服务函数中给温度控制任务发通知(也就是信号量),温度控制任务就会读取BMI088数据寄存器中的陀螺仪、加速度、温度的值,将温度的值传递给PID控制器,进行PID闭环控温程序。
      在这里插入图片描述

      ##:遇到的问题:
      因为板载的BMI088上有两个外部中断引脚,分别为INT1_ACCEL_Pin(PC4) 、 INT1_Gyro_Pin(PC5)。对应加速度发送数据中断引脚和陀螺仪发送数据中断引脚,虽然温度控制没有用到陀螺仪发送数据中断引脚,但因为两个引脚很相近,就顺手把两个引脚都配置了。但是配制好之后,发现温度控制任务异常,无法读取到陀螺仪、加速度和温度的值了。`
      在这里插入图片描述

      由图中的控制思路分析,猜想可能是在中断服务函数中没有发出信号量,于是继续在中断服务函数中加断点,继续调试。结果发现程序连中断服务函数都进不去。
      在这里插入图片描述
      于是便烧录了一遍官方给的基于HAL库的示例代码,发现他们的代码跑起来很正常,没有出现问题,说明硬件是没有问题的。于是就一遍一遍的看手册上的中断引脚配置,感觉自己的引脚配置是没有什么问题的,代码如下图。
      在这里插入图片描述
      于是,心态很是爆炸。因为不在学校,没法找学长们帮忙,只能靠自己。只能在csdn上搜了搜,看看大家有没有遇到和我一样的问题的好兄弟。
      在这里插入图片描述看了几个文章,发现自己遇到的问题好像和大家不同,也按照大家的方法改了一下程序,但是问题还是没有解决。直到看到这篇文章

      STM32进不了外部中断的一个可能原因,(感谢,感谢,感谢)才有了一些思路。
      在这里插入图片描述
      我发现我第一部分的代码是分开写的,应该没问题。但是第二部分的外部中断线4、5配置是写在一块的,第三部分中断的号也是写在一块的。很有可能这两部分有地方出现问题了。
      于是,便先单独配置PC4,发现程序没问题,可以读取到数据。
      在这里插入图片描述
      这更加表明第二部分或者第三部分不能一次配置多个中断。继续仿真之后发现在NVIC这里,不能一次配置多个中断。
      在这里插入图片描述

      至此,问题终于解决了。踩过这个坑之后,我发现自己对32的一些配置还是不太了解,但是幸好会Dbug,不然就真的寄了。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月23日
  • 创建了问题 3月31日