一、基础篇
单片机的基本要素
CPU核(如:51核 AVR核 M430核)
ROM(READ ONLY Memory 绕母)
RAM(random accessMemory随机访问寄存器 )
片上外设
总线
CPU核:相当于电脑的CPU吧、就是执行从ROM中取指令。这东西有几个指标非常重要
一、主频(如51核是2MHZ晶振12分频过来就是2MHZ、AVR 是20MHZ(快达到DSP水平了)MSP430F1系列的是8MHZ)
二、指令集 (CISC(复杂) RISC(精简)当然精简指令集比复杂执行效率高很多个人觉得缺点实现的功能少 )
三、字长 (就是一次能处理二进制数据的位数 我们单片机一般是8位 16位 AVR和51都是8位)
ROM:相当于电脑的硬盘、存储程序用的指标就是容量 大多数是flash 结构基本都混淆说了
一、容量 单位一般KB位单位
二、高级指标 、自编能力(就是程序在运行中可以自己擦出flash然后更改flash中的内容的能力一般我们用不到)
如:51(不具备自编能力)-->8KB
MSP430F1101(具备)--> 1KB
AVR(具备)---> 16KB
RAM:数据存储器、相当于计算机的内存、ROM中的程序在运行时快速的存取数据、目前大多数单
片机为SRAM结构 计算机室SDRAM结构。指标也是容量 一般 B(字节) KB(千字节)
一、容量 、
如: 51单片机512字节
MSP430F1101 128字节
AVR 1KB 1千字节
主要是程序运行时调用一些变量啊调用一些数组等都是存在RAM中的。
片上外设:相当于电脑的接口,鼠标接口、显示器接口等
常见的片上外设模块有外部中断、定时器/计数器、URAT(异步串行)、SPI(同步)IIC(2线的串行口)ADC
及模拟比较器等。
如:一下三种价格10元左右的单片机
一、89C52就只有外部中断 定时器计数器 UART
二、MSP430F1101外部中断 定时器计数器 ADC
三、AVR 外部中断、定时器/计数器、URAT(异步串行)、SPI(同步串行)IIC(2线的串行口)ADC
及模拟比较器。
总线:用于以上四部分之间的传输数据的通道、相当于硬盘的IDE线、光驱线等。
总线只是一个概念。没有一个实际的这样的一个东西、这个东西我也不太清楚可以理解为一束功能相近的导线
的集合吧。
单片机能做什么?
单片机无所不能!
所谓的“微电脑控制控制”的核心就是单片机(微电脑控制比较时髦的)
覆盖工业生产、日常生活、军事设备、科研仪表仪器等所有智能化的应用场合
例如:智能洗衣机(一般洗衣机不能完成的功能)
定时完成洗衣脱水功能。
可以判断衣服的干净程度。
实现洗净既停的功能。
蒸汽熨烫的功能。
刷卡投币洗衣
更加智能LG公司的"IPAD"洗衣机一边洗衣一边听歌。
例如:(LED显示屏)
LED发光二极管构成显示屏的像素点
单片机负责逐点火逐行扫描,并与电脑通信获取图片信息。
例如:(PH/ORP仪表)
用于环境监测、工矿企业、科学研究、水产养殖等场合的PH值的测定
读取PH传感器的模拟信号、内部处理后显示在LCD上。(其实就是读取液体的PH值)
还有很多数码产品。。。
还有智能小车(我上大学时就做过这样一个东西呵呵用ATMEGA8)
一、巡线
二、避障
三、电视机遥控器遥控(接受各个遥控器的键码)
四、LCD显示
----------------------------------------------------------------------------------
二、单片机的开发工具
编程器(烧写器):将编译出来的目标代码固化到单片机的ROM内。(老的把单片机插到编程器上)
下载线:作用与编程器相同(ISP 通过一条下载线4根线和单片机通信就可以把代码下载到单片机、好处不需要把单片机从电路板拔下来)
仿真器:对单片机的程序进行单步调试、设置断点等,便于查找程序中的错误。其中JTAG仿真器可以在线仿真调试(它也分为2种一种是传统的需要把单片机拔下来然后把仿真器的仿真头插到板子上、通过后再把代码固化到单片机中然后把单片机放回板子上、最近新型的JTAG仿真器是属于在线仿真左边的、你只需要把单片机插到板子上把JTAG跟单片机相连接就可以进行仿真与调试同事JTAG也具有把代码固化到单片机中的能力、所以有仿真器的话下载线基本可以省了。)
软件开发环境
编辑与编译软件:WinAVR
仿真调试软件:AVR Studio
下载软件:MuCode ISP
硬件开发环境
仿真调试工具:JatgICE
下载线工具:STK200/300
学习板、开发板一块(型号 *-**-M16)
参考技术手册 AVR官方中文版技术手册《AVR单片机与GCC编程》
AVR单片机简介
AVR单片机的性价比远高于51单片机
一、高速 、RISC、主频最高可达20MHZ(首先主频就快10倍 RISC又扩大好几倍。)
二、低功耗、宽电压(1.8V---5.5V)。最低全速运行功耗<300uA
三、I/O驱动能力强、推拉电流能力均达30mA ,可以直接驱动继电器、蜂鸣器等。
(51 拉电流强估计有小于10mA 推电流基本是0 几百个微安了
四、片内资源丰富:外部中断、定时器/计数器、UART、SPI、IIC、ADC、模拟比较器。
尤其值得一提的是AVR的定时器功能也是非常强的能够实现PWM功能或输入捕获功能、PWM功能是非常强的可以用于电机的控制。
五、型号齐全、而且40脚以下的AVR均具有DIP封装形式。(8脚到100脚需要的领域基本都有相应的产品了)如下图。
ATMEGA系列中的ATmega16 应该算是我们用的最多一款因为很多人都是用它学习AVR单片机学习的入门。
上图三个是官方提供的开发工具 MK2仿真器:
JTAG ICE: 这个可以自制
选择AVR开发有一下几个优点
1、最小系统容易实现设计容易、只需要连接电源 焊接晶振就可以工作(当然如果对时钟要求不是很严格的话连晶振都可以不要的不像51单片机需要晶振、EA脚上拉上电复位电路、而AVR单片机内部自带内部上电复位电路的)。
2、很多概念符合初学者的思路、理解起来更容易:例如AVR时钟源(晶振、内部RC等)不经过分频直接提供给CPU使用,而51的主频等于晶振的12分频这个大家都知道的、所以这一点算定时器的时候非常方便,而51算就比较麻烦算定时周期就幻晕。
3、AVR即具有简单的、可以自制的ISP下载线和Jtage仿真器,又有DIP直插的封装形式。(51占用一个串口,是不能仿真串口的,属于软仿真,DIP直插很容易让初学者学习像430就没有DIP)
4、AVR的C语言编程与C语言教科书上的标准C语言语法是几乎一样的,不像51的C语言,一些bit srf 之类的变量定义在教科书中是找不到的,有利于后期的嵌入式学习。
实际例子:
电路图可以看到8个发光二极管可以进行闪烁和显示二进制显示等。
有图中可以看到这是ATmega16单片机,它的最小系统是非常简单的只要GND接地 VCC接+5V就可以了右边
的AGND/AVCC/AREF这三个脚是你用到片内模/数转换 ADC或模拟比较器的时候需要把这三个脚接上电源,如果正常用不到可以悬空就可以了。还有RESET可以悬空。Hander6 是一个简易的下载线的接口 MOSI ,MISO, SCK,RESET共4根线、8个二极管的阳极接PD0---PD7 (学过51的都知道一般都是阴极接I/O口这是因为51的灌电流能力很强,拉电流很弱)。这样阳极接I/O口也比较符合初学者的思维,I/O口输出1二极管是点亮的。
下面是如何用万用板焊接和编译程序:
焊接万用板就不说了,太简单了只要小心翼翼就ok了。焊接完成后,把ATmega 16 插到插座上,我们往单片机固化的程序采用的是我们自制的一个下载线如下图:
这个下载线电路还是比较简单的,只需要一片 74HC244(也可以直接跟并口相连,用244的原因是因为防止烧坏并口所以接了一个缓冲器,其实就是用并口模拟的时序ISP) 然后插到计算机后面的并口上,标准的AVR单片机下载线是10芯的接口的,但是只有其中的6芯是有用的。所以我们自制了一个10芯转6芯的一个线,把其中有用的6芯给引出来,顺序跟我们电路图上的一样的。然后把这个6芯线插到单片机引出的下载线的6芯接口上。然后找来一个5V电源然后插到单片机上的电源供电口,然后把下载线的软件下载软件 MuCode ISP 如下图是图标和打开后的样子:
下面我们编译一个测试代码:(打开AVR studio下图)
点击:New Project 弹出下图
第一项: ADORD AVR assemble 这个是会变得 这个是新建一个汇编语言的项目
第二项:AVR GCC 这个是C语言的项目 Project name 起个项目名字 test0
最下面的location 这个是路径 我们可以选择放在桌面上 (桌面上新建一个文件夹放进去就行了)
点击:finish 完成
点击:Next 下一步
下面的这步是选择仿真调试的工具和将要开发的单片机的型号:如下图
调试工具由于我们小板上没有喊JATG ICE接口 如果焊了我们可以选JTAG ICE 选项会如下图:
因为没有焊,我们直接下载到单片机运行验证。所以我们不选 JTAG ICE 选AVR Standlitor 意思就是软件仿真不用仿真器 然后右边选AT mega 16 如下图
点击:finish 进入环境 软件自动为我们建立一个.C 文件
因为C语言文件必须包含基本的头文件
#include
int main (void ){ //avr GCC的语法呢 的这个main函数必须是int 类型的 且没有返回值的
//由于发光二极管阳极是接在PD口上 属于PD口输出型的所以要把整个PD口都置为输出
//PD端口方向寄存器 叫做 DORD =0XFF的时候
DDRD =0XFF;//0到7 都置为输出
while(1){//因为单片机的程序不像PC机程序可以退出,所以单片机上电之后一般都是死循环的
PORTD=0b11100110;//这个表示TD口第一个数据寄存器给它赋值就等于赋值了
//0b表示 二进制 是从7位到第0位 左位高位
}
}
//然后点击编译 如下图
然后用 MuCode ISP 下载到单片机中 file ->open flash
点击:progarm 如下图
可以看到:如下图所表现
下面加一些动态效果能够让灯闪烁起来 无非是让产生两种状态 还有就是这个所有位就是取反
#include
int main (void ){ //avr GCC的语法呢 的这个main函数必须是int 类型的 且没有返回值的
DDRD =0XFF;//方向寄存器
while(1){
int i =0,j=0;
PORTD=0b11100110;
//其实执行这条C语句大概需要2条汇编指令的周期 而这个单片机的时钟周期是1MHZ 默认的是内部RC
振荡1MHZ 这样也就是每条指令时us级 所以人的眼睛是看不到的。加延时
for (j=0;j<10;j++)
for (i=0;i<10000;i++);//估算下这个for 循环消耗多长时间 每条指令几个微妙 而一个i++
大概5条指令
所以10000 * 5 *2= 100000 大概50毫秒 所以让这条for 执行10次左右
PORTD=0b00011001;//执行完了 加一个延时跟上面一样
for (j=0;j<10;j++)
for (i=0;i<10000;i++);//估算下这个for 循环消耗多长时间 每条指令几个微妙 而一个i++
大概5条指令
}
}
编译验证下:
可以看到mucode isp 自动就下载进去了。 因为有个选项是下图
这个勾上后就没当这个文件更新之后就自动下载到单片机里了。下面可以看到现象每隔1秒闪烁一次
由此说明我们的程序是成功的。今天到此结束。 bye !
最后送大家一句话:Nothing is impossible to a willing heart