51单片机学习

2020-02-16 fishedee 后端

1 概述

学完了模拟电路和数字电路后,开始进入学单片机了,我使用的教材是郭天祥的《新概念51单片机》。有了两大电路和编码基础后,单片机就相对容易多了。学习单片机的初衷是为了,自己做一个固话的来电显示系统,因为现在这种模块已经很难买到了,只能自己动手做。

2 Hello World

2.1 驱动与烧录

先进入STC的官网,下载最新的STC-ISP软件。

注意,在windows10下必须要安装CH340的驱动,不要用原Windows下的自带驱动。我在这里踩了坑,没有安装驱动后,烧录工具有时候能写进,有时候不能写进,十分头痛。

打开烧录软件后,选择好单片机的型号,串口,以及程序文件。点击下载按钮,注意,这个时候将VCC断开,再重新插回去,这样能强迫单片机复位。单片机复位后RSD和TXD才会开始侦听烧录的操作,一旦单片机复位后一段时间没有收到烧录请求后,他就会正常运行用户程序。

2.2 编码

下载keli uVision 4的版本,然后新建一个项目,CPU型号是Atmel的AT89C52。市面上绝大部分的51单片机都是以兼容这个CPU型号来开发的。

#include <reg52.h>
sbit led1 = P1^0;

void main(){
    led1 = 0;
}

新建一个main.c的文件,内容如上,然后将该文件加入到项目的Source Group里面。

最后是设置输出配置时,设置需要输出hex files,然后点击Build就能生成hex文件了。

2.3 硬件拼接

然后用面包板拼接以上电路,这是51单片机的最小电路,XTAL2与STAL1组成的晶振电路,VCC和GND组成的电源电路,RXD和TXD组成的串口通信和烧录电路。

注意,VCC和GND直接从USB转换端口获取5V来供电,RXD和TXD的标准用法是RS-232串口通信,但是现在一般电脑都没有这种串口了,我换成了CH340G芯片提供的,USB到RS-232串口的插口转换,所以在上一节中需要CH340的芯片驱动。

连接好电路,然后在烧写hex文件进去就可以了,烧写完成后,可以看到P1.0口的发光二极管长亮。

之所以使用面包板,就是因为面包板不需要焊接线路,直接用杜邦线就能连接,比较方便。

2.4 焊锡电路

因为最小电路板,晶振电路,开关经常会有用到,所以,就直接尝试焊接了一个常用的电路板,非常简单,也是第一次焊锡,纪念一下。

多次焊锡的失败以后,我获得的经验是:

  • 要带口罩,味道很难受。要买高温海绵和烙铁台,便宜而且值得。
  • 要用带调温功能的透明外壳的电烙铁,我用的是黄花的907,调温和保温功能很重要!另外,焊接的时候,必须先调好温度,然后让电烙铁到达了温度才去焊接,温度不够不要焊接!
  • 焊一个点的时候,温度调成330度,先让电烙铁放上去,然后锡焊丝靠近铜与电烙铁的接触位,就能保证锡融化了,而且融在铜点上。因为,铜与高温都是能吸附锡的。
  • 连接点的时候最好用电线,而不是焊锡线,因为焊锡线新手很不好做。
  • 做焊锡线时,温度调成330度,先让电烙铁放上去,融化了两边的点,然后让焊锡丝在两个点之间的位置放上去,锡融化了后,会和两边的点的液体混合在一起,那么就成功了。这个时候,只要往上拿走电烙铁就可以了。
  • 脱焊时,温度调成380度,先让电烙铁放上去,将点上的锡就吸走了,就ok。因为温度足够高,这个时候铜点不够电烙铁的吸引力大,所以锡只跟电烙铁走,不跟铜点走。
  • 不用的时候,将电烙铁头都涂上一层锡,能避免氧化,这样耐用很多,而且保证了电烙铁头对锡的吸引力。

3 串口通信

3.1 代码

#include <reg52.h>
void SerialInit(){
    TMOD =((TMOD&0x0f)|0x20);
    TH1=0xfd;
    TL1=0xfd;
    SM0=0;
    SM1=1;
    REN=0;
}

void SerialRun(){
    TR1=1;
    ES=0;
}

void SerialSend(char* buffer, int length){
    unsigned int i;
    for( i = 0;i<length;i++){
        TI=0;
        SBUF=buffer[i];
        while(TI==0);
    }
    TI=0;
    SBUF='\n';
    while(TI==0);
}

串口通信的代码比较简单,串口通信前需要通信双方提前约定好一个波特率。而在单片机中,串口的波特率由定时器和晶振共同控制的。而且,为了让定时器触发的串口更加准确,我们会采用定时器的自动装载模式,晶振选用11.0592Mhz。SerialInit就是串口配置为9600波特率,SerialRun就是启动定时器,SerialSend就是逐字节地写入串口数据。

