找回密码
 立即注册
楼主: 单片机学徒

冲哥32位8051视频学习笔记

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:405
  • 最近打卡:2025-04-16 13:31:35
已绑定手机

5

主题

98

回帖

1938

积分

金牌会员

积分
1938
发表于 2023-6-12 19:58:01 | 显示全部楼层
十七、数模转换器ADC
注意事项:使用ADC功能时Vref引脚的单片机千万千万千万不能悬空,必须接外部参考电压源或者VCC!!!
QQ截图20230612195511.jpg

QQ截图20230612195624.jpg


16、试验箱 -ADC.rar

187.1 KB, 下载次数: 80

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:405
  • 最近打卡:2025-04-16 13:31:35
已绑定手机

5

主题

98

回帖

1938

积分

金牌会员

积分
1938
发表于 2023-6-13 00:07:10 | 显示全部楼层

因为头文件里面少了一个分号,导致一堆错误。。。
查找了半天,Kile的定位功能是在是。。。
QQ截图20230613000436.jpg

QQ截图20230613000500.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:405
  • 最近打卡:2025-04-16 13:31:35
已绑定手机

5

主题

98

回帖

1938

积分

金牌会员

积分
1938
发表于 2023-6-23 11:07:52 | 显示全部楼层
串口的通讯
3个主要函数,初始化、发送、中断(接收)
  1. #include "usart2.h"
  2. #define BRT (65536-(Fosc/115200+2)/4)
  3. bit busy;
  4. char wptr;
  5. char rptr;
  6. char buffer[16];
  7. void USART2_Init(void)
  8. {
  9.         P_SW2=0x80;
  10.     P_SW2 |=0x01;
  11.      
  12.         S2CFG=0x01;
  13.      
  14.         S2CON=0x50;
  15.         T2L=BRT;
  16.         T2H=BRT>>8;
  17.         T2x12=1;
  18.         T2R=1;
  19.      
  20.         wptr=0x00;
  21.         rptr=0x00;
  22.         busy=0;
  23. }
  24. void Uart2Lsr() interrupt 8//串口中断
  25. {
  26.    if(S2TI)
  27.    {
  28.        S2TI=0;
  29.        busy=0;
  30.       
  31.    }
  32.    if(S2RI)
  33.       {
  34.           S2RI=0;
  35.           buffer[wptr++]=S2BUF;
  36.           wptr&=0x0f;
  37.       }
  38. }
  39. void Uart2Send(char dat)
  40. {
  41.     while(busy);
  42.     busy=1;
  43.     S2BUF=dat;
  44. }
  45. void Uart2SendStr(char *p)
  46. {
  47.     while(*p)
  48.     {
  49.         Uart2Send(*p++);
  50.     }
  51. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:405
  • 最近打卡:2025-04-16 13:31:35
已绑定手机

5

主题

98

回帖

1938

积分

金牌会员

积分
1938
发表于 2023-7-3 22:41:09 | 显示全部楼层
串口的应用
MCU串口出来的信号都是TTL电平。
TTL电平信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。
利用实验箱示例代码移植驱动程序

1)查找试验箱里面和我们的功能最接近的程序。
2)先测试示例程序是否正常。
3)分析哪些代码与我们的功能有用。
4)新建文件,开始移植。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:405
  • 最近打卡:2025-04-16 13:31:35
已绑定手机

5

主题

98

回帖

1938

积分

金牌会员

积分
1938
发表于 2023-7-4 21:41:54 | 显示全部楼层
本帖最后由 电子爱好者 于 2023-7-4 21:53 编辑

看门狗
一、复位
复位的主要作用是把单片机内部的特殊功能寄存器置于初始状态,使单片机硬件、软件从一个确定的、唯一的起点开始工作。

相关寄存器
QQ截图20230704213639.jpg

二、看门狗
1、看门狗是什么


看门狗是一个计数器,它的基本功能是在软件问题和程序跑偏后重启系统。看门狗正常工作时会自动计数,程序进程会定时将其归零。如果系统在某个地方卡住了或者跑了,定时器就会溢出,是系统强制复位。

2、看门狗的意义

软件的可靠性一直是一个关键问题。任何使用软件的人都可能遇到电脑死机或程序失控的问题,这种问题在嵌入式系统中也存在。由于单片机抗干扰能力有限,在工业现场仪器仪表中,经常因电压不稳和电弧干扰而死机。在水表、电表无人值守的情况下,系统因干扰无法重启。为了保证系统在受到干扰后能自动恢复正常,看门狗定时器的使用是非常有价值的。
3、看门狗实现原理

在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清理看门狗(也叫喂狗),那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以,在使用有看门狗的芯片时要注意清理看门狗。

4、相关寄存器
微信截图_20230704213544.png

示例代码

看门狗代码示例

看门狗代码示例


代码执行完一次500ms,我们等待喂狗的时间一定要大于500ms!!

  1. RSTFLAG |= 0x04;   //设置看门狗复位需要检测P3.2的状态,否则看门狗复位后进入USB下载模式
复制代码
  1. USB复位代码
  2. USBCON = 0X00;
  3. USBCLK = 0X00;
  4. IRC48MCR = 0X00;
  5. delay_ms(10);
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:405
  • 最近打卡:2025-04-16 13:31:35
