矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: pdshyh

请教C52单片机DS18B20温度传感器串口显的制作

[复制链接]
     
发表于 2019-3-21 16:44:28 | 显示全部楼层
本帖最后由 washu 于 2019-3-21 16:50 编辑
pdshyh 发表于 2019-3-21 13:27
washu 老师好,Atmel Studio 7下载安装好了,Arduino和 Ateml Studio都能用下载STK500来烧录,不知道Fast ...


Arduino 是不用 STK500 的,直接插上 USB 线就能用 Arduino IDE 下载程序。你买那个据称兼容 Arduino 的 M328 板按理说就可以这样玩,你可以试试,用 Arduino IDE 写一个最简单的例程,然后下载进去看看行不行 具体怎么做你得自己找找,毕竟我不用 Arduino。

Atmel Studio 配合 STK500 则是标准玩法,鉴于 Arduino 在 AVR 的 Bootloader 放了一段程序,所以你最好取下板子上的 M328,然后将 M8 插上,接通电源。然后,山寨 STK500 先接入电脑,安装驱动(一般这种山寨货是用 PL2303 这样的 USB to UART 转换芯片)等驱动安装好后(检查设备管理器将多出一个串口号),第一次使用要配置一下,在 Atmel Studio 中点“工具”菜单,点“添加对象”:
cr11001.png

然后选择工具这里,在下拉表单中选择 STK500,端口选择山寨 STK500 安装驱动后多出来的那个串口号,然后点“应用”
cr11002.png

然后在 Atmel Studio 中点“工具”菜单,点“烧录程序”:
cr11003.png


在出现的界面中,看看“工具”的下拉表单里如果出现 STK500 说明山寨 STK500 可用了
cr11006.png

此时,可以把山寨 STK500 插到你的核心板的 ISP 插座上,类似这样:
微信图片_20190321161959.jpg

连接好山寨 STK500 和 AVR 核心板后,在设备下拉表单中选择单片机型号,比如这里用的是 M8,选择 ATMega8,接口 ISP,点“应用”,然后就可以读写单片机了。默认的,首先是 ISP 接口速度设置,默认是 115.2k,因为刚出厂的 M8,配置为片内振荡器,频率 1MHZ,所以接口速度 115.2k 比较合理。

然后特定于我给你写的 18b20 + 串口程序,我用的是 7.3728MHZ 片外晶振,所以需要更改时钟源,点“熔丝”进入更改页面,在 CKSET 下拉表单中选择“外部高频晶振,启动延迟 16 CK + 64ms”:
cr11008.png

非常重要:这一步是建立在你买的那个核心板有外部晶振的情况下才可以做的,否则一旦配置,单片机就不能工作了!如果你买那个 328 板没有外部晶振,你可以选择一个频率比较高的内部时钟,比如 8MHZ 内部 RC 振荡器之类。由于 18b20 总线读写需要数 us 级别的延迟,所以单片机时钟至少要有 4MHZ 才能实现。

程序代码头部的 CPU 时钟设置必须和这里的一致,
F_CPU 是 delay() 函数使用的时钟频率设置
FOSC 是串口使用的时钟频率设置

如果你的核心板外部晶振不是 7.3728MHZ,或使用了内部振荡器,那么需要更改这里为实际值。值得注意的是,如果时钟频率不是串口波特率的整倍数,那么串口通信的错误率会很高,所以最好看看你的核心板有无类似 7.3728MHZ(也可以是 3.6864、11.0592)外部晶振。

配置完熔丝后,点“存储”进入烧程序页面,固件路径在 Flash 文本框中,按“Program”按钮即可烧入单片机:
cr11009.png

这里的 1Wire(18b20).elf 是 Atmel Studio 编译产生的:
cr11005.png

如果用 FastAVR 编译的话,则点 Flash 文本框右侧的“...”按钮,定位到 FastAVR 生成固件(通常位于源程序所在)的文件夹,找到 FastAVR 编译出来的固件(通常是 .hex 后缀):
cr11010.png

然后按“Program”按钮即可烧入单片机:
cr11012.png



回复 支持 反对

使用道具 举报

     
发表于 2019-3-21 17:14:00 | 显示全部楼层
有关的题外话:

