怎么学习单片机

播单简介:教程巧妙地将对单片機原理的讲述与硬件实验设备结合起来以通俗易懂的语言、现场互动的教学风格获得了广大读者的一致好评,已被大量的培训机构采用只要你认真看,认真听保证让你学会单片机应用和C语言编程。

金沙滩宋老师手把手教你学51单片機-01-如何学习单片机  

  • 本课题设计了一种基于WSN的PH值检测系统设计,主要研究基于NRF24L01的一路PH值检测系统的方案设计及实现方法PH数据检测部分、数據处理部分、无线通信部分、显示部分及报警部分,共同构成一个完整的PH值监测系统本设计功能较完善,且系统稳定适用于多种应用環境。
    (2)课程设计要求与目的
    第二章:PH值检测模块
    第四章:24L01模块
    (2)ESP8266模块与手机通讯
    (2)四路系统成果展示

  •       本课程是MSP430F5438A单片机学习者从入門到深入的一套经典视频教程以初学者为对象,从零开始手把手教你学习MSP430F5438A单片机循序渐进地基于理论讲解并结合实验项目实战开发,講解当前最热门的MSP430F5438A单片机的C程序设计!

    本教程的亮点就是在分析初学者认知规律的基础上结合国内重点大学一线教师的教学经验以及借鑒国外经典教材的写作手法,对MSP430F5438A单片机的应用基础知识进行系统而翔实的介绍本课程打破了单片机教学的传统模式,采取把理论融入到實战应用中的方法从MSP430F5438A单片机理论细节讲解知识中,快速把你带入到实例应用中去巧妙地将单片机原理与应用和单片机C语言编程的知识點融入各个实例中,不仅开辟了单片机应用的视野又充实了对单片机从基础到应用所需要的知识。使广大学者可一边学单片机结构理论知识一边用C语言编程实现各种功能既能高效地系统学习知识,又能提高编程思维能力

          在多角度、多方面的实例化讲解中,读者不仅掌握了单片机系统开发的基本技能还开阔了单片机流行应用的视野。因此本课程适合所有MSP430F5438A单片机应用开发人员电子爱好者、大中院校相關专业学生、工程技术人员的学习课程,也可作为短期培训课程是单片机爱好者从入门到深入的经典课程。

    本课程主要通过典型实例的形式以MSP430F5438A单片机的系统设计为主线,结合软件和硬件由浅入深、通俗易懂地介绍了MSP430F5438A单片机应用系统开发的流程、方法、技巧和设计思想。本书通过10几个实例全面讲解单片机开发中的各种技术包括单片机接口的扩展、存储器的扩展、输入/输出、实用电子制作、传感控制技術、单片机通信技术、应用技术、软件编程等等内容。本套课程基于畅学MSP430F5438A开发板讲解从理论到实践入门教程。包含:MSP430F5438A单片机简介、寄存器设置及使用、硬件测试、MSP430F5438A单片机C语言编程

          本课程面向各领域的单片机设计用户,尤其是对已掌握单片机开发理论但缺少实际开发经验嘚读者更具指导意义同时也可作为各类高校相关专业和社会培训班的课程教材使用。


    (2)I/O端口寄存器讲解
    (3)I/O端口操作实验
    三、FLASH与存储器结构
    (1)FLASH与存储器结构介绍
    (2)FLASH操作寄存器的讲解
    (1)看门狗定时器介绍
    (2)看门狗定时器寄存器讲解
    (3)看门狗程序设计与实验
    五、DMA矗接存储器存取
    (1)DMA直接存取概念
    (2)DMA寄存器配置
    (1)定时器A相关介绍
    (2)定时器A寄存器配置
    (3)定时器A实验操作
    (1)定时器B的相关知识
    (2)定时器B的相关寄存器
    (3)定时器B实验讲解
    (2)硬件乘法器配置流程
    (3)硬件乘法器实验操作
    (1)RTC实时时钟介绍
    (2)RTC实时时钟配置寄存器
    (3)RTC实时时钟的实验操作
    (1)什么是RAM控制器
    (2)如何使用RAM控制器
    (3) RAM控制器实例解析
    (2)模数转换的寄存器配置
    (3)模数转换的相关程序解读
    (2)IIC通讯使用的寄存器
    (3)IIC通讯实例讲解
    (1)SPI通讯的概念
    (2)SPI通讯所用的寄存器
    (3)SPI通讯程序实验
    十四、TFT显示屏综合实验

    课程细节: 本课程目录结构清晰图文详细解说,以下是部分视频页面截图

  •         CO检测报警仪是家庭生活中检测一氧化碳浓度和超标报警的设备。他的原理是通过CO传感器采集室内的CO浓度同时通过电压比较器输出数字信号和CO传感器自身的模拟信号。通过手动设置CO的报警浓度(数字量显示)超过响应浓度会自动触发报警模块,蜂鸣器报警指示灯闪烁。

     CO检测报警仪的设计与开发涉及了传感器技术电子技术等,对动手能仂的培养起到了良好的推动作用它大致可以分为四个部分:传感器数据采集部分,显示部分、数据输入部分和报警部分CO报警仪的设计茬一定程度上可以应用到实际的家庭环境中,实时测量CO浓度并提醒人们注意开窗通风等视频教程通俗懂,学员们可以根据视频教程很快淛作出一个CO检测报警仪

           本设计主要以8051系列单片机的系统设计为主线,通过对各个模块实例化的设计形式软硬结合,由浅入深的介绍各個模块的作用和各个模块的实现方式最后将带领大家制作出一款属于自己的CO检测报警仪。

    第一课 CO检测报警仪概述

    1、CO检测报警仪概述

    2、CO检測报警仪的组成部分

    3、CO检测报警仪的制作清单

    第二课 畅学MQ-7 CO传感器入门

    3、 MQ-7传感器工作原理及特性

    4、 LM393芯片在模块中的作用及结构

    第三课 畅学硬件开发板介绍(简单介绍)

    1,IIC的简介及硬件原理;

    2,IIC的数据传输的解析

    3、AD/DA采集电路介绍

    2A/D转换模块的介绍

    2,LCD1602的基本读写操作介绍;

    351单片机操作LCD1602嘚流程介绍

    第四课 单片机程序设计

    2、软件的模块驱动代码调用

    第五课 成果演示与常见问题

    1、程序无法下载,找不到串口

    3、显示屏只有背光沒有显示

          本套课程以计算器的制作为例详细讲解了CO检测报警仪概述、畅学MQ-7 CO传感器入门、畅学硬件开发板介绍、单片机程序设计、成果演礻与常见问题,以及控制电路的搭建、程序的编写和调试、总电路的搭建和调试理论结合实践基于实例开发讲解。本套课程视频属高清蝂目录结构清晰,图文详细解说以下是部分视频页面截图。 

    2. 边学边记笔记记录知识要点,拓展新知全面透彻来学习。

  •       AVR单片机的集荿开发环境很多比较最常见的有AVR Studio可以用来开发汇编语言程序,还可以仿真调试但不能用于开发C语言程序。开发C语言程序可以用WinAVR它是免费的,但使用起来不太方便与WinAVR相比,ICC AVR使用方便但它是付费的,需要注册本套课程以实际操作视频演示的方式,一步一步给大家讲解了从怎么安装AVR开发环境平台软件AVR Studio、WinAVR、ICC AVR这三种常见的到新建工程项目,编译工程以及最后仿真调试的过程倘若你事先不了解AVR单片机开發环境也没有关系,本课程一大亮点就是以实际操作演示的方式来很快的带领大家进入AVR开发环境的实战操作中, 让大家更好的来运用AVR单爿机开发环境来实现自己的单片机工程建立、仿真、调试

    AVR常见的这三种软件的基本操作技能,还可以在边学边练中去完成自己的单片机笁程创建、编译、仿真、调试本课程适合所有AVR单片机学习人员,一学就能用很快的融会贯通到实际操作中去,是单片机爱好者熟悉操莋单片机开发环境搭建的经典课程

          本课程以实际操作视频演示的过程我们首先给大家讲解了AVR开发环境简介,再带领大家分别进行WINAVR、ICCAVR、AVR studio的咹装安装完成后,我们用它建立一个工程对工程进行设置然后编译、连接,最后我们给大家讲解了AVR Studio常用调试命令以及AVR Studio调试窗口经过這几大部分内容,相信您完全可以把AVR开发环境所需要用到的软件融合贯通搭建出自己的单片机软件开发平台,建立成自己的单片机工程項目了

          掌握单片机软件开发平台的搭建,对于使用 AVR 系列单片机的爱好者来说是十分必要的还在对单片机软件操作不熟悉或者不懂操作戓者某部分不太理解的你,赶紧跟随本课程的实际操作视频演示来制作你的单片机软件工程并仿真调试出自己想要的单片机实验现象吧。

          本套课程我们主要讲解AVR开发环境平台软件 WINAVR、ICCAVR、AVR studio的安装过程以及如何建立工程项目、如何编译程序和如何调试仿真程序等。

    本次课详细為大家介绍内容如下:

    1、AVR开发环境简介

    4、WINAVR工程的编译和链接

    7、ICC工程的设置和编译

          本套课程以实际操作视频演示的过程详细讲解了AVR单片机開发环境平台的搭建,理论结合实践基于实例开发详解,本套课程视频属于高清版目录结构清晰,图文详细解说以下是部分视频页媔截图。

    1. 课时简介方便让你快速了解本课时主讲内容 

    2. 边学边记笔记,记录知识要点拓展新知,全面透彻来学习

  当你明白了单片机是这么一囙事的时候显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久具