已绑定手机

5

主题

98

回帖

1938

积分

金牌会员

积分
1938
发表于 2023-7-18 23:16:23 | 显示全部楼层
DS18B20
  1. #include "DS18B20.h"
  2. u16 Temp=0;
  3. bit MinusFlag;//0负数1正数
  4. void Delay480us()                //@22.1184MHz
  5. {
  6.         unsigned long edata i;
  7.         i = 2653UL;
  8.         while (i) i--;
  9. }
  10. void Delay60us()                //@22.1184MHz
  11. {
  12.         unsigned long edata i;
  13.         _nop_();
  14.         _nop_();
  15.         i = 330UL;
  16.         while (i) i--;
  17. }
  18. void Delay1us()                //@22.1184MHz
  19. {
  20.         unsigned long edata i;
  21.         _nop_();
  22.         i = 4UL;
  23.         while (i) i--;
  24. }
  25. void DS18B20_Reset(void)//复位
  26. {
  27.     bit flag=1;
  28.    while(flag)
  29.    {
  30.         DQ=0;               //输出低电平
  31.         Delay480us();
  32.         DQ=1;               //输出高电平
  33.         Delay60us();
  34.         flag=DQ;            //读取当前电平
  35.         Delay480us();
  36.     }
  37.   }
  38.    
  39.         
  40.   void DS18B20_Write_0(void) //写逻辑0码
  41.   {
  42.         DQ=0;
  43.         Delay60us();
  44.         DQ=1;
  45.         Delay1us();
  46.         Delay1us();      
  47.   }
  48.    void DS18B20_Write_1(void)//写逻辑1码
  49.   {
  50.         DQ=0;
  51.         Delay1us();
  52.         Delay1us();
  53.         DQ=1;
  54.         Delay60us();     
  55.    }
  56.   bit DS18B20_Read(void)
  57.     {
  58.          bit state;
  59.          DQ=0;
  60.          Delay1us();
  61.          Delay1us();
  62.          DQ=1;
  63.          Delay1us();
  64.          Delay1us();
  65.          state=DQ; //读取当前电平
  66.          Delay60us();
  67.          return state;
  68.     }
  69.   
  70.   void DS18B20_WriteByte(u8 dat)//写一个字节
  71.   {
  72.     u8 i;
  73.       for(i=0;i<8;i++)
  74.       {
  75.         if(dat&0x01)
  76.           DS18B20_Write_1();
  77.         else
  78.            DS18B20_Write_0();
  79.         dat>>=1;
  80.         
  81.       }
  82.   }
  83.   u8 DS18B20_ReadByte(void)//读一个字节
  84.     {
  85.         u8 i;
  86.         u8 dat=0;
  87.         for(i=0;i<8;i++)
  88.             {
  89.                 dat>>=1;
  90.                 if(DS18B20_Read())//如果读取到的是1
  91.                     dat|=0x80;
  92.             }
  93.         
  94.         return dat;
  95.     }
  96.    
  97.     u16  DS18B20_ReadTemp(void)//读取并且换算温度,并返回
  98.     {
  99.         u8 TempH;
  100.         u8 TempL;
  101.         u16 temperture;
  102.         //1、复位
  103.       DS18B20_Reset();
  104.         //2、调过rom指令     
  105.         DS18B20_WriteByte(0xCC);
  106.         //3、开始转化
  107.         DS18B20_WriteByte(0x44);
  108.         
  109.         while(!DQ);//4、等待DQ变成高电平
  110.          DS18B20_Reset();
  111.         DS18B20_WriteByte(0xCC);
  112.         DS18B20_WriteByte(0xBE);
  113.       //读回温度  
  114.      TempL = DS18B20_ReadByte();
  115.      TempH = DS18B20_ReadByte();
  116.      
  117.         if(TempH&0xf8)
  118.             {
  119.                MinusFlag=0;
  120.                temperture=((TempH<<8)|TempL);
  121.                temperture=(~temperture)+1;
  122.                temperture=temperture*10*0.0625;//保留一位小数的温度
  123.             }
  124.         else
  125.             {
  126.                 MinusFlag=1;
  127.                 temperture=((TempH<<8)|TempL);
  128.                 temperture=temperture*10*0.0625;//保留一位小数的温度
  129.             }
  130.               Temp= temperture;
  131.               return temperture;//保留一位小数的温度
  132.     }
复制代码
  1. #ifndef __DS18B20_H
  2. #define __DS18B20_H
  3. #include <STC32G.H>
  4. #include "COMM/usb.h"
  5. //------------------------引脚定义---------------------------------
  6. #define DQ P33
  7. //------------------------变量声明----------------------------------
  8. extern u16 Temp;
  9. extern bit MinusFlag;
  10. //------------------------函数声明----------------------------------
  11. void DS18B20_Reset(void);
  12. void DS18B20_Write_0(void);
  13. void DS18B20_Write_1(void);
  14. bit DS18B20_Read(void);
  15. void DS18B20_WriteByte(u8 dat);
  16. u8 DS18B20_ReadByte(void);
  17. u16 DS18B20_ReadTemp(void);
  18. #endif
复制代码




回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 15:46 , Processed in 0.147981 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表