当前位置:文档之家› atmega128单片机系列例程

atmega128单片机系列例程

atmega128单片机系列例程
atmega128单片机系列例程

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

ATmega128在开发应用中应注意的问题

ATmega128在开发应用中应注意的问题 摘要: ATmega128是一种与51系列不同的单片机,本文应用ICCAVR和pony prog2000作为主要开发工具,通过分析其在开发过程中特殊的开发方法,从而达到更好地掌握和使用ATmega128的目的。 关键词: ATmega128 单片机 ATmega128是AVR系列中功能最强的单片机,具有如下主要特点: (1)先进的RISC精简指令集结构:ATmega128具有133条功能强大的指令,大部分指令在单时钟周期内执行;有32b×8个通用工作寄存器;片内带有执行时间为2个时钟周期的硬件乘法器。 (2)非易失性程序和数据存储器:ATmega128具有128KB在线可重复编程Flash、4KB的E2PROM以及4KB内部SRAM。在其BOOT区具有独立的加密位,可通过片内的引导程序实现在系统编程,写操作时真正可读。 (3)具有JTAG接口:通过JTAG接口对Flash、E2PROM熔丝位和加密位编程。 (4)增强的硬件功能:ATmega128具有2个带预分频器和一种比较模式的8位定时/计数器;2个扩充的带预分频器和比较模式、捕获模式的16位定时/计数器;独立振荡器的实时计数器;2通道8位PWM;6通道2~16位精度PWM;8通道10位A/D转换;输出比较调节器;8个单端通道;7个微分通道;2个增益为1x、10x或200x的微分通道;二线(I2C)串行接口;2路可编程串行UART接口;主/从SPI串行接口;带内部振荡器的可编程看门狗定时器等。 (5)独有的特点:上电复位和可编程的低电压检测;内部可校准的RC振荡器;5种睡眠模式,即空闲模式、ADC噪声抑制模式、省电模式、掉电模式、待命模式和扩展待命模式;可通过软件选择时钟频率;通过1个熔丝选定ATmega103兼容模式;全局上拉禁止。 笔者通过使用ATmega128单片机,总结出在使用ATmega128过程中应注意的问题,希望能给即将使用该单片机的读者提供有用的信息。 1 ATmega128的开发工具及其应注意问题 随着用户对编译器的要求越来越高,开发商也在不断地提高编译器对用户的方便程度。目前的大趋势是从用汇编语言开发单片机发展到用C语言开发。笔者在对开发ATmega128编译器的选择时,考虑到时间上的局限以及开发的方便性等问题,最终选择了ImageCraft的ICCAVR工具。 ICCAVR是一种使用符合ANSI标准的C语言开发微控制器程序的工具。它集合了编译器和工程管理器的集成工作环境(IDE),可以编译生成INTEL HEX格式文件。 ICCAVR和人们通常所用的编译器的使用的方法大同小异,故本文不再详述。本文主要对使用中应当注意的问题作一介绍。 (1)该编译器在设置中有一项“Return Stack Size”,默认值为16,但在程序量很大而且子函数较多的情况下,该默认值就不适合了,编译时会出错。碰到这种情况建议将该选项的值改大。 (2)在经过一段时间的使用后,发现该编译器对C语言的编译效率不是很理想。但设置当中有一编译优化选择项“Enable Code Compression”,使用它在一定情况下可以减少程序所占的空间。不过当程序在“default”编译优化选择的情况下所占的程序空间达到95%以上时,使用“Enable Code Compression”编译就会出错。所以笔者认为,虽然ATmega128具有128KB的程序空间,但在使用过程中也应当考虑到数据结构方面的问题。 应用ICCAVR生成hex文件以后,下一步就是将hex文件烧录到ATmega128中去。笔者选用的软件是PonyProg2000。这是一款操作简单但功能强大的烧录软件,它支持包括AVR、PIC

单片机如何产生PWM

单片机产生PWM 1.PWM定义 脉冲宽度调制(PWM)是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。 脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。 2.PWM控制的基本原理 理论基础:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。 图1 形状不同而冲量相同的各种窄脉冲 面积等效原理: 分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述

脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。 图2冲量相同的各种窄脉冲的响应波形 3. PWM相关概念 占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比 如,一PWM的频率是1000Hz,那么它的时钟周期就是1ms,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。 分辨率:占空比最小能达到的值,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。 频率:如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到。相对于周期就是65535*计数脉冲时间。 双斜率 / 单斜率: 假设一个PWM从0计数到80,之后又从0计数到80.......这个就是单斜率。 假设一个PWM从0计数到80,之后是从80计数到0.......这个就是双斜率。

