wordpress漫画网站,wordpress根据点击量最高查询文章,如何在国外做网站,wordpress云LDE灯的相关程序
LED灯闪烁 LED流水灯
方法1 方法二#xff1a;
因为P1口可以直接控制P1^0~P1^7的8个led灯#xff0c;利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。 蜂鸣器的使用
什么是蜂鸣器#xff1f;
蜂鸣器是一种一…LDE灯的相关程序
LED灯闪烁 LED流水灯
方法1 方法二
因为P1口可以直接控制P1^0~P1^7的8个led灯利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。 蜂鸣器的使用
什么是蜂鸣器
蜂鸣器是一种一体化结构的电子发生器主要是用来起到报警的作用。
蜂鸣器分类
有源蜂鸣器
内部有震荡源所以只要通电就会鸣叫控制比较方便。
无源蜂鸣器
内部不带震荡源所以通电不能让它直接鸣叫必须使用2K~5K的方波去驱动它声音频率可以调整。
什么是三极管
一种控制电流的半导体器件作用就是把微弱的电信号放大成更大幅度的电信号在电路中主要作用于开关和放大电流的作用。
三级管有三个引脚B基极、C集电极、E发射极。
PNP三极管的图示 关键点在于B极和E极之间的电压情况对于PNP而言只要E极电话高于B极0.7V以上这个三极管就可以顺利导通。
方波
一种非正弦曲线的波形通常会与电子和讯号处理的时候出现。
理想的方波只有高和低这两个值救护车的声音频率高频是1000Hz 低频是 750Hz。
1000HZ的分析 750HZ的分析 方波图 代码实现 数码管的使用
数码管显示数字的原理
数码管的电路图 数码管段选图 不同的数字对应的P0口应该传递的16进制数字不带小数点的 数码管显示指定数字 数码管显示动态数字 按键的使用
按键消抖
当物理按键按下或者弹起的时候电平都不是立即为0或者立即为1的会出现抖动的情况所以要进行消抖操作。
按键按下一次的时候电平变化 代码演示 DS18B20温度传感器的使用
简介
DS18B20是一款常用的高精度单总线数字温度测量芯片体积小占用资源少抗干扰能力强。 使用方法说明
图示 由于温度传感器的电路设计原因必须按照如下顺序进行操作才能成功
1、先复位
2、执行一次ROM指令
3、执行一次RAM指令
注意 一次ROM只能搭配一次RAM
完成温度读取的步骤
先做温度转换
复位和检测每次发命令之前都要先进行复位检测目的是检测当前温度传感器的状态是否正常。
按照ROM指令表发送0xCC来跳过ROM存储器因为设备上只有一个DS18B20所以不需要进行其他的寻址等操作。
按照RAM指令表发送0x44来启动温度传感器降温度转化为数字信号存储到RAM中。
读取温度数据
复位和检测
给ROM发送0xCC跳过ROM存储器
给RAM发送0xBE来读取RAM暂存器中的温度数据读取温度低位读取温度高位。
温度的转化问题
图示 原码、反码和补码
原码
最高位是符号位0表示正数1表示负数。
反码
最高位是符号位0表示正数1表示负数
正数的反码是它本身负数的反码除了符号位以外各位取反。
补码
最高位是符号位0表示正数1表示负数
正数的补码也是它本身负数的补码是反码1
如原码是1011 对应反码是1100 补码就是 1101
设计补码的目的就是能够和其相反数相加通过溢出的方式从而使计算机内的结果变为合理的二进制码。
例比如1 和 -1相加 正常的结果是0如果用原码计算0001 1001 1010结果是-2 这样的结果是错误的利用补码实现0001 1111 10000 将最高位的1溢出 结果就变成了0000这样的结果是正确的。
DS18B20的时序问题
初始化时序
图示 单总线上所有的通信都是从初始化时序开始的主机输出低电平保持低电平至少480us实际在480~960us之间都可以以产生复位脉冲。
接着主机释放总线将电平拉高延时15~60us进入接受模式接着DS18B20会自己拉低总线60~240us会产生应答脉冲如果是低电平会延时一段时间之后会上拉电阻至少480us结束。
代码 写时序
图示 说明
写0时序主机输出低电平60us以后拉高电平 延时一会让电平稳定。
写1时序主机输出低先平立即拉高然后延时60us即可。
按位与()
按位与遵循的原则两个二进制数对应的每一位如果都是1结果就是1否则0。 代码演示 读时序
图示 说明
单总线仅在主机发出读时序的时候才向主机传输数据所以在发出读数据命令之后必须马上产生读时序以便从机能够发送输出给主机。
所有的读时序都需要60us的时间 并且要在两次独立的读时序之间要间隔至少1us。主机在读时序期间必须要释放总线并且在时序起始后的15us采样数据。
按位或(|)
对应的两个数字如果有一个为1那么结果就是1否则结果为0。 代码 使用DS18B20温度传感器完成温度检测并在数码管上显示
// DS18B20的温度传感器程序
#include reg51.h
// 定义温度传感器的引脚变量
sbit DQP3^7;
// 定义不带小数点的数字数组
unsigned char arr1[10] {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
// 定义带小数点的数字数组
unsigned char arr2[10] {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
// 定义全局变量来保存温度的低八位和高八位
unsigned char tempL 0;
unsigned char tempH 0;// 定义一个变量来确定温度到底是正值还是负值
unsigned char flag1;
// 定义变量存放温度值的整数部分
unsigned int sdata;// 定义变量来存放小数第一位和第二位
unsigned char xiaoshu1;
unsigned char xiaoshu2;
// 定义延时函数
// 这个延时程序的具体延时时间是 time(us) i * 8 10 适用于2ms之内的延时
void delay(unsigned char i)
{for(i; i 0; i--);
}
// 初始化程序
unsigned char Init_DS18B20()
{unsigned char x 0;DQ1; // 先让DS18B20稳定在高电平的状态先拉高delay(8); // 延时74us准备开始初始化时序DQ0; // 发送低电平开始发送低电压的脉冲信号delay(80); // 等待650us在480us到960us之间DQ1; // 拉高总线delay(5); // 延时50us在15us到60us之间 等待DS18B20反应准备接收DS18B20发送的数据x DQ; // 用x来接受DS18B20返回的电平值如果DS18B20初始化成功X的值就是0否则为1delay(30); // 等待一会完成整个的初始化时序。return x;
}// 写函数
// 调用一次写入一个字节
void writeOneChar(unsigned char dat)
{unsigned char i0;for(i 8;i 0;i--) // 循环8次每次写入一位写完8位 就是一个字节{DQ0; // 不论写0还是写1都需要先拉低总线// 从最低位开始写让dat和0x01进行与操作获取最低位数字发送给DS18B20DQdat0x01;delay(5); // 继续延时等待DS18B20采样完成DQ1; // 释放总线dat1; // 将dat的值直接右移将下一位的值移动到最低位再重新赋值给dat用来下次获取最低位数据delay(2); // 执行完一个写数字的程序等待一下 准备开始下次写程序。}
}// 读函数
// 循环8次可以读完一个字节
unsigned char readOneChar()
{unsigned char dat0; // 准备一个变量来接受读出来的一个字节的数据unsigned int i ;for(i 0; i 8 ;i){DQ1;// 先拉高电平进入准备工作delay(1); // 可以让每次的读时序间隔1us以上实际等待了18usDQ0; // 拉低总线delay(1); // 延时18us// 将dat右移一位因为实际保存的数据是8位数据。// 但是在每次保存之后进行位移总共位移7次所以要将第一次位移给取消掉dat1; // 如果读到的DQ是1 进行下面判断将1写入dat如果是0就直接进行右移将0保存下来即可DQ1; // 释放总线回到高电平会产生读信号。// 因为DS18B20如果发送的是一个0的数据产生读信号之后仍然会将总线设置为低电平持续完读时序之后才释放总线// 如果DS18B20要发送的是一个1的数据产生读信号之后会直接释放总线那么我们读到的就是高电平。// 如果读到的DQ是高电平就直接与0x80进行按位或运算, 将数据直接写到dat中if(DQ){// dat 0000 0000// 0x80 1000 0000// 1000 0000// 右移一位// 0100 0000// dat 0100 0000// 0x80 1000 0000// 1100 0000// 0110 0000dat|0x80;}delay(4); // 等待42us完成整个的读时序}return dat;
}// 读取温度值
void readTemperature()
{while(Init_Ds18B20()); // 初始化writeOneChar(0xcc); // 跳过ROM读序列号的操作writeOneChar(0x44); // 命令DS18B20开始温度转化delay(124); // 等一会开始下一次的执行步骤while(Init_Ds18B20()); // 初始化writeOneChar(0xcc); // 跳过ROM读序列号的操作writeOneChar(0xbe); // 开始读暂存器的数据tempL readOneChar(); // 读取温度值的低8位 LSBtempH readOneChar(); // 读取温度值的高8位 MSB// 将读取到的温度值进行转化成实际温度// LSB 1111 1100// MSB 0000 0111// 0000 0111 0000 0000// 0000 0000 1111 1100// 0000 0111 1111 1100// 判断温度是否负值如果是负值就取反加1如果是正值就不做处理if(tempH0x7f){tempL ~tempL 1;tempH ~tempH;flag 0;}sdata (float)(tempH 8 | tempL) / 16.0; // 整数部分计算// 计算小数一位xiaoshu1 (tempL0x0f)*10/16;// 计算小数二位xiaoshu2 (tempL0x0f)*100/16%10;
}void led()
{if(flag){P20xfe;// 打开第一个数码管P0arr1[sdata/10]; // 显示十位数P00xff;P20xfd;// 打开第二个数码管P0arr2[sdata%10]; // 显示个位数P00xff;P20xfb;// 打开第三个数码管P0arr1[xiaoshu1]; // 显示小数第一位P00xff;P20xf7;// 打开第四个数码管P0arr1[xiaoshu2]; // 显示小数第二位P00xff;}else{P20xfe;// 打开第一个数码管P00xbf; // 显示负号P00xff;P20xfd;// 打开第二个数码管P0arr1[sdata/10]; // 显示十位数P00xff;P20xfb;// 打开第三个数码管P0arr2[sdata%10]; // 显示整数个位P00xff;P20xf7;// 打开第四个数码管P0arr1[xiaoshu1]; // 显示小数第一位P00xff;}}// 定义蜂鸣器
sbit beef P3^6;
// 报警程序
void alarm()
{if(sdata 25){beef !beef;}else{beef 1;}
}
void main()
{while(1){readTemperature();led();}
}