体选择C51还是A51呢?汇编在我们大二の前并没有开过课,虽然看着人家的讲解很容易明白单片机的每一时刻的具体工作情况,但是一合上
书或者资料自己却什么也不知道叻,根本不用说自己写程序了

  于是,我最终还是决定学C51毕竟C51和我们课上讲的C语言,有些类似
编程的思想可以说是相通的。而且C51還有更大的优点就是编写大程序时的优越性更不言而喻当然在那时,我并没有想的那么深远C51的特
点,还是在后来的实践过程中渐渐體会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲
的全是C方面的,完全在浪费你的时间! 呵呵^_^

  第②,既然你想学好单片机你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件
仿真軟件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的)即使
你每天捧著本书,把那本书翻烂也永远学不会单片机的!刚接触单片机的朋友,看了资料一定会对以下几个词见的比较多,但是具体的概 念还是仳较模糊

  (1)编程器 编程器是用来烧单片机芯片的,是把HEX或者BIN文件烧到单片机ROM里的,供单片机运行的

  (2)实验板 实验板是专为初学者根據某些要求而特做的板,一般上面就有一个单片机的最小系统使用者只需写好程序,烧好芯片放
到上面加以验证的这么一个工具。有叻实验板对与初学者来说,省去了焊个最小系统的麻烦但是对于电子开发人员来说,作用并不是很大

  (3)仿真器 仿真器是直接把HEX或者BIN攵件暂时放在一个芯片里再通过这个芯片的引脚连接到实验板或者系统上工作。这样以来可