CPU 需要有时钟才能工作,AVR 有片内 RC 振荡器,出厂时,大多数 Mega 系单片机默认使用片内 1MHZ RC 振荡器作为时钟源,这保证一片新的 AVR 芯片不需要任何配置、外部时钟或晶振就能直接被 STK500 之类下载器烧写。

如果你的应用不需要精准或特别频率的时钟,那么也可以直接使用片内振荡器,比如左边这个。

荔枝左,使用片内 RC 振荡器,外部晶振没有焊;右,焊了一个 7.3728MHZ 晶振,使得可以使用波特率精准的串口:
微信图片_20190321165536.jpg

但有时候我们需要精确或稳定,或特殊频率的时钟,比如串口对波特率的特殊要求,使得晶振频率最好是波特率的整倍数,此时需要外部晶振,那么你就要考虑这个问题并配置 AVR 的熔丝,让它使用外部晶振。然而一旦配置后,这片 AVR 就不再使用片内振荡器,这意味着如果把它放到一个没有接晶振的电路板上,它就不能被 STK500 之类下载器烧写了,所以你配置熔丝的时候一定要非常注意这一点。

另外要特别注意的,AVR 的时钟源除了内部振荡器,外部高频晶振两个选择之外,还有外部 RC 振荡器、外部时钟这些选择,一旦配置熔丝的时候不慎选择为这俩,即使你的目标板有晶振单片机也无法工作了,如果没有办法自己做一个时钟给这样的片子,这个片子就无法再被 STK500 之类下载器烧写了。初学者很容易犯这样的错误,一定要非常注意。

熔丝配置中还有两个初学者很容易犯这样的错误,

1、外部重启屏蔽(RSTDISBL),AVR 的 RST 引脚也可以作为一个 IO 使用,在这里屏蔽后,引脚就成为一个 IO,在 IO 紧张的时候可以这样做。但如果使用 ISP 接口下载程序,则需要这个引脚,它为低电平的时候芯片可以被 ISP 接口编程。如果将其屏蔽,则这个芯片就无法再被 STK500 之类下载器烧写了。

2、启用 SPI(SPIEN),AVR 的 SPI 接口(MOSI、MISO、SCK)在 RST 引脚为低电平时,可以被 STK500 之类下载器作为读写片内 Flash、EEPROM 的接口。如果禁用了这里,显然这个芯片就无法再被 STK500 之类下载器烧写了。

也就是说,一旦上面两个熔丝被错误配置,这个芯片就无法再被 STK500 之类下载器烧写了,也就是俗称的片子被死锁,它还能工作但不能再被 STK500 之类下载器烧写了。不过这种片子还是可以挽救的,只是需要高压编程器,这玩意比较少见,所以平时使用的时候一定要注意,不要因为不小心误点了这俩选项导致片子被死锁。

cr11013.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-22 08:16:09 | 显示全部楼层
washu 发表于 2019-3-21 16:44
Arduino 是不用 STK500 的,直接插上 USB 线就能用 Arduino IDE 下载程序。你买那个据称兼容 Arduino  ...

      谢谢washu老师图文并茂的讲解, Arduino 板子和STK500 的驱动都装上了,Atmel Studio如何使用 STK500烧录m8讲的非常详细,照图操作不是很困难了,“熔丝”是对AVR 内部设置的修改,烧录和熔丝作用不一样,原来如此。手头的atmega328p avr开发板串口速率是9600,有外部晶振,还不知道大小,回头问卖家或者拿放大镜看看是多少,谢谢谢谢!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-22 08:20:51 | 显示全部楼层
washu 发表于 2019-3-21 17:14
有关的题外话:

CPU 需要有时钟才能工作,AVR 有片内 RC 振荡器,出厂时,大多数 Mega 系单片机默认使用 ...

       看到网络又说芯片锁死原来是熔丝这两个配置外部重启屏蔽(RSTDISBL)和启用 SPI(SPIEN)设置,谢谢指教!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-26 16:48:26 | 显示全部楼层
本帖最后由 pdshyh 于 2019-3-26 17:08 编辑
washu 发表于 2019-3-21 17:14
有关的题外话:

