[PIC®/AVR®/dsPIC®产品] 用讯飞星火帮我写一个点灯,写的还挺好

[复制链接]
696|6
 楼主| 小明的同学 发表于 2023-8-14 21:05 | 显示全部楼层 |阅读模式

  1. #include <xc.h>

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

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 小明的同学 发表于 2023-8-14 21:10 | 显示全部楼层
这个程序将使连接到RA0和RB0引脚的所有LED都闪烁。在主循环中,我们首先将所有LED关闭,然后等待一段时间,再将所有LED打开,并再次等待一段时间。这个过程不断重复,从而使LED闪烁。
 楼主| 小明的同学 发表于 2023-8-14 21:11 | 显示全部楼层
我继续提问:如何用该单片机驱动DS18B20?
讯飞星火:
DS18B20是一款数字温度传感器,采用的是单总线时序与主机通信,只需要一根线就可以完成温度数据读取。下面是一个简单的驱动程序,你可以将其添加到你的PIC18F系列单片机中:
  1. #include <xc.h>
  2. #include "ds18b20.h"

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

  8.     DS18B20_Init(); // 初始化DS18B20

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

 楼主| 小明的同学 发表于 2023-8-14 21:13 | 显示全部楼层
我一看,我了个去,没有头文件代码我怎么知道如何实现呢?
继续提问:以上代码中头文件包含的ds18b20.h给我提供一下,谢谢。


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

  3. #include <stdint.h>

  4. // DS18B20数据引脚定义
  5. #define DS18B20_DATA_PORT PORTC
  6. #define DS18B20_DATA_PIN 3

  7. // DS18B20命令定义
  8. #define DS18B20_CMD_READ_SCRATCHPAD 0xCC
  9. #define DS18B20_CMD_CONVERT_TARE 0x44
  10. #define DS18B20_CMD_WRITE_SCRATCHPAD 0xCC
  11. #define DS18B20_CMD_DISPLAY_ON 0xAF
  12. #define DS18B20_CMD_DISPLAY_OFF 0xA5

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

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

  17. #endif // DS18B20_H

这个头文件包含了DS18B20的数据引脚定义、命令定义和初始化函数以及读取温度函数的声明。你需要将这个头文件添加到你的PIC18F系列单片机项目中,并在你的主程序中包含它。
 楼主| 小明的同学 发表于 2023-8-14 21:16 | 显示全部楼层
它还是没告诉我怎么实现那个函数,我继续问它。
我:这个头文件中关于两个函数的实现对应的.c文件的内容告诉我一下。
讯飞:好的,以下是DS18B20.c文件的代码:
  1. #include "ds18b20.h"

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

  5. // DS18B20命令定义
  6. #define DS18B20_CMD_READ_SCRATCHPAD 0xCC
  7. #define DS18B20_CMD_CONVERT_TARE 0x44
  8. #define DS18B20_CMD_WRITE_SCRATCHPAD 0xCC
  9. #define DS18B20_CMD_DISPLAY_ON 0xAF
  10. #define DS18B20_CMD_DISPLAY_OFF 0xA5

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

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

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

  30.     // 发送读取温度命令
  31.     cmd[0] = DS18B20_CMD_READ_SCRATCHPAD;
  32.     cmd[1] = 0;
  33.     cmd[2] = 0;
  34.     cmd[3] = 0;
  35.     cmd[4] = 7;
  36.     cmd[5] = 0;
  37.     cmd[6] = 0;
  38.     cmd[7] = 0;
  39.     PORTC = cmd[0];     // 设置CS为低电平
  40.     _nop_();          // 空操作指令
  41.     PORTC = cmd[7];     // 设置CS为高电平
  42.     _nop_();          // 等待至少480us
  43.     PORTC = cmd[0];     // 再次设置CS为低电平
  44.     _nop_();          // 空操作指令

  45.     // 读取温度数据
  46.     tempL = DS18B20_DATA_PORT & 0x0F; // 读取低字节
  47.     tempH = (DS18B20_DATA_PORT >> 4) & 0x0F; // 读取高字节
  48.     checksum += tempL + tempH; // 计算校验和
  49.     tempL = (tempL << 4) | (tempH >> 4); // 合并高低字节
  50.     tempH = (~tempH) & 0x0F; // 取反高字节并保留低字节
  51.     checksum += tempL + tempH; // 计算校验和
  52.     tempL = (tempL << 4) | (tempH >> 4); // 合并高低字节
  53.     tempH = (~tempH) & 0x0F; // 取反高字节并保留低字节
  54.     checksum += tempL + tempH; // 计算校验和

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

   
这个文件中实现了DS18B20的初始化函数和读取温度函数。在初始化函数中,我们设置了DS18B20的数据引脚、命令引脚以及将CS置为低电平以启动总线。在读取温度函数中,我们首先发送了读取温度的命令,然后读取了温度数据,并计算了校验和。最后,如果校验和正确,则返回温度值;否则返回-1表示校验和错误。
地瓜patch 发表于 2023-8-14 22:47 来自手机 | 显示全部楼层
类似cubemx软件生成的么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

1640

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部