微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机学习总结实例

51单片机学习总结实例

时间:11-19 来源:互联网 点击:

9.看门狗

//
关于51单片机中的看门狗寄存器
D5 EN_WDT 看门狗允许位
D4 CLK_WDT 看门狗清零
D3 IDLE_WDT 看门狗IDLE模式位
PS0 PS1 PS2 看门狗定时器预分频值
这三个寄存器置不同的值决定不同的看门狗溢出时间
看门狗溢出时间=(N*预分频数*32768)/晶振频率
#include
#define uchar unsigned char
#define uint unsigned int
sfr WDT_CONTR=0xe1;//定义看门狗寄存器 reg52.h中没有对它进行定义
sbit led1=P1^0;
void delayms(uint xms)
{
uint i,j;
for(i=xms;j>0;j--)
for(j=110;j>0;j--);
}

void main()
{
WDT_CONTR=0x35;//0x35=0011 0101设置预分频数为 64 溢出时间为2.0971s
led1=0;
delayms(500);
led1=1;
while(1)
{
delayms(1000);
WDT_CONTR=0x35;//喂狗语句将D4不断置1,一旦D4被清零则看门狗复位
}
}

10.软件实现系统复位

STC ISP/IAP控制寄存器(ISP_CONTR)
D7 ISPEN 功能允许位 0禁止编程改变flash 1允许
D6 SWBS 0软件选择从用户应用程序区启动 1从ISP程序区启动
D5 SWRST 不操作 1产生系统软件复位,硬件自动清零
D2 WT2
D1 WT1
D0 WT0 编程设定CPU等待的最长时间,对flash进行读操作,写操作,擦除操作必须在这个时间内
SWBS=0 SWRST=1(软复位) 从用户应用程序区(AP区)软件复位并切换到用户应用程序区开始执行程序
从哪里复位取决于程序在哪里执行
SWBS=1 SWRST=1 从ISP监控程序区软件复位并切换ISP监控程序区开始执行程序
使用方法:
进行软件复位时
首先
sfr ISP_CONTR=0xe7;定义ISP/IAP控制寄存器
然后再需要软件复位的地方加入如下语句即可
ISP_CONTR=0x20//用软件复位到用户应用程序区(AP),重新开始执行程序

11.DS18B20编程应用子函数

//
Ds18B20的编程子函数
DS18B20是单总线接口的温度传感器,应用范围很广泛

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;//温度传感器信号线
uint temp;//定义整型的温度数据
float temp;//定义浮点型的温度数据
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void dsreset(void)//DS18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}

bit tempreadbit(void)//读1位数据函数
{
uint i;
bit dat;
ds=0;i++;//i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}

uchar tempread(void)//读1个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uchar dat)//向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else//写0
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}

void tempchange(void)//DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);//写 跳过读ROM指令
tempwritebyte(0x44);//写 温度转换指令
}

uint get_temp()
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);//读内部ram中的9字节
a=tempread();//读低8位
b=tempreda();//读高8位
temp=b;
temp<=8;
temp=temp | a;//两个字节组合为1个字
f_temp = temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625 厂家出厂时默认精度为12位,所以乘以0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取一位,加0.5是为了四舍五入
f_temp=f_temp+0.05;
return temp;
}

12.内部ram的扩展

51单片机存储器模式一共有三种
small模式 默认变量存储在单片机内部的128B RAM中
无声明均以这个模式存储
compact模式 默认变量存储在单片机内部的 256B RAM中
关键字 pdata :unsinged char pdata a[100]
large 模式 默认变量均存储在64K的RAM区包括内部ram和外部ram
关键字 xdata:unsingned char xdata a[100]
三种模式的不同:访问速度由快到慢

这个博客里的涉及的源代码大家可以在这里下载http://download.csdn.net/detail/zhaole20094463/4427745

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top