CPU 需要有时钟才能工作,AVR 有片内 RC 振荡器,出厂时,大多数 Mega 系单片机默认使用 ...


       washu 老师好,感谢您昨天关于显示屏和数码管的介绍,原来显示这一块这么多类型,过去没有接触到,拿着数码管基本原理来套LCD液晶显示器,还是请教烧录设置atmega328p avr开发板外部晶振16M,串口转换晶振是12M,计算机查到的串口属性速度是9600.这样,换ATMega8, STK500 接口 ISP,在“熔丝”(Fuses)进入更改页面,在 CKSET 下拉表单中选择:外部高频晶振,启动延迟如何选?还有“外部高频晶振选项”英文是什么?不指点看到也不认识。
        还是请教单片机串口/特殊寄存器定时器/计算器等有所了解,就是各种中断,串口中断和定时器中断外部中断等等文字部分也看了大致了解就是单片机响应中断请求,把手头工作暂时停止,处理中断请求任务,中断请求任务完成回到原来位置继续工作,单片机这样的工作,能否形象的流程或示例简单科普一下AVR 和C51,内部结构相近借一个C51内部结构图。
       昨天您提到lcd  它用总线输入的是 ASCII 字符,每个字符用 5x7 点的点阵来显示,拿LCD1602AVR单片机,按您说的屏幕数据口接到 PB0~PB7,
EN 接在 PB4,RS 接在 PB5,是不是PB0~PB7+、 PB4+ PB5,组成了单片机总线,只学习了数码管工作原理,想知道显示屏的每个字和总线输入的关系,我的问法可能有问题,单片机连接lcd的工作原理。
       数码管工作原理理解了,看了店家的数码管电路图,数码管管脚顺序,一般单片机控制数码管,是怎么连接。
Image 3.png
Image 4.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-27 15:08:07 | 显示全部楼层
        对于单片机零碎的学习了一些通俗易懂的单片机入门不难------谈PIC系列http://www.crystalradio.cn/forum ... &fromuid=228929和考拉聊单片机http://www.crystalradio.cn/forum ... &fromuid=228929
等,今天上午学习《单片机结构和工作原理》https://wenku.baidu.com/view/977fd52d87c24028905fc317.html?pn=51,第一次系统学习,受益匪浅,过去微机原理学习也有堆栈部分没理解,这次通过通读和另网页搜索学习对堆栈工作原理有了大致了解,通过学习困惑的单片机工作流程大致有了了解,知道单片机p0-p3的端口输入输出也是锁存器,单片机有非常多的各式各样的存储器。对于中断有了初步认识,刚刚开始空白面比较多,任重道远。谢谢支持。
回复 支持 反对

使用道具 举报

     
发表于 2019-3-28 17:12:22 | 显示全部楼层
pdshyh 发表于 2019-3-26 16:48
washu 老师好,感谢您昨天关于显示屏和数码管的介绍,原来显示这一块这么多类型,过去没有接触 ...

外部高频晶振:

Ext. Crystal / Resonator High Freq.

然后,后边的 Start-up time xx CK + xx ms 就是延迟

cr11008.png
回复 支持 反对

使用道具 举报

     
发表于 2019-3-28 17:38:53 | 显示全部楼层
pdshyh 发表于 2019-3-26 16:48
washu 老师好,感谢您昨天关于显示屏和数码管的介绍,原来显示这一块这么多类型,过去没有接触 ...

AVR 比 51 复杂些,AVR 结构框图如下
cr11020.png

CPU 内核
cr11021.png


这些东西可以在 AVR 手册上找到 典型的,AVR 的 IO 比 51 复杂很多,因为 51 是开漏输出 IO,因此不需要设置输入和输出方向,设置其为 1 时开漏晶体管断开,IO 被电阻上拉,弱输出高电平,而外部将其拉到低电平时可以直接读取;AVR 是完整双向 IO,因此有输出和输出方向寄存器(DDR),配置为输出就是输出,高电平和低电平都是强的,推个 0.5 寸数码管、小继电器都没问题,而且高电平也能推 ,PORT 寄存器决定输出电平;配置为输入就是输入,PORT 寄存器决定是否使用内部弱上拉电阻,如果不使用,则是高阻输入状态,输入电平由 PIN 寄存器读出。这些在我给你的 18b20 例程中都有体现,AVR 乃至更新的比如 STM32 的 IO 寄存器操作比 51 复杂。

