先说问题,论坛老问题,程序下不进去,有可能是D10的问题,感觉还是电路设计的不好,用USB转232一点问题没有,照片都准备好了,一点一点贴。
板载USB转串口下载及其不好用,经常出现串口号丢失的问题。于是利用STC15F104E 8脚芯片制作了一个自动下载配件。
对目标单片机进行冷启动,实现断电、再上电,可以用三极管作为电子开关实现。必须注意到的是,三极管的最大可通过电流不要小于单片机电路的所需电流。如果三极管仅作为单片机供电的开关,由于STC89系列单片机的正常丁作模式功耗为2~7 mA,90系列三极管通常情况下可以满足需求。但在某些情况下,单片机的串口上电后会给单片机供电,使单片机各引脚电平处于不确定的状态,因而必须对目标电路板整体进行冷启动,三极管必须满足目标电路板的总电流需求。由于三极管8550的最大可通过电流为1.5 A,可以满足绝大多数电路的供电需求。所以选择三极管8550连接到目标单片机STC89C52RC的VCC脚,作为对其冷启动的开关。
/********************************************************************************/
视频可能需要上传,可能要审核得等几天,先传一张照片
——回复可见内容——
DS18B20:
正确的接线方法:左负右正,一旦接反就会立刻发热,有可能烧毁!接反是导致该传感器总是显示85℃的原因。面对着扁平的那一面,左负右正。
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢
型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
经过单线接口访问 DS1820 的协议 如下~~
首先,我们对18B20进行操作,我们要对其初始化,
初始化:单线总线上的所有处理均从初始化序列开始 初始化序列包括总线主机发出一复位脉冲 接着
初始化子程序:
ROM操作命令:
写操作:
写数据子程序
WriteOneChar(unsigned char dat) //unsigned char dat 定义存控制命令;以下对命令操作
unsigned char i=0;
for(i=8;i>0;i--) //因为写一个字节 ,所以要循环八次
{
DQ=1; //置高电平
DQ=dat&0x01; //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0。
void ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
DQ=1; //将总线拉高 产生读时间隙
1. 初始化
2. ROM 操作命令
3. 存贮器操作命令
4. 处理/数据
由从属器件送出存在脉冲
Init_DS18B20(void)
{
unsigned char x=0;定义一个变量判断是否初始化程序
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
当主机总线 t o 时刻从高拉至低电平时 就产生写时间隙 见图
从 to 时刻开始 15us 之内应将所需写的位送到总线上 DSl820 在 t 后15-60us间对总线
采样 若低电平 写入的位是 0 见图 2 25 3 若高电平 写入的位是 1 见图 2 25 4
连续写 2 位间的间隙应大于 1us 即必须有1us以上的高电平恢复期。
{
_nop_(); //在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=0; //进入写开始
_nop_();
delay(5); //向1-Wire总线写1bit至少需要60μs
dat>>=1; //因为写数据是从低位到高位,高位逐位的往右移
}
}
读操作
见图2 25 5 主机总线 to 时刻从高拉至低电平时 总线只须保持低电平 l 7ts 之后
在 t1 时刻将总线拉高 产生读时间隙 读时间隙在 t1 时刻后 t 2 时刻前有效 t z 距 to 为15
捍 s 也就是说 t z 时刻前主机必须完成读位 并在 t o 后的60尸 s 一 120 fzs 内释放总线
读位子程序(读得的位到 C 中)
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0; //首先初始化dat
for (i=8;i>0;i--) //一个字节有8位 ,所以循环八次
{
DQ=1;
delay(1);
DQ=0; //从高拉至低电平时 总线只须保持低电平 l 7ts
dat>>=1; // 读出来的数据要一位一位的移进去
_nop_();
if(DQ) //判断DQ是1还是0
dat|=0x80; //是1的话dat就高位1或,因为读数据是从低位读取 delay(4);
}
return(dat); //返回读出来的一个字节数据
}
传一个用VB写的关于温度计的上位机,配合单片机串口程序在电脑端实时显示温度曲线
Public sina As Variant Public sinb As Variant Public sinc As Variant Public sind As Variant Public sine As Variant Public i As Variant Private Sub Command1_Click() If Command1.Caption = "关闭串口" Then MSComm1.PortOpen = False Command1.Caption = "打开串口" Timer1.Enabled = False Else Command1.Caption = "关闭串口" MSComm1.CommPort = Combo1.Text MSComm1.Settings = "" '"Combo2.text"'","'" combo3.text "'", "'" combo4.text "'" , "'"combo5.text "'"" MSComm1.InputMode = 0 MSComm1.PortOpen = True Timer1.Enabled = True End If End Sub Private Sub Form_Load() Dim i As Integer '生成串口号 For i = 1 To 20 With Combo1 .AddItem i End With Next Combo2.AddItem "600" Combo2.AddItem "1200" Combo2.AddItem "2400" Combo2.AddItem "4800" Combo2.AddItem "9600" Combo2.AddItem "57600" Combo2.AddItem "115200" Combo3.AddItem "n" Combo3.AddItem "e" Combo3.AddItem "o" Combo3.AddItem "s" Combo3.AddItem "m" Combo4.AddItem "8" Combo4.AddItem "9" Combo5.AddItem "1" Combo5.AddItem "1.5" Combo5.AddItem "2" i = 100 sina = 0 sind = 1400 sinc = 0 End Sub Private Sub Timer1_Timer() Dim buf$ Dim v As Double buf = Trim(MSComm1.Input) If Len(buf) <> 0 Then sina = sinc sinb = sind v = Asc(buf) + 256 '只传了低八位,所以直接加256,相当于把接受的数据& 0001 0000 0000 v = v / 10 Text1.Text = Text1.Text + Str(v) + Chr(13) + Chr(10) sinc = (sina + 100) sind = (Asc(buf) * 20) sine = Val(2000) Form1.Picture1.Line (sina, 5000 - sinb)-(sinc, 5000 - sind), sine If sinc = 10000 Then Picture1.Cls sina = 0 sinc = 0 End If End If End Sub Private Sub cmdquite_chick() MSComm1.PortOpen = False Unload Me End Sub
等一会再传一个EXE可执行文件
程序数据处理比较特殊
uint tmp() //get the temperature { float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp<<=8; //two byte compose a int variable temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; }
这个是单片机读18B20,传感器是12数据,但是我们只传送了低八位,因为常温状态下第九位为1,所以加256
ii =tmp(); // SBUF=ii>>8; // while(TI==0);//???????? // TI=0;//?????? // SBUF=ii; while(TI==0);//???????? TI=0;//??????
打赏帖 | |
---|---|
【Zephyr】使用Zephyr外设初始化过程解析被打赏30分 | |
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
赚取电动螺丝刀+电源电路理论知识分享1被打赏5分 | |
我想要一部加热台+分享常见运算放大器电路的应用被打赏5分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
我想要一部加热台+常见的MOS管驱动电路被打赏5分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录被打赏29分 | |
【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案被打赏20分 |