打印
[PIC®/AVR®/dsPIC®产品]

用讯飞星火帮我写一个点灯,写的还挺好

[复制链接]
468|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

#include <xc.h>

// 配置位设置
#pragma config FOSC = INTOSC    // 内部振荡器
#pragma config WDTE = OFF       // 禁用看门狗定时器
#pragma config PWRTE = OFF      // 禁用电源上电延迟
#pragma config MCLRE = ON       // MCLR引脚功能启用
#pragma config CP = OFF         // 代码保护禁用
#pragma config CPD = OFF        // 数据EEPROM保护禁用
#pragma config BOREN = ON       // 启用棕色外设复位
#pragma config CLKOUTEN = OFF   // 禁用时钟输出
#pragma config IESO = OFF       // 禁用内部/外部振荡器切换
#pragma config FCMEN = OFF      // 禁用故障检测时钟监视器

void main(void) {
    TRISA = 0x00;     // 设置RA0为输出
    TRISB = 0x00;     // 设置RB0为输出
    PORTA = 0xFF;     // 设置所有LED为高电平
    PORTB = 0xFF;     // 设置所有LED为高电平

    while (1) {
        PORTA = 0x00;     // 关闭所有LED
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
        PORTA = 0xFF;     // 打开所有LED
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
    }
}
使用了寄存器编写,竟然也收录了PIC单片机开发的技能,非常棒。

使用特权

评论回复
沙发
小明的同学|  楼主 | 2023-8-14 21:10 | 只看该作者
这个程序将使连接到RA0和RB0引脚的所有LED都闪烁。在主循环中,我们首先将所有LED关闭,然后等待一段时间,再将所有LED打开,并再次等待一段时间。这个过程不断重复,从而使LED闪烁。

使用特权

评论回复
板凳
小明的同学|  楼主 | 2023-8-14 21:11 | 只看该作者
我继续提问:如何用该单片机驱动DS18B20?
讯飞星火:
DS18B20是一款数字温度传感器,采用的是单总线时序与主机通信,只需要一根线就可以完成温度数据读取。下面是一个简单的驱动程序,你可以将其添加到你的PIC18F系列单片机中:
#include <xc.h>
#include "ds18b20.h"