单片机35个实例1(汇编)

1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此, 我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太 大,所以我们在执行某一指令时,插入延时程序,来达到我们 的要求,但这样的延时程序是如何设计呢?下面具体介绍其原 理: 如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒 机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248 =498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002

因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7 =248时,延时10ms,以此为基本的计时单位。如本实验要求 0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如 下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据 发光二极管的单向导电性可知,这时发光二极管L1熄灭;当 P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我 们可以使用SETB P1.0指令使P1.0端口输出高电平,使用 CLR P1.0指令使P1.0端口输出低电平。 5.程序框图

合泰单片机生成pwm

#include "HT66FU70A.h" #define RS _pc0 #define RW _pc1 #define E _pd6 float ad_shidu; //湿度变量 float ad_wendu; //温度变量 char Sunshine; //光照变量 char timer0_cnt; long int m; unsigned int temp=0; void ad_init(void) //A/D转换初始化 { //8分频;内部1.25V电压除能;内部参考电源电压来源于VDD _adcr1 = 0x03; //启动A/D转换模块(ADCR0寄存器第5位) _adoff = 0; } void ad_pa1(void) //pa1端口ad配置 { //定义PA1为A/D输入,即AN1 _pas0 = 0x30; //选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x01; } void ad_pa3(void) //pa3端口ad配置 { //定义PA1为A/D输入,即AN1 _pas1 = 0x30; //选择模拟通道AN1;ADC数据高字节是ADRH的第7位,低字节是ADRL的第4位_adcr0 = 0x03; } //开始进行ad转换 void ad_switch(void)

