单片机学徒 发表于 2023-6-12 19:58:01

十七、数模转换器ADC
注意事项:使用ADC功能时有Vref引脚的单片机千万千万千万不能悬空,必须接外部参考电压源或者VCC!!!





单片机学徒 发表于 2023-6-13 00:07:10


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




单片机学徒 发表于 2023-6-23 11:07:52

串口的通讯
3个主要函数,初始化、发送、中断(接收)
#include "usart2.h"

#define BRT (65536-(Fosc/115200+2)/4)

bit busy;
char wptr;
char rptr;
char buffer;


void USART2_Init(void)
{
        P_SW2=0x80;
    P_SW2 |=0x01;
   
        S2CFG=0x01;
   
        S2CON=0x50;
        T2L=BRT;
        T2H=BRT>>8;
        T2x12=1;
        T2R=1;
   
        wptr=0x00;
        rptr=0x00;
        busy=0;
}

void Uart2Lsr() interrupt 8//串口中断
{
   if(S2TI)
   {
       S2TI=0;
       busy=0;
      
   }
   if(S2RI)
      {
          S2RI=0;
          buffer=S2BUF;
          wptr&=0x0f;
      }
}
void Uart2Send(char dat)
{
    while(busy);
    busy=1;
    S2BUF=dat;
}
void Uart2SendStr(char *p)
{
    while(*p)
    {
      Uart2Send(*p++);
    }
}


单片机学徒 发表于 2023-7-3 22:41:09

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

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

单片机学徒 发表于 2023-7-4 21:41:54

本帖最后由 电子爱好者 于 2023-7-4 21:53 编辑

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

相关寄存器


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


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

2、看门狗的意义

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

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

4、相关寄存器


示例代码



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

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

单片机学徒 发表于 2023-7-18 23:16:23

DS18B20
#include "DS18B20.h"

u16 Temp=0;
bit MinusFlag;//0负数1正数
void Delay480us()                //@22.1184MHz
{
        unsigned long edata i;

        i = 2653UL;
        while (i) i--;
}
void Delay60us()                //@22.1184MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 330UL;
        while (i) i--;
}
void Delay1us()                //@22.1184MHz
{
        unsigned long edata i;

        _nop_();
        i = 4UL;
        while (i) i--;
}

void DS18B20_Reset(void)//复位
{
    bit flag=1;
   while(flag)
   {
      DQ=0;               //输出低电平
      Delay480us();
      DQ=1;               //输出高电平
      Delay60us();
      flag=DQ;            //读取当前电平
      Delay480us();
    }
}
   
      
void DS18B20_Write_0(void) //写逻辑0码
{
      DQ=0;
      Delay60us();
      DQ=1;
      Delay1us();
      Delay1us();      
}
   void DS18B20_Write_1(void)//写逻辑1码
{
      DQ=0;
      Delay1us();
      Delay1us();
      DQ=1;
      Delay60us();   
   }
bit DS18B20_Read(void)
    {
         bit state;
         DQ=0;
         Delay1us();
         Delay1us();
         DQ=1;
         Delay1us();
         Delay1us();
         state=DQ; //读取当前电平
         Delay60us();
         return state;
    }


void DS18B20_WriteByte(u8 dat)//写一个字节
{
    u8 i;
      for(i=0;i<8;i++)
      {
      if(dat&0x01)
          DS18B20_Write_1();
      else
         DS18B20_Write_0();
      dat>>=1;
      
      }
}
u8 DS18B20_ReadByte(void)//读一个字节
    {
      u8 i;
      u8 dat=0;
      for(i=0;i<8;i++)
            {
                dat>>=1;
                if(DS18B20_Read())//如果读取到的是1
                  dat|=0x80;
            }
      
      return dat;
    }
   
    u16DS18B20_ReadTemp(void)//读取并且换算温度,并返回
    {
      u8 TempH;
      u8 TempL;
      u16 temperture;
      //1、复位
      DS18B20_Reset();
      //2、调过rom指令   
      DS18B20_WriteByte(0xCC);
      //3、开始转化
      DS18B20_WriteByte(0x44);
      
      while(!DQ);//4、等待DQ变成高电平
         DS18B20_Reset();
      DS18B20_WriteByte(0xCC);
      DS18B20_WriteByte(0xBE);
      //读回温度
   TempL = DS18B20_ReadByte();
   TempH = DS18B20_ReadByte();
   
      if(TempH&0xf8)
            {
               MinusFlag=0;
               temperture=((TempH<<8)|TempL);
               temperture=(~temperture)+1;
               temperture=temperture*10*0.0625;//保留一位小数的温度
            }
      else
            {
                MinusFlag=1;
                temperture=((TempH<<8)|TempL);
                temperture=temperture*10*0.0625;//保留一位小数的温度
            }
            Temp= temperture;
            return temperture;//保留一位小数的温度
    }#ifndef __DS18B20_H
#define __DS18B20_H

#include <STC32G.H>
#include "COMM/usb.h"

//------------------------引脚定义---------------------------------

#define DQ P33
//------------------------变量声明----------------------------------
extern u16 Temp;
extern bit MinusFlag;
//------------------------函数声明----------------------------------
void DS18B20_Reset(void);
void DS18B20_Write_0(void);
void DS18B20_Write_1(void);
bit DS18B20_Read(void);
void DS18B20_WriteByte(u8 dat);
u8 DS18B20_ReadByte(void);

u16 DS18B20_ReadTemp(void);
#endif



页: 1 2 [3]
查看完整版本: 冲哥32位8051视频学习笔记