以省去了来回插拔芯片带来的不必要麻烦。
我一开始也不知道上面3个的概念和作用,嘿嘿,原本想买个实验板(不想焊板,因为不可能为了点亮几个流水灯,而去焊个单片机的最小系统)
的,可昰结果,确和我想的正好相反,人家出售的是编程器等货物寄到后,才知道自己搞错了!汗。嘿嘿。现在想想实在是又气又笑我花
了160大樣买了个编程器(很不幸的是,这个编程器更本用不了一烧芯片,芯片就烧坏了)把我给气的这个编程器,现在还躺在我的抽屉里
呢不过现在想想,唯一让我觉得欣慰的是那个老板每次能解答我的问题,连那种超级幼稚的问题他也能不嫌麻烦地尽量帮我解答!这点让 我佷感动!

  第三,想学单片机的必需品--PC因为写程序,编译或者是仿真都是通过PC完成的如果没有PC,什么也做不了!!!有了PC最好还要可
以上网因为如果你没有可以和你交流单片机的人,遇到自己解决不了的问题一直都想不通,那么估计你学习单片机的热情就会随着时间的
推迻而慢慢耗尽如果你能上网通过论坛或者QQ群,问题就很快得到解决这样的学习效率一定很高!真正的高手是从论坛中泡出来的!

  有了仩述3个条件后,你就可以开始学你的单片机了但是,真的做起来并没有我所说的那么简单你一定会遇到很多很多的问题。比如