void main(void) {
    TRISA = 0x00;     // 设置RA0为输出
    TRISB = 0x00;     // 设置RB0为输出
    PORTA = 0xFF;     // 设置所有LED为高电平
    PORTB = 0xFF;     // 设置所有LED为高电平

    DS18B20_Init(); // 初始化DS18B20

    while (1) {
        float temp = DS18B20_ReadTemp(); // 读取温度值
        temp *= 0.0625; // 转换为摄氏度
        temp += 0.5; // 四舍五入到小数点后一位
        printf("Temperature: %.1f°C
", temp); // 打印温度值
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
        _nop_();          // 空操作指令
    }
}

使用特权

评论回复
地板
小明的同学|  楼主 | 2023-8-14 21:13 | 只看该作者
我一看,我了个去,没有头文件代码我怎么知道如何实现呢?
继续提问:以上代码中头文件包含的ds18b20.h给我提供一下,谢谢。


好的,以下是ds18b20.h头文件的代码
#ifndef DS18B20_H
#define DS18B20_H

#include <stdint.h>

// DS18B20数据引脚定义
#define DS18B20_DATA_PORT PORTC
#define DS18B20_DATA_PIN 3

// DS18B20命令定义
#define DS18B20_CMD_READ_SCRATCHPAD 0xCC
#define DS18B20_CMD_CONVERT_TARE 0x44
#define DS18B20_CMD_WRITE_SCRATCHPAD 0xCC
#define DS18B20_CMD_DISPLAY_ON 0xAF
#define DS18B20_CMD_DISPLAY_OFF 0xA5

// DS18B20初始化函数
void DS18B20_Init(void);

// DS18B20读取温度函数
float DS18B20_ReadTemp(void);

#endif // DS18B20_H

这个头文件包含了DS18B20的数据引脚定义、命令定义和初始化函数以及读取温度函数的声明。你需要将这个头文件添加到你的PIC18F系列单片机项目中,并在你的主程序中包含它。

使用特权

评论回复
5
小明的同学|  楼主 | 2023-8-14 21:16 | 只看该作者
它还是没告诉我怎么实现那个函数,我继续问它。
我:这个头文件中关于两个函数的实现对应的.c文件的内容告诉我一下。
讯飞:好的,以下是DS18B20.c文件的代码:
#include "ds18b20.h"

// DS18B20数据引脚定义
#define DS18B20_DATA_PORT PORTC
#define DS18B20_DATA_PIN 3

// DS18B20命令定义
#define DS18B20_CMD_READ_SCRATCHPAD 0xCC
#define DS18B20_CMD_CONVERT_TARE 0x44
#define DS18B20_CMD_WRITE_SCRATCHPAD 0xCC
#define DS18B20_CMD_DISPLAY_ON 0xAF
#define DS18B20_CMD_DISPLAY_OFF 0xA5

// DS18B20初始化函数
void DS18B20_Init(void) {
    TRISA = 0x00;     // 设置RA0为输出
    TRISB = 0x00;     // 设置RB0为输出
    PORTA = 0xFF;     // 设置所有LED为高电平
    PORTB = 0xFF;     // 设置所有LED为高电平

    // 启动DS18B20总线
    PORTC = 0xFF;     // 设置CS为低电平
    _nop_();          // 空操作指令
    PORTC = 0xD9;     // 设置CS为高电平
    _nop_();          // 等待至少480us
    PORTC = 0xFF;     // 再次设置CS为低电平
    _nop_();          // 空操作指令
}

// DS18B20读取温度函数
float DS18B20_ReadTemp(void) {
    uint8_t tempL, tempH;
    uint8_t checksum = 0;
    uint8_t cmd[8] = {0};

    // 发送读取温度命令
    cmd[0] = DS18B20_CMD_READ_SCRATCHPAD;
    cmd[1] = 0;
    cmd[2] = 0;
    cmd[3] = 0;
    cmd[4] = 7;
    cmd[5] = 0;
    cmd[6] = 0;
    cmd[7] = 0;
    PORTC = cmd[0];     // 设置CS为低电平
    _nop_();          // 空操作指令
    PORTC = cmd[7];     // 设置CS为高电平
    _nop_();          // 等待至少480us
    PORTC = cmd[0];     // 再次设置CS为低电平
    _nop_();          // 空操作指令

    // 读取温度数据
    tempL = DS18B20_DATA_PORT & 0x0F; // 读取低字节
    tempH = (DS18B20_DATA_PORT >> 4) & 0x0F; // 读取高字节
    checksum += tempL + tempH; // 计算校验和
    tempL = (tempL << 4) | (tempH >> 4); // 合并高低字节
    tempH = (~tempH) & 0x0F; // 取反高字节并保留低字节
    checksum += tempL + tempH; // 计算校验和
    tempL = (tempL << 4) | (tempH >> 4); // 合并高低字节
    tempH = (~tempH) & 0x0F; // 取反高字节并保留低字节
    checksum += tempL + tempH; // 计算校验和

    // 判断校验和是否正确
    if (checksum == 0) {
        return -1; // 校验和错误,返回-1
    } else {
        return (tempH << 8) | tempL; // 返回温度值(单位:摄氏度)
    }
}

   
这个文件中实现了DS18B20的初始化函数和读取温度函数。在初始化函数中,我们设置了DS18B20的数据引脚、命令引脚以及将CS置为低电平以启动总线。在读取温度函数中,我们首先发送了读取温度的命令,然后读取了温度数据,并计算了校验和。最后,如果校验和正确,则返回温度值;否则返回-1表示校验和错误。

使用特权

评论回复
6
地瓜patch| | 2023-8-14 22:47 | 只看该作者
类似cubemx软件生成的么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

1507

帖子

2

粉丝