{ //ADCR0寄存器第七位 _start=1; //start位0->1->0,表示启动A/D转换 _start=0; } void pwn_1(void) { _pcc5=0; //输出 _pcpu5=1; //上拉 // _pc5 = 1; _pcs2 |= (2 << 4); //PC5 功能选择为TM1输出 // _tm1c1=0b10101000; // _tm1c0=0b00001111; _tm0c0 |= (0 << 4); //fsys/4 _tm0c0 |= (1 << 0); //CCRP:001b _tm0al = 0x3f; _tm0ah = 0x00; _tm0c1 |= (2 << 6); //PWM模式 _tm0c1 |= (2 << 4); //PWM 输出 _tm0c1 |= (1 << 3); //高有效 _tm0c1 &=~(1 << 1); //CCRP-周期CCRA-占空比_tm0c0 &=~(1 << 7); //运行定时器 _tm0c0 |= (1 << 3); //计数器On /*_tm0c0 |= (1 << 3); //计数器On*/ } void pwn_2(void) { _pcc6=0; //输出 _pcpu6=1; //上拉 // _pc5 = 1; _pcs3 |= (1 << 0); //PC5 功能选择为TM1输出 // _tm1c1=0b10101000; // _tm1c0=0b00001111; _tm0c0 |= (0 << 4); //fsys/4 _tm0c0 |= (1 << 0); //CCRP:001b _tm0al = 0x3f; _tm0ah = 0x00; _tm0c1 |= (2 << 6); //PWM模式 _tm0c1 |= (2 << 4); //PWM 输出 _tm0c1 |= (1 << 3); //高有效

51单片机指令表汇总

51单片机指令表 助记符指令说明字节数周期数 (数据传递类指令) MOV A,Rn 寄存器内容传送到累加器 1 1 MOV A,direct 直接地址内容传送到累加器 2 1 MOV A,@Ri 间接RAM内容传送到累加器 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器内容传送到寄存器 1 1 MOV Rn,direct 直接地址内容传送到寄存器 2 2 MOV Rn,#data 立即数传送到寄存器 2 1 MOV direct,Rn 寄存器内容传送到直接地址 2 2 MOV direct,direct 直接地址传内容传送到直接地址 3 2 MOV direct,A 累加器内容传送到直接地址 2 1 MOV direct,@Ri 间接RAM内容传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 累加器内容传送到间接RAM 1 1 MOV @Ri,direct 直接地址内容传送到间接RAM 2 2 MOV @Ri,#data 立即数传送到间接RAM 2 1 MOV DPTR,#data16 16 位地址传送到数据指针 3 2 MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8位地址)内容传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16位地址)内容传送到累加器 1 2 MOVX @Ri,A 累加器内容传送到外部RAM(8位地址) 1 2 MOVX @DPTR,A 累加器内容传送到外部RAM(16 地址) 1 2 PUSH direct 直接地址内容压入堆栈 2 2 POP direct 堆栈内容弹出到直接地址 2 2 XCH A,Rn 寄存器和累加器交换 1 1 XCH A, direct 直接地址和累加器交换 2 1

ATMEGA128--AVR教程

AVR教程(1):AVR单片机介绍 作者:微雪电子文章来源:https://www.doczj.com/doc/1918420253.html, 点击数: 478 更新时间:2008-4-1 23:58:21 AVR,它来源于:1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。 AVR单片机特点 每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,AVR 8-bit MCU最大的特点是:●哈佛结构,具备1MIPS / MHz的高速运行处理能力; ●超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC 进行处理造成的瓶颈现象; ●快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发; ●作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力; ●片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠; ●大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comp arator,WDT等; ●大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。 ●性价比高。 开发AVR单片机,需要哪些编译器、调试器? 软件名称类型简介官方网址 AVR Studio IDE、汇编编 译器 ATMEL AVR Studio集成开发环境(IDE),可使用 汇编语言进行开发(使用其它语言需第三方软件协 助),集软硬件仿真、调试、下载编程于一体。ATMEL 官方及市面上通用的AVR开发工具都支持AVRStudio。 https://www.doczj.com/doc/1918420253.html, GCCAVR (WinAVR) C编译器 GCC是Linux的唯一开发语言。GCC的编译器优化 程度可以说是目前世界上民用软件中做的最好的,另 外,它有一个非常大优点是,免费!在国外,使用它 的人几乎是最多的。但,相对而言,它的缺点是,使 https://www.doczj.com/doc/1918420253.html,

Atmega128开发板使用说明书

Atmega128开发板使用说明书 概要介绍 Atmega128开发板上硬件资源丰富,接口齐全,基本上涵盖了Atmega128单片机所能涉及到的所有功能,可以满足单片机开发工程师和电子爱好者的开发实验的需求,或者高校电子、计算机专业学生的学习实验的需要。 按照正规产品的要求设计,不纯粹是实验样品,器件选型、原理图、PCB设计的时候都充分考虑了可靠稳定性。 Atmega128的IO口资源丰富,板上所以接口都是独立使用的,不需要任何跳线进行设置, IO口外围扩展使用了2片锁存器74HC574,既可以使实验变得更加简单方便,又能让实验者掌握更多的单片机设计知识。 提供配套软件源代码,学习板的每个实验都有与其相对应的软件代码,是版主从多年的工作经验中提取出来的,并经过优化,具有较高的参考价值。 编程简单,学习板编程不需要专用烧录器,利用计算机的并口即可进行编程,速度快、操作简单。

1.产品清单 Atmega128开发板的配件清单如下,当您第一次拿到产品的时候,请参照下图认真核对包装内配件是否齐全,以及各配件是否完好无损。 请按照下图安装122*32 LCD,lCD的一脚对准122*32 LCD插座的一脚,切记不要插反

2.硬件布局说明 步 进 电 机 接 口 直 流 电 机 接 口 数 字 温 度 传 感 器 SD 卡 插 座 光 敏 电 阻 ADC 输 入 电 位 器 NTC 热 敏 电 阻 JTAG 接 口 继 电 器 接 口 9V电源输入接口 DAC输出接口 RS485接口 RS232接口 红 外 发 射 管 ISP 编 程 接 口 LCD 对 比 度 调 节 电 位 器 122 * 32 点 阵 LCD 接 口 16 * 2 字 符 LCD 接 口 红 外 接 收 管 433M 射 频 模 块 接 口 3 * 4 矩阵键盘

51单片机产生PWM的程序

51单片机产生PWM的程序 其中P1.3 P1.4是两个输出/**************************************************************** *程序思路说明: * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样可以设定占空比可从1-100变化。即0.01ms*100=1ms * ***************************************************************** *************/ #include #define uchar unsigned char /**************************************************************** ************* * TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; * * TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 * * 间为1ms*65536=65.536ms * ***************************************************************** *************/ #define V_TH0 0XFF #define V_TL0 0XF6 #define V_TMOD 0X01 void init_sys(void); /*系统初始化函数*/ void Delay5Ms(void); unsigned char ZKB1,ZKB2; void main (void) { init_sys(); ZKB1=40; /*占空比初始值设定*/ ZKB2=70; /*占空比初始值设定*/ while(1) {

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

单片机PWM(脉冲宽度调制)原理与实现

、PWM原理 2、调制器设计思想 3、具体实现设计 一、PWM(脉冲宽度调制Pulse Width Modulation)原理: 脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。图1所示为脉冲宽度调制系统的原理框图和波形图。该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。 通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。因而,采样值之间的时间间隔是非均匀的。在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs< (1) 其中,x{t}是离散化的语音信号;Ts是采样周期;是未调制宽度;m是调制指数。 然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t = k Ts处,在相邻脉冲间变化缓慢,则脉冲宽度调制波xp(t)可以表示为: (2) 其中,。无需作频谱分析,由式(2)可以看出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构成。当时,相位调制部分引起的信号交迭可以忽略,因此,脉冲宽度调制波可以直接通过低通滤波器进行解调。 二、数字脉冲宽度调制器的实现: 实现数字脉冲宽度调制器的基本思想参看图2。 图中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。 图3 为了使矩形脉冲的中心近似在t=kTs处,计数器所产生的数字码不是由小到大或由大到小顺序变化,而是将数据分成偶数序列和奇数序列,在一个计数周期,偶数序列由小变大,直到最大值,然后变为对奇数序列计数,变化为由大到小。如图3例子。 奇偶序列的产生方法是将计数器的最后一位作为比较数据的最低位,在一个计数周期内,前半个周期计数器输出最低位为0,其他高位逐次增大,则产生的数据即为偶数序列;后半个周期输出最低位为1,其余高位依次减小,产生的数据为依次减小的偶序列。具体电路可以由以下电路图表示: 三、8051中的PWM模块设计:

单片机程序源代码

第二章 任务一:闪烁广告灯的设计 利用89C51单片机的端口控制两个LED ( DO和D1 ),编写程序,实现两个LED互闪。 #include #define uint unsigned int #define uChar unsigned Char sbit LED仁POP; sbit LED2=P0A1; void delayms(uint ms) { uint i; while(ms--) { for(i=O;i<12O;i++); } } void main() { while(1) { LED1=O; LED2=1; delayms(5OO); LED1=1; LED2=O; delayms(5OO); } } 任务二:流水广告灯的设计 利用89c51单片机的端口控制8个LED( D0~D7 )循环点亮,刚开始时DO点亮,延时片刻后,接着D1 点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->DO ,重复循环。 #include #include #define uint unsigned int #define uchar unsigned char uint i; uchar temp; uint a[8]={Oxfe,Oxfd,Oxfb,Oxf7,Oxef,Oxdf,Oxbf,Ox7f}; void delayms(uint ms) { while(ms--) { uint j; for(j=0;j<120;j++); } }

C51单片机指令集大全

格式功能简述字节数周期 一、数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,@Ri 内部RAM单元送累加器 1 1 MOV @Ri ,A 累加器送内部RAM单元 1 1 MOV A ,#data 立即数送累加器 2 1 MOV A ,direct 直接寻址单元送累加器 2 1 MOV direct ,A 累加器送直接寻址单元 2 1 MOV Rn,#data 立即数送寄存器 2 1 MOV direct ,#data 立即数送直接寻址单元 3 2 MOV @Ri ,#data 立即数送内部RAM单元 2 1 MOV direct ,Rn 寄存器送直接寻址单元 2 2 MOV Rn ,direct 直接寻址单元送寄存器 2 2 MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1 XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1 XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1 POP direct 栈顶弹出指令直接寻址单元 2 2 PUSH direct 直接寻址单元压入栈顶 2 2 二、算术运算类指令 ADD A, Rn 累加器加寄存器 1 1 ADD A,@Ri 累加器加内部RAM单元 1 1 ADD A, direct 累加器加直接寻址单元 2 1 ADD A, #data 累加器加立即数 2 1 ADDC A, Rn 累加器加寄存器和进位标志 1 1 ADDC A,@Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1 ADDC A, direct 累加器加直接寻址单元和进位标志 2 1 INC A 累加器加1 1 1 INC Rn 寄存器加1 1 1

按键控制单片机PWM输出设计

学号1322010110 天津城建大学 单片机原理及应用A课程 设计说明书 按键控制单片机PWM输出设计起止日期:2016年05月30日至2016年6月10日 学生姓名 班级 成绩 指导教师(签字) 控制与机械工程学院 2016年6月10日

目录 第一章系统方案设计 (1) 1.1 PWM (1) 1.2 STC12C5A60S2简介 (1) 1.3 仿真工具介绍 (2) 1.3.1 Protues简介 (2) 1.3.2 Keil uVision3简介 (4) 第二章硬件电路设计 (5) 2.1 复位电路 (5) 2.2 时钟电路 (5) 2.3 按键中断 (5) 2.4 显示电路 (6) 第三章程序设计流程图 (7) 第四章系统仿真 (8) 4.1 仿真图 (8) 4.2 程序 (8) 4.3 PCB.................................................................................................................. 错误!未定义书签。参考资料 ....................................................................................................................... 错误!未定义书签。

第一章系统方案设计 1.1 PWM PWM的全称是Pulse Width Modulation(脉冲宽度调制),它是通过改变输出方波的占空比来改变等效的输出电压。 1.2 STC12C5A60S2简介 STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。 1)管脚说明: 1、P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。当P0口 作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 2、P1.0/ADC0/CLKOUT2 标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 3、P1.1/ADC1 4、P1.2/ADC2/ECI/RxD2 标准IO口、ADC输入通道2、PCA计数器的外部脉冲输入脚,第二串口数据接收端 5、P1.3/ADC3/CCP0/TxD2 外部信号捕获,高速脉冲输出及脉宽调制输出、第二串口数据发送端 6、P1.4/ADC4/CCP1/SS非 SPI同步串行接口的从机选择信号 7、P1.5/ADC5/MOSI SPI同步串行接口的主出从入(主器件的输入和从器件的输出) 8、P1.6/ADC7/SCLK SPI同步串行接口的主入从出 9、P2.0~P2.7 10、P2口内部有上拉电阻,既可作为输入输出口(8位准双向口),也可作为高8位地址总线使用。 11、P3.0/RxD 标准IO口、串口1数据接收端 12、P3.1/INT0非 外部中断0,下降沿中断或低电平中断 13、P3.3/INT1 14、P3.4/T0/INT非/CLKOUT0 定时器计数器0外部输入、定时器0下降沿中断、定时计数器0的时钟输出 2)A/D转换器的结构: STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口,有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型IO口,用户可以通过软件设置将8路中的任何一路设置为A/D 转换,不须作为A/D使用的口可继续作为IO口使用。 单片机ADC由多路开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器以及ADC_CONTER