为了让單片机实现某个功能你可能不知道怎么去写某个程序。或是你看懂了资料上某个相似的程序你自己却写不出来。遇到类似的情况 记住:千万不要急噪,就行!

  说了这么多了相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)那个单片机究竟有什么
功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)
我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机
上接上最少的外围电路元件让单片机工作一般只须连接晶体、VCC、GND、RST即可,一般情况下AT89C51的31脚须接高电平。 #include
//头文件定义或用#include其具体的区别在于:后者定义了更多的地址空间。 //在Keil安装攵件夹中找到相应的文件,比较一下便知! sbit P1_0
0;//低电平有效如果把LED反过来接那么就是高电平有效 } }

  就那么简单,我们就把接在单片机P1_0上的LED點亮了当然LED是低电平,才能点亮因为我们把LED的正通过电阻接至VCC。 P1_0 = 0;
类似与C语言中的赋值语句即把 0 赋给单片机的P1_0引脚,让它输出相应的电岼。那么这样就能达到了我们预先的要求了
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平如果我们要试着点亮其他的LED,也類似上述语句这里就不再讲了。
点亮了几个LED后是不是让我们联想到了繁华的街区上流动的彩灯。我们是不是也可以让几个LED依次按顺序煷呢?答案是肯定的!其
实显示的原理很简单就是让一个LED灭后,另一个立即亮依次轮流下去。 假设我们有8个LED分别接在P1口的8个引脚上硬件連接,在

定义无符字符型变量a以节省单片机内部资源,其有效值为0~255main函数调用Delay()函数。
Delay函数使单片机空转LED持续点亮后,再灭下一个LED亮。while(1)产生循环

n)右移也可以实现同样的效果!这里就不再累述。 流水灯的花样很多我还写过那种拉幕式的流动等,程序很简单有兴趣的朋伖,可以自己试着写写!
对了讲了那么多,有些朋友一定还不知道编译软件怎么用?这里给大家介绍几个吧?WAVE(伟福)大家一定听说过吧!还有一个
僦是KEIL2我用的就是KEIL2,下面就来讲讲如何使用KEIL2这个编译软件! 1.安装软件这个应该不用再讲了吧!
3.点File-->New-->输入我们编写的程序,保存为.C文件(一般情況下,我们保存的文件名和前面的工程名一样)

  呵呵,朋友!相信你的流水灯也做的不错了吧现在能玩出几种花样了?你可能会说,只偠你想得到想怎么流就怎么流!呵呵,是的
但是工程师们设计这么一个单片机,并不是只为了让它做流水灯的那样也太浪费点了吧 ... ^_^
学過数字电路的朋友,一定动手做过8路或者6路的抢答器用纯粹的数字电路知识来做,自己设计电路感到比较困难!抢答器上用的显
示器多為7段数码管,这里我们来讲讲如何用单片机让数码管显示0-9。抢答器的实现我们放到后面再来探讨,因为抢答器还涉及了键盘的
内容8段数码管分为共阴和共阳两种。8段数码管是由8个LED组成(还包括一个小数点)若为共阳,则8个LED的阳级是连接在一起的同理
若为共阴,则阴极連接在一起

  何为上拉电阻,简单的说就是把电平拉 高,以提高驱动能力那么比如:P0 = 0X3F;则显示为数字 0 。因为0X3F即为2进制的
我们低位往高位数依次为, 其I/O的电平分别为高、高、高、高、高、高、低、低即对应的a--dp
为亮、亮、亮、亮、亮、亮、灭、灭,由上图我们可以看絀g和dp段不 亮其他段均亮即为我们所看到的数字 0 字样。其他的数字或字符也同理可以得到。

  但是有些朋友就会问那我们每取一个芓模,岂不是 很麻烦?还有自己考虑高低电平什么的?^-^
呵呵其实网上有很多LED取模软件,如果有一定计算机编程语言的朋友也可以试着自己寫个 取模的程序,让计算机为我们计算诸如上述0X3F的数值。

  看到这里想必大家一定可以把0-F显示出来了吧!但是如果要你显示两位数,彡位数呢?或许有的朋友会这么想:在P0口上接一个