AVR 的 IO 结构:
cr11022.png
回复 支持 反对

使用道具 举报

     
发表于 2019-3-28 18:07:45 | 显示全部楼层
pdshyh 发表于 2019-3-26 16:48
...想知道显示屏的每个字和总线输入的关系,我的问法可能有问题,单片机连接lcd的工作原理。


诸如 1602 一类 ASCII 字符型 LCD,它内部有主控,比如我用的这种主控是 HD44780,日立公司生产的一种主控,因此操作 1602 LCD 显示字符,实际上是操作这个主控,至于主控如何将字符显示到屏幕,则不需要我们关心。

HD44780 结构如下,MCU 通过主控的接口部分和主控芯片连接,包括

1、一个 8 位总线,它也可以使用 4 位模式,使用 4 位模式时,D0~D3 四根线悬空或接地,D4~D7 接到 MCU

2、RS、RW、EN 三个控制线。
RS 线用电平高低告知主控当前总线上传输的是指令(低电平)还是数据(高电平)
RW 线告知主控现在是写(低电平)数据或指令到主控,还是从主控中读(高电平)取数据
主控在 EN 线脉冲上执行一次动作(下降沿写入数据和指令)

cr11018.png


因此使用这种字符型 LCD,归结如下:

1、通过写指令,告知主控我们要做什么,比如定位到屏幕上的某个位置
2、然后写入要显示的字符的 ASCII 代码数据,这个字符就会在上面指定的地方显示出来

其实就那么简单

HD44780 指令表:
cr11019.png


在使用它的时候,首先我们要初始化,我给你的例程是 4 位总线模式的,电路图如下,
RS 接到 M8 的 PB5
EN 接到 M8 的 PB4
D4 接到 M8 的 PB0
D5 接到 M8 的 PB1
D6 接到 M8 的 PB2
D7 接到 M8 的 PB3
RW 接地
VL 通过电阻接地,该引脚调整显示屏对比度,在使用 5V 电源时通过电阻接地并调整电阻值即可
VCC、GND 接到电源
cr11014.png

因为 AVR 一次操作一个完整的 8it 总线(PORT),所以使用 4 位总线需要操作一下,简单说就是先读出该 PORT 的状态,然后把我们要输出的数据叠加上去,这样就只影响这个 PORT 中我们要用来输出的 4 位,比如这里是低 4 位,而高 4 位则不受影响。

HD44780 主控使用 4 位总线模式时先输入高 4 位数据,所以先将 bDat 的高 4 位 >> 到低 4 位,送入 HD44780 中,然后再将 bDat 的低 4 位送入 HD44780 中
cr11015.png

如果要送入的是指令则设置 RS 线为低电平,送入数据则设置 RS 线为高电平,并在 EN 线上产生一个下降沿脉冲,这个操作用宏定义的方式定义在程序头部:
cr11017.png

然后,InitHD44780() 初始化总线为 4 位总线模式(0x33、0x32)并告知主控使用两行显示、5x7 点字符(0x28)
然后设置光标是否使用、是否闪烁
WriteInstruction(0b00001100 | (ShowCursor & 0b00000001) << 1 | (BlinkCursor & 0b00000001));
然后清屏并返回起始位置(0x01)

之后每次要显示字符的时候,写指令先告知主控要显示的字符位置(dLine 显示到哪一行,dX 显示到该行的第几个字符位置)
WriteInstruction(0b10000000 | (dLine & 0b00000001) << 6 | (dX & 0b00111111));
然后,写入要显示的字符的 ASCII 代码数据即可

cr11016.png
回复 支持 反对

使用道具 举报

     
发表于 2019-3-28 18:12:38 | 显示全部楼层
pdshyh 发表于 2019-3-27 15:08
对于单片机零碎的学习了一些通俗易懂的单片机入门不难------谈PIC系列http://www.crystalradio.cn/ ...

这里仍然要提醒一下,汇编的编程理念和高级语言不同,而且有的思想是有害的。