单片机设计PWM三种方式

第一次学单片机,学到PWM 的时候刚好有很多事,就学的很是纠结。今晚不对是今晨,大概三点半有了一点思路,写下来,以飨初学者。 设计思路: A.单纯的通过延时程序,让单片机在某段时间内输出高电平,另一段时间内输出低 电平。思路很简单,但是稳定性有待商榷,频率不可调。 B.利用一个定时器,提高计时精度,if 语句 if(num == 1) // 设定占空比80% { led = 1; } else if(num == 5) { num = 0; led = 0; } 此方法稳定性也不是很高有大概10% 的占空比波动,当然也可以按位取反,不过占空比就只能是50% 了有一个人,做而论道这是他的百度 用户名,很强的一个人,使用三个定时器一个T0 控制频率两个外部中断INT0 INT1 分别控制pwm 的加减并且用数码管输出占空比的级数,程序摘录如 下,调节占空比的部分比较出彩 //========================================== #include unsigned int a, b; // ---------------------------- void main() { TMOD = 0x01; //T0 定时方式 1 TH0 = (65536-50000) / 256; //50ms@12MHz TLO = (65536-50000) % 256; TRO = 1; ET0 = 1; EX0 = 1; EX1 = 1;

IT0 = 1; IT1 = 1; EA = 1; a = 0; b = 10; while(1); } // ---------------------------- void time0() in terrupt 1 { TL0 = (65536-50000) % 256; TH0 = (65536-50000) / 256; 〃50ms@12MHz a++; if(a == 20) a = 0; // 在这里调整周期. if(a < b) P2 = 0xff; // 在这里调整占空比. else P2 = 0x00; P0 = ((b / 10) << 4) + b % 10; // 显示占空比等级 } // ---------------------------- void X0_INT() in terrupt 0 { b++; if(b > 19) b = 19; // 占空比等级最大为19 } // ---------------------------- void X1_INT() in terrupt 2 { b--; if(b < 1) b = 1; // 占空比等级最小为1. } //========================================== 原文链接关于MCS-51单片机实现PW啲方法_做而论道的空间_百度空间 C.在定时器里开启定时器,需要两个定时器,第一个控制频率,第二个控制 占空比稳定性非常高。 #include