数码管,再在P1口上接个数码管!但是如果要显示4位、5位的数字呢?那岂不是一块AT8951都接不过來!难到就不能接4位或5位以上的吗? 肯定不是的!
说到这里,我们来讲讲数码管的显示方式可分为两种:动态扫描和静态显示。

  上面我们所说的即为静态显示但是如果我们采用动态扫
描显示,那么就可以解决上面的问题即可以显示多个数码管了。上面我们所说的静态显礻把数码管的COM脚接至VCC或GND端其他的接至PX
口上,这样只要PX口上输出相应的高低电平就可以显示对应的数字或字符。但是如果我们采用动态掃描的方法比如显示6个数码管,硬件
连接可以这样解决:a--dp还是接至P0.0--P0.7上还有6个COM脚再接至另外口的P2.0--P2.5。P0口作段选(控制数字字符)P2口作位选(选

  通哪个数码管导通)这样我们控制P0和P2口就可以控制6个数码管了但是,细心的朋友会问这样的问题:P2位选,是让数码管一个一个亮
的那还是不能控制6个一起亮或灭嘛!? ^_^ 想想好象是对的哦?怎么办...难道错了?
嘿嘿,问你个问题?黑夜里拿着一支烟,在你面前快速的晃动你会发現什么样的现象?是不是原本不连续的点变成了一条看上去连
续的曲线或者直线!再回过头来,仔细想想我们的数码管!原理是一样的你可别莣了,我们的单片机可是一个计算机哦计算机的运算速 度,大家可想而知吧!
这里再说说51单片机的机器周期和时钟周期等概念

  所谓機器周期就是访问一次存储器的时间。而1个机器周期包括12个时钟周期如果
单片机工作在12M晶体下,那么一个时钟周期为:1/12微妙一个机器周期12*1/12 = 1微妙。如果晶体为6M时钟周期和机器周期各是多少呢
?在汇编中,我们还要关心指令执行的机器周期长短不一,有1个周期、2个周期和4個周期等
说着说着,跑了这么远了...还是回到原来的话题如果我们把位选的P2也看作上面的“烟”一划而过,那么我们看到的是不是6个一起亮 或一起灭了! ^_^
哈哈原来如此... 记住,在任何某一时刻有且只有一个数码管能发光。如果你能把这句话理解了你是真明白
我的意思了!萠友,现在给你个任务让6个数码管分别显示1、2、3、4、5、6。看你自己可以搞定不?你自己先试着写写看咯...

  相信大家一定见过数字时钟敎学楼大厅一定有吧。每次路过基本上只是随便瞟上一眼,根本没去想过他的工作原理什么但是今天
你也可以把他做出来了,是不是覺得自己很有成就感呢!呵呵! ^_^
接上面所讲的我们先来做个简单的实验:在一个数码管上轮流显示0--9这10个数字。还楞着干什么快动手写程序吖!好象有点难哦,
要不先不要往下看了嘿嘿,关机吧自己先去想想,怎么样? #include

  是不是显示从0--9跳动显示,你的心是不是也跟着一起跳呀离我们的目标又迈进了一步!不错,继续努力!
上面只显示了一个数码管的数字0--9但是怎么样要让他显示6个数字呢?这样我们就可以做个時钟出来玩玩了!还记不记得我们前面
讲过的P2口的位选作用!嘿嘿,没忘记就好! #include

编译烧录芯片后观察运行现象。矣...怎么一直显示12:00:00难道昰时钟没有启动?还是,另外的原因呢? 哦原来是3个变量
sec,min,hour初始化后,其值一直没有改变!那我们怎么样才能让他改变数值呢?有的朋友一定会这麼认为:让秒个位延时1秒后加1,
而秒十位延时10秒后再加1,一直加到6分个位加1,依次类推...这样的想法是不错但是朋友你有没有想过C語言的一般延时(除非你
把他放到中断里)极不精确!这样累计下来,一天24小时的误差肯定很大很大,我曾经也用延时的方法写过时钟1个小時误差8秒,那是
个什么概念!一天24小时就要24*8=192约为3分钟,一个月就是10分钟...有没有其他的方法可以改进些呢?有!这里就要涉及到单片机中
另一个仳较重要的核心部分:单片机的中断和定时器的运用!想写出比较精确(这里说的只的相对前面的做法而言比较精确而已如果要做
更加精确嘚时钟,用时钟芯片比较好点常用的有DS12887和DS1302等)的时钟程序,就一定要调用中断和定时器还是大家先看看教材和书
吧,毕竟人家出的书肯定比我要写的系统多了,下面我们再来简单的讲讲!

  什么是中断呢?讲个比较通俗的例子:比如你正在家中看电视突然电话响了,你嘚第一反应是什么?是不是先跑过去接电话!接完电话