因此玩单片机可以在了解原理的时候了解一下它的汇编,但不建议学习汇编。除了只有几个字节的 RAM、ROM 的单片机,如今的 AVR、STM32 都有足够大的 RAM 和 ROM,使用 C 或 Basic 一类高级语言编程更好,实际上我认为完全没有必要接触汇编。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-29 11:07:58 | 显示全部楼层
washu 发表于 2019-3-28 17:12
外部高频晶振:

Ext. Crystal / Resonator High Freq.

       谢谢washu 老师回复,已经讲得非常细了,已经打印文本方便操作,准备周末把你写的1Wire(18b20)例程,烧录到换MEGA8A-PU 单片机 的atmega328p avr开发板,进行温度测量显示的实践,在实际操作过程中有什么问题在请教,这段时间一直在充实单片机基本工作原理和串口通信的知识,确实空白面太多,必要的基础知识的学习还是十分必要,上位机VB软件电阻测量和温度测量,加上单片机的温度测量显示串口通信到上位机等等一步到位还是有瓶颈。先单片机温度测量显示的应用先实际感受单片机的应用流程。
回复 支持 反对

使用道具 举报

     
发表于 2019-3-29 13:51:24 | 显示全部楼层

好久没有来了。给加点分啦。。谢谢
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-29 15:10:50 | 显示全部楼层
washu 发表于 2019-3-28 17:38
AVR 比 51 复杂些,AVR 结构框图如下

      谢谢washu 老师图文并茂的讲解,通过这段时间对单片机的接触,对AVR或C52单片机DS18B20温度传感器led显示和上传串口,单片机运行顺序及中断还有上位机VB软件的测量和串口通信,搅到一块了,每个头绪,在提出问题后觉着问题太泛泛,还得自己先看看单片机基础的东西。通过大致的学习,对单片机的运行顺序中断有了肤浅的认识,对于您帖子中提到AVR 的 IO 比 51 复杂,AVR 的 IO输出高电平和低电平都是强的等等在使用过程中慢慢体会理解。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-29 15:40:53 | 显示全部楼层
本帖最后由 pdshyh 于 2019-3-29 15:48 编辑
washu 发表于 2019-3-28 18:07
诸如 1602 一类 ASCII 字符型 LCD,它内部有主控,比如我用的这种主控是 HD44780,日立公司生产的一种 ...


        原来是“D4 -D7 接到 M8 的 PB0- PB3”这样连接您不提醒我就准备D0-D3接到 PB0- PB3了 ,led是这样工作的,拿数码管工作原理套确实是分毫只差,谬之千里。谢谢指教,慢慢消化。
       通过keil软件的DS18B20温度传感器例程熟悉了c语言和C52单片机的简单程序结构,先入为主有了对单片机的初步认识,回过头来再通过Atmel Studio软件看1Wire(18b20)例程既熟悉又陌生,本来想C52和MEGA8A各弄一个DS18B20温度传感器到上位机一个室温一个测试电阻的环境温度,还得摸着石头过河,慢慢来,先MEGA8ADS18B20温度传感器LCD显示。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-29 16:27:27 | 显示全部楼层
washu 发表于 2019-3-28 18:12
这里仍然要提醒一下,汇编的编程理念和高级语言不同,而且有的思想是有害的。

因此玩单片机可以在了解 ...

       谢谢我是有点喜欢知其然知其所以然或者是钻牛角尖了,知道单片机结构和工作原理就更好的理解单片机任何工作,方便理解编程而已,单片机的堆栈及中断等等,应该是 C 或 Basic 一类高级语言在中断中有已经做好的函数(我猜 )直接用就行了不考虑什么压栈出栈设置栈底等等。
       这段时间一直在捣鼓Atmel Studio、arduino和FastAVR软件都是一知半解,玩avrMEGA8A单片机暂时也就是想做电阻稳定性测量,就是带温度的测量。随着对单片机和编程的熟悉在发展弄Voltgen电压源,以后单片机的使用看情况,编程软件用FastAVR软件还是Atmel Studio有点不知所然了,用FastAVR+STK500烧录m8是怎么操作。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 23:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表