常用51单片机汇编指令

常用单片机汇编指令: 1 .MOV A,Rn寄存器内容送入累加器 2 .MOV A,direct 直接地址单元中的数据送入累加器 3 .MOV A,@Ri (i=0,1) 间接RAM中的数据送入累加器 4 .MOV A,#data 立即数送入累加器 5 .MOV Rn,A累加器内容送入寄存器 6 .MOV Rn,direct 直接地址单元中的数据送入寄存器 7 .MOV Rn,#data 立即数送入寄存器 8 .MOV direct,A 累加器内容送入直接地址单元 9 .MOV direct,Rn 寄存器内容送入直接地址单元 10. MOV direct,direct 直接地址单元中的数据送入另一个 直接地址单元 11 .MOV direct,@Ri (i=0,1) 间接RAM中的数据送入直接地址单元 12 MOV direct,#data 立即数送入直接地址单元 13 .MOV @Ri,A (i=0,1) 累加器内容送间接RAM单元 14 .MOV@Ri,direct (i=0,1)直接地址单元数据送入间接RAM 单元 15 .MOV @Ri,#data (i=0,1) 立即数送入间接RAM单元 16 .MOV DPTR,#data16 16 位立即数送入地址寄存器 17 .MOVC A,@A+DPTR以DPTR^基地址变址寻址单元中的数 据送入累加器