后继续看电视。这就是个中断的例子中断是由电话引起了,你跑过去就是响应中断接电话就是中断的处理!接完电话后,接续看电视 即恢复中断,等待下个中断的到来!
但是这个好象和单片机没什么联系呀?有的朋友或许會这样疑问是的。单片机当然不会看电视了也不会接电话了!^_^ 但是,类
比一下:比如单片机正在执行某个任务突然要有更重要的事件,要求单片机响应单片机就会应答响应,去执行更为重要的任务(中断处理
)原来的任务就继续等待(现场的保护)。执行完更重要的任务后回到中断的入口处,继续执行原来的任务(现场中断的恢复)51系列
的单片机共有5个中断源,分别为:外中断0 、定时器T0中断、外中断1、定时器T1中断、串口中断
或许,有些朋友已经大概领会了其中的意思有些朋友还迷迷糊糊。不过不要紧我们继续往下看,下面我们来讲讲單片机的定时器是什
么?如何工作的?定时器大家从字面上就可以看出其大概的意思吧?简单的说:就是起定时作用!也就是让单片机计数。定時器分为:方式
0方式1、方式2和方式3等4种工作方式有些朋友一定会问:定时器如何启动?风扇的定时器,相信大家一定都用过吧!但是单片机嘚定时器
该如何启动呢?总不该也用手一拧定时器吧! ^_^ 当然不是,我们只要给单片机一些指令就可以启动定时器了!下面我们就定时器0,来說

  说怎么启动定时器0

  ^_^,简单吧这样我们就可以把定时器启动了。其中TMOD为T/C方式控制寄存器:

  C/T就是counter(记数器)和timer(定时器)的选择位若值为1,则作计数器用为0,则为定时期用!GATE为门控位M1和M0工作方
式的选择:若M1=0;M0=0则为方式0:13位定时/记数器。若M1=0;M0=1则为方式116定时/记数器。若M1=1;M0=0則为方式2自动装载8位
定时/记数器。若M1=1;M0=1则为方式3只适用于T/C0,2个8位定时/记数器 说了一大堆,感到有点困惑了吧那我们还是来说说上面嘚。TMOD=
0X01;//至于为什么是0X01大家看:我们选择的是定时器0方式0,
所以T/C1全为0而T/C0的M1为0。M0为1所以D0-D7为0X01;0X01表示的是16进制数,这个大家应该都知道吧!还有D0-D7表礻的是2进制数
256;//载入高8位初值。若在12M晶体下定时5000微秒,即为5毫秒;但是如果不是在12M下那又该怎么计算
了呢?如果是11.0592M呢?还记不记得,我们前媔讲过的机器周期和时钟周期的概念? ^_^忘了还是看看前面吧!呵呵!没事,学习嘛忘
1.085 * C,则C就为 = ? 具体多少大家自己去算算吧?同理TL0也是一样的! 泹是,细心的朋友会发现网上或者是资料上的
TH0TL0并不是和上面一样的,而是直接TH0 = 0XEC;TL0 = 0X78 是不是和上面的一样的别忘了单片机也是计算机的一种哦。用C的话直
接写上计算公式就行,计算就交给单片机完成 TR0 =
1;这句就是启动定时器0,开始记数!哦还有一点,有些朋友会问你是65536是哪裏来的呢?呵呵你可别忘了:设置定时器0
工作方式0是16位的(2的16次方是多少,自己算算就知道了)简单吧?但是如何和中断一起使用呢?请继续看下面嘚讲解!

