单片机学徒
发表于 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