3.2 电路焊接

3.2.1 电路

现在PC机都没有传统的串口接口,我们一般会用USB转串口芯片来达成这个目的。于是,我们会用到CH340G的芯片,电路还是比较简单,但对于全新手的我还是遇到很多问题。

3.2.2 贴片电容焊接

CH340G的芯片是SOP封装的,引脚非常小,不能直接焊在洞洞板上的,需要用SOP转DIP板子来转换。但是,引脚还是太小了,我连续焊了两块都不成功,插上去以后无法正常运行,很崩溃。

然后我直接买了SOP转DIP的烧录座,然后将芯片放上去就可以了,不需要焊接,然后与洞洞板连接就可以了,很完美。当然,这样做仅仅是为了测试电路是否正确,真实使用还是免不了要好好锻炼SOP芯片的焊接技巧。

3.2.3 电容选择

在USB接口中,本身就带有5V电压。但是这个电压和地需要加两个电容

  • 一个电容是0.1uf,它的作用是滤除输入电源中50Hz的滤波
  • 一个电容是10uf,也有人用47uf电容,最好选择电解电容的方式,它的作用是滤除负载端频繁变化的电流变化。因为USB的最大瞬间电流限制为500mA,但USB负载的MCU芯片在启动的一瞬间,需要瞬间的大电流,就有可能触发这个限制,所以需要加这个电容。

3.2.4 安装驱动

说来惭愧,犯了更低级的错误,在win10没有安装CH340G的驱动。因为在CH340G芯片在win10下即使没有安装驱动,STC的烧录工具竟然也能用,但是无法烧录进去,一直说找不到STC芯片。

最后各种排查,竟然就是没有安装官方的CH340G芯片驱动。

3.2.5 成品

4 HT9032D

我们目前国内的来电显示信息是通过FSK调制在电话信号里面的,所以,我们需要一个FSK解调的芯片来获取这个固话的来电显示信息。

当然,我没有学过信号处理的知识,就只能求助于用专用芯片来解调FSK信号,这个专用芯片就是HT9032D。

4.1 电路

HT9032D的电路就是去掉了RDET1,RDET2,RTIME,DOUTC,CDET,RDET的接口,它相对HT9032C去掉了振铃功能,只保留了来电信息显示功能。另外,二极管就选用最常见的1N4148就可以了,1N4148的黑端就是负极端。输出端DOUT使用的是串口输出协议,波特率是1200。

这个元件相对多一点,我也调试了很久才搞定,完全是新手村的状态。

4.2 引脚接错

我开始就是对着这个图直接接上去的,发现没法用,花了很长时间才发现,这个图是HT9032B,不是HT9032D的,这是日了个狗。

然后重新在官网找datasheet,才发现它的引脚是这个才对,跟HT9032B有相同的引脚数量,但是位置调换了,活生生被自己蠢哭了。

4.3 复位接错

PDWN端设计是休眠功能,高电平的时候芯片进入掉电状态,避免工作,可以省电。低电平的时候芯片进入工作状态,然后才会进行FSK解码,DOUT才会有数据。

然后我自作聪明地让这个引脚直接接入GND端,发现DOUT端完全没数据出来。这个时候,我才老实地按照官方的指示,将这个接口接入电阻与电容组成的RC电路,实现开机复位的功能。使得这个引脚在接入的一瞬间是高电平的,然后过了一段时间后才是低电平。

而后,就正常多了

4.4 不停的数据输出

当PDWN处于低电平时,DOUT会有不停的数据输出,这是一种正常现象。即使没有来电,它依然会有数据输出。但是,当来电信息到来时,它的数据是不同的,会先有一段0x55的启动标志,然后是0x80的具体数据输出,然后就是复合数据消息格式(MDF)了。

4.5 无法多机使用

当我用洞洞板做好电路后发现,当该芯片只插一个电话线接口是正常的,但是同时该电话线也接了其他电话时就会失灵。我用串口调试助手发现,一旦这样接入后,DOUT输出的数据就不正常了,来电以后,缺少了0x80和0x55的数据。我发现解决办法有两个:

  • 将该芯片的电话线输入,连接到其他电话的分机接口。
  • 使用隔离芯片变压器。

具体原因就真的不太清楚,还需要继续了解学习。

4.6 成品

最后的成品就是这样了,有机会的话想学习用PCB打板做一个更美的。

5 总结

满足了一直以来的一个好奇心,电路是怎么设计和连接在一起的,真是很好玩!

参考资料

相关文章