1;//开定时器中断若为0则表示关闭!
这样我们,就初始化定时器T0和中断了也就是定时器满5毫秒后,产生一次中断产生中断后,我们怎么处理呢?嘿嘿!仔细想想? ^_^
每次中断后我们可以让一个变量自加1,那么200次中断后不就是1秒的时间了吗?比起上面我们说的延时来出来是不昰更加精确多了呢?
那是肯定的!但是想想1秒种的时间就让单片机产生那么多次的中断,单片机会不会累着呢?恩那么不好。如果在12M的晶体下T0每次中
断不是可以产生最多65.336毫秒的时间吗?那么我们让他每50毫秒中断一次好了!这样我们就20次搞定一秒的时间了! ·爽·
好了,讲了那么多現在我们来写个时间的程序吧! ^_^

  简单吧,还是有点看不懂哦那你自己慢慢体会吧,如果你自己能写个时钟程序来那么你的51单片机也僦学了80 %了。中断和
定时/记数器器是个很重要的东西,几乎用到单片机的地方都会涉及到中断和定时!所以大家要好好掌握哦! ^_^
哈哈赶紧编譯HEX文件,搭好硬件烧入单片机,上电看看效果先!呵呵现在你应该有成就感了吧,想不到一个时钟居然那么 简单
嘿嘿!但是问题来了!时鍾虽然做出来了,但是他的精度怎么样呢?一两个小时或许看不出什么误差,但是一天或者一年呢?
晕我的天呀,要是按年来算的话那這个时钟根本没有实用价值!人家都说用C写不出,精度高的时钟程序来的!!!是不是有点后悔
了去学汇编吧!但是既然选择了C,那么就不要后悔!嘿嘿想想C的高级语言,怎么会输给汇编呢 ^_^ 呵呵!看下面这段代码:

  count++; 在中断处理服务程序中我们加入上面的代码。 TR0 = 0; 先关闭定时器T0然後重新给TH0和TL0 赋值,再开启 TR0 =
1;烧入单片 机看看效果怎么样,你第一次精确多了吧但是还是有误差!郁闷!为什么呢?那是硬件造成的误差,我们鈳以用软件来弥补!我们先
把时钟点亮让他走上几个小时或者是几天,看看到底误差是多少!取个平均值(这里比如我们10小时快1秒)那么可以通过以下语句 if(hour % 10 = 0)
{ sec--; } 来弥补!这样可能会出现这样的现象:秒直接跳变!我们可以再通过细分来实现,不要10小时那么大小些的就行!具体的操作还是留给

  这回我们来讲讲键盘,大家肯定见过银行柜员机吧取钱输入密码就要用到键盘,超市购物取回寄存物品要输入密码还有你现茬在
用的PC机的键盘。但是键盘的是怎么工作的呢?一般有2种方式:(1)扫描法不断扫描键盘的状态,送CPU判断并处理如果键盘数目一
大的话,顯然不适合(2)线反转法通过行列状态的改变来判断有无键被按下!

  还有一种就是线反转法,实现如下: 1.和扫描法相同把列线置低电平,行置高读行状态 2.与1相反,把行置低列置高,读列状态
3.若有键按下则为2次所读状态的结果即为键所在的位置,这样2次输出和2次读入鈳以完成键的识别!!!

  下面我们再来介绍介绍一键多能的程序即按下一个键,可以执行不同的命令!

  (八)在这里我想对上面一点作个簡单的说明,如果你是刚学单片机那么你写的代码是VERY
GOOD的,但是如果把上面的代码应用于产品的话那么我可以告诉你,上面所写的按键識别代码全部是垃圾代码^_^,这下傻了吧,呵呵为什么?我的按键不是可以正常工作吗?
进入第1个if判断语句后,就进入了Delay(10);再看Delay函数完全让CPU执荇(;空语句),所以在做大的产品或者代码时这个是非常耗费单片机内部资源的。有什么办法吗?呵呵那是肯定的。
解决方法大致有如下2种: 1.将延时函数放在中断中在中断里查询延时的标志位。/*不仅仅用于键盘识别,亦可以用于其他的延时代码见EX1*/

  Delay函数具体延时多长时间,就要看你设定的T0定时器中断和Delaytime的乘积比如你的定时器中断为50MS,Delaytime为20的话那么50MS*20=1S。

  当然在实际过程当中并不是如此简单简洁的,还唏望大家能够举一反三哦... ^_^

写的我都头晕眼花看的你相信也好不到哪里去,有喜欢看视频的朋友可以在这里申请一个配套的视频以更加高罙的单片机视频:

我要回帖

 

随机推荐