18 .MOVC A,@A+PC以PC为基地址变址寻址单元中的数据送入累加器 19 .MOVX A,@Ri (i=0,1) 外部RAM(8位地址)送入累加器 20 .MOVX A,@DPTR外部RAM(16位地址)送入累加器 21 .MOVX @Ri,A (i=0,1) 累计器送外部RAM(8位地址) 22 .MOVX @DPTR,A累计器送外部RAM( 16位地址) 23 .PUSH direct 直接地址单元中的数据压入堆栈 24 .POP direct 弹栈送直接地址单元 25 .XCH A,Rn 寄存器与累加器交换 26 .XCH A,direct 直接地址单元与累加器交换 27 .XCH A,@Ri (i=0,1) 间接RAM与累加器交换 28 .XCHD A,@Ri (i=0,1) 间接RAM的低半字节与累加器交换算术操作类指令: 1. ADD A,Rn 寄存器内容加到累加器 2 .ADD A,direct 直接地址单元的内容加到累加器 3 A.DD A,@Ri (i=0,1) 间接ROM的内容加到累加器 4 .ADD A,#data 立即数加到累加器 5 .ADDC A,Rn寄存器内容带进位加到累加器 6 .ADDC A,direct 直接地址单元的内容带进位加到累加器 7 .ADDC A,@Ri(i=0,1) 间接ROM的内容带进位加到累加器 8 .ADDC A,#data 立即数带进位加到累加器

如何读懂单片机程序

如何读懂单片机程序 这是一篇关于单片机入门的基础文章!刚刚接触单片机的朋友,简直是无从下手,打开一个程序,更会被复杂的结构和密密麻麻的代码吓倒!多么想找个人耐心的指导一下,是你们内心的强烈意识!好吧,我来满足你! 我对单片机的总结:“单片机其实就是一个芯片,内部有若干寄存器,外部有若干引脚,我们可以通过程序控制内部的寄存器使得引脚与外部世界保持联系!”就这几句话,道出了单片机的真谛!有没有感觉到单片机是多么的简单! 1.单片机程序执行流程 这是我们首先必须要知道的。单片机程序一般就有两种,一种是汇编程序,一种是c语言程序。这里我们讲c语言程序。 单片机程序都有一个包含主函数的文件,包含主函数的文件都有一个统一的结构,如下所示: #include "xxx.h" int main() // 这是主函数的函数名 { ......; // 若干条语句 ......; while(1) // while括号中是1,说明程序进入后将在while里面无线循环,不会出来了,不懂的去看c语言基础之while篇 { ......; // 若干条语句 ......; } } 重点:单片机一上电,从主函数main的第一条语句开始执行,是一条语句接着一条语句从上而下执行,直到进入while后,再从while的第一条语句执行到最后一条语句,由于是死循环,会再从while的第一条语句执行到最后一条语句,如此反复执行,永不停止!直到断电! 这些语句当中,有些是函数的调用,遇到函数的调用,进入到函数,再从函数的第一条语句执行到最后一条语句,然后跳出函数,再从刚才主函数中那条函数的下一条语句开始执行。如果实在搞不明白函数是怎么一回事,你可以用函数里面的所有语句代替函数在主函数中的位置。例如:

相关主题
文本预览
相关文档 最新文档