单片机编程易忘易错笔记
- 格式:docx
- 大小:1.64 MB
- 文档页数:5
时间:2015.4.24 18:30~22:00 地点:信息馆444上课要求:学会新建工程、下载程序、点亮第一个LED灯学到的知识点:1. 学会了keil软件的使用2. 学会了下载程序3. 学会了使用sbit命令定义特殊功能寄存器的位变量遇到的问题:编程时无法识别#include等C语言语句,导致无法编译生成Hex文件解决:未将新建Keli文件以c_file格式保存编写的程序是:LED1.cLED1.c实现的功能是:使第一个LED灯点亮附录:LED1程序#include<reg52.h>sbit LED=P1^0;void main(){LED=0;}时间:2015.4.25 17:00~20:00 地点:寝室学习内容:延时函数和流水灯程序的编写知识点:1.宏定义2.延时函数的编写3.Intrins.h头文件内包含的左移以及右移函数4.实现流水灯编写的程序:LED.c#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint);uchar aa;void main(){aa=0xaa;while(1){P1=aa;delayms(500);aa=_crol_(aa,1);}}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}时间:2015.5.8 18:30~22:00 地点:信息馆444上课要求:编写程序使LED灯(1)奇数位置与偶数位置的灯交替亮,重复三次;(2)一个灯上下循环三次;(3)两个灯从两边到中间重复三次;(4)两个灯从中间到两边重复三次;(5)所有灯闪烁三次,熄灭LED灯;(6)所有动作间隔均为300ms编写的程序:#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuint temp[4]={0x7e,0xbd,0xdb,0xe7};uint k,l,m,n,p,q;uchar aa;void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void A1(){for(m=0;m<=2;m++){for(n=0;n<=3;n++){P1=temp[n];delay(300);}}}void A2(){ for(p=3;p>0;p--){P1=temp[3];delay(300);P1=temp[2];delay(300);P1=temp[1];delay(300);P1=temp[0];delay(300);}}void main(){for(k=3;k>0;k--){P1=0xaa;delay(300);P1=0x55;delay(300);}aa=0xfe;for(k=0;k<=23;k++){P1=aa;aa=_crol_(aa,1);delay(300);}A1();A2();For(q=2;q>=0;q--){P1=0;delay(300);P1=0xff;delay(300);}while(1)P1=0xff;}时间:2015.5.15 18:30~22:00 地点:信息馆444要求:1. 利用定时/计数器T0,让第一个发光二极管间隔1s闪烁。
第六章
1.定时:此时记得是晶振分频后的均匀脉冲,从而实现定时
2.计数:此时记的是单片机外部引脚输入单片机的脉冲信号,从而实现计数。
3.脉冲来源有两个地方:晶振产生的脉冲信号经过12分频后变宽了,频率变为经侦频率的1/12,经过分频的信号给了定时器,定时器接到脉冲就会自动加1,满了以后标志位从0编程1;
另一个来源是单片机的外部引脚P3.4和P3.5,用定时器T0数的是P3.4引脚输入的脉冲,用定时器T1数的是P3.5引脚输入的脉冲。
4.特殊功能计数器TMOD中(其中某一位)设置单片机是处于计数还是定时状态
5.单片机的定时器/计数器每接到一个脉冲就自动把记的数加1,这个数就放在了TH0,TL0及TH1,TL1中。
计数器是十六位的寄存器,所以能存储的数据范围是0-65535。
TH0/1(高八位)D15、D14、D13、D12、D11、D10、D9、D8
TL0/1(低八位)D7、D6、D5、D4、D3、D2、D1、D0。
8051单片机学习笔记8051单片机将程序存储器和数据存储器分开,各有各的寻址机构和寻址方式,称为哈佛型结构单片机通用微机只有一个存储器,可随意安排ROM和RAM,使用同一种指令访问,称为普林斯顿型结构8051在物理上有四个存储空间:片内程序存储器ROM,片内数据存储器RAM,片外程序存储器,片外数据存储器64K字节的程序存储器ROM中,有4K字节0000H~0FFFH是内部ROM和外部ROM公用的,1000H~FFFFH 是外部ROM专用的,CPU提供了一个控制信号EA来区分内外部ROM的公共地址区,当EA为高电平时,单片机从片内ROM的4K地址读取指令,当指令地址超过0FFFH时,自动转向片外ROM读取指令;当EA为低电平时,单片机只从外部ROM读取指令,这种接法适合8031,因为8031没有内部ROM,只能从外部ROM 读取指令程序存储器的某些单元是保留给系统使用的:0000H~0002H是所有执行程序的入口地址,复位以后,CPU总是从0000H开始执行程序0003H~002AH单元均匀地分为五段,用作五个中断服务程序的入口,用户程序不应进入上述区域数据存储器RAM也有64KB寻址区,在地址上是和ROM重叠的,当从外部ROM读取指令时用选通信号PSEN,而从外部RAM读写数据时用RD和WR来选通,这样地址就不会重叠.8051的内部RAM被分为两个部分00H~7FH是真正的RAM区,可读写各种数据00H~1FH安排了四组工作寄存器,每组占用8个RAM字节,记为R0~R7,在某一时刻,CPU只能使用其中一组寄存器,由程序状态寄存器PSW的两位来确定20H~2FH是可位寻址区,从20H的第0位到2FH的第7位,共128位,用位地址00H~FFH与之一一对应,对于需要按位操作的数据,可存放于此.30H~7FH是一般的RAM80H~FFH是特殊功能寄存器(SFR)区域,每个寄存器为8位,8051有21个,8052有26个8052增加了128字节的RAM单元,地址为80H~FFH,与特殊功能寄存器区域重叠,但可通过指令加以区别. 内部RAM的各个单元,都可以通过直接地址来寻找,而对于工作寄存器,则直接用R0~R7,对特殊功能寄存器,也是直接使用其名字比较方便。
C51单片机步步学笔记(最新更新)管理提醒:本帖被icneo 执行取消置顶操作(2009-01-02)作为一个初学者,如何单片机入门?我需要那些知识和设备?知识上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。
一般的大学毕业生都可以了,自学过这2门课程的高中生也够条件。
设备上,一般是建议购买一个仿真器,这样才可以进行实际的,全面的学习。
日后在工作上,仿真器也大有用处还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板。
学习板一般价格都比较贵,而且许多学习板配套程序和讲解不够完善。
这里介绍的是最简单的学习板,4个按键加4个LED发光管,一个蜂鸣器,一个24c 02即可。
通过30个教程,初学者可以学到:单片机控制外部设备,读取外部设备状态,外部中断的应用,中断的深入理解,变量和标记的灵活应用,定时器的灵活应用,可编程自动控制的方法,按键控制设备动作的方法,PWM输出的设计,存储器的读写,延时报警器的设计,各种报警音的设计,音乐播放的设计,程序模块化的设计等等知识。
虽然,这些知识的覆盖面有限,但是,当你学习并掌握了这30个试验之后,您就会豁然开朗,单片机的编程控制如此简单!学习完后,您就已经完全地入门了,并可以自主地对其它的单片机知识进行学习、试验,甚至进行项目开发!第一课了解单片机及单片机的控制原理,控制一个LED 灯的亮和灭本章学习内容:单片机基本原理,如何仿真器,如何编程点亮和灭掉一个LED 灯,如何进入KEILC51uV 调试环境,如何使用单步,断点,全速,停止的调试方法单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。
可以说,掌握了单片机开发,就多了一个饭碗。
51 单片机已经有30 多年的历史了,在中国,高校的单片机课程大多数都是51,而51 经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。
MC51单片机学习笔记一准备知识:1.内部结构:4K Rom 程序存储器(硬件)128节Ram随机存储器(软件)8位cpu,4个8位并口,1个全双串行口,2个16位定时器/计数器;寻址范围64k 布尔处理器CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;ROM:用以存放程序、一些原始数据和表格;I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式五个中断源的中断控制系统;一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
最高振荡频率取决于单片机型号及性能。
2.分类:arm(快)凌阳(处理声音较好)3.型号说明:STC (公司名) 89(系列)C(CMOS;CAD:自带AD转换;S:串行下载无需专门的编程器;lv:工作电压为3v)51(1*4=4K) RC 40(晶振最高频率)C(商业级:温度0--85,I工业级温度-40--125)----PDIP (双列直插式)0721(07年第21周).........4.电平:TTL:高:+5v--低0v;RS232:计算机串口:+12v--低-12v,故计算机和单片机通信需要电平转换芯片5.二进制与十六进制之间的转换:每4位转变一次6.二进制转换逻辑符号:&与,//或,---非,异或7. P3第二功能各引脚功能定义:P3.0:RXD串行口输入P3.1:TXD串行口输出P3.2:INT0外部中断0输入P3.3:INT1外部中断1输入P3.4:T0定时器0外部输入P3.5:T1定时器1外部输入P3.6:WR外部写控制(计数)P3.7:RD外部读控制RST :复位管脚,高电平有效,时间大于两个机器周期VPD:备用电源注:机器周期和指令周期(1)振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,TX实验板上为11.0592MHZ。
延时:代码第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。
第二和第四条实现的原理稍后谈,先看第五条,LJMP是一条指令,意思是转移,往什么地方转移呢?后面跟的是LOOP,看一下,什么地方还有LOOP,对了,在第一条指令的前面有一个LOOP,所以很直观地,我们可以认识到,它要转到第一条指令处。
这个第一条指令前面的LOOP被称之为标号,它的用途就是给这一行起一个名字,便于使用。
是否一定要给它起名叫LOOP呢?当然不是,起什么名字,完全由编程序的人决定,可以称它为A,X等等,当然,这时,第五条指令LJMP后面的名字也得跟着改了。
第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是LCALL,这条指令称为调用子程序指令,看一下指令后面跟的是什么,DELAY,找一下DELAY,在第六条指令的前面,显然,这也是一个标号。
这条指令的作用是这样的:当执行LCALL指令时,程序就转到LCALL后面的标号所标定的程序处执行,如果LOOP:SETB P10 ;(1)LCALL DELAY ;(2)CLR P10 ;(3)LCALL DELAY ;(4)AJMP LOOP ;(5);以下子程序DELAY:MOV R7,#250;(6)D1:MOV R6,#250 ;(7)D2:DJNZ R6,D2 ;(8)DJNZ R7,D1 ;(9)RET ;(10)END ;(11)在执行指令的过程中遇到RET指令,则程序就返回到LCALL指令的下面的一条指令继续执行,从第六行开始的指令中,可以看到确实有RET指令。
在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8,9条指令后将遇到第10条令:RET,执行该条指令后,程序将回来执行第三条指令,即将P10清零,使灯亮,然后又是第四条指令,执行第四条指令就是转去执行第6,7,8,9,10条指令,然后回来执行第5条指令,第5条指令就是让程序回到第1条开始执行,如此周而复始,灯就在不断地亮、灭了。
单片机C 语言 笔记第三章:单片机内部资源一、中断系统1、基本概念(1)、5个中断源:外部中断源:0INT ,1INT 。
内部中断源为:定时器/计数器0、 1溢出中断,串口中断(T 、R)。
(2)、中断优先部分由中断优先级寄存器IP控制。
EA :中断总允许位。
IE.6:保留位。
ET2:定时器/计数器2溢出中断总允许位。
ES :串行口收、发中断允许为。
EX1:外部中断1(INT1或P3.3)允许位。
ET1:定时器/计数器1溢出中断允许位。
ET0:定时器/计数器0溢出中断允许位。
EX0:外部中断0(INT0或P3.2)允许位。
以上位为0是禁止该类中断,为1时允许该类中断。
X :保留位。
PT2:定时器/计数器2溢出中断优先级设定位。
PS :串行口收、发中断优先级设定位。
PT1:定时器/计数器1溢出中断优先级设定位。
PX1:外部中断1(INT1或P3.3引脚)优先级设定位。
PT0:定时器/计数器2溢出中断优先级设定位。
PX0:外部中断0(INT0或P3.2引脚)优先级设定位。
为0时为低优先级,为1时为高优先级。
4、优先级结构及中断系统时序(1)、优先级IP 可把中断设置为高、低两种优先级遵循:低优先级可以被高优先级中断所 中断,反之不能;中断一旦得到响应,与它同级的中断源不能打断它;当同 时收到多个同级的中断请求时,先执行哪个取决于单片机内部的查询顺序,相当于还存在辅助优先级结构。
外部中断0定时器/计数器0溢出中断外部中断1定时器/计数器1溢出中断串行口定时器/计数器2溢出中断 //从上往下,从高到低5、中断响应6、外部中断源外部中断源:0INT ,1INT触发类型:边沿触发(下降沿)、电平触发(低电平)某中断源申请中断时,会设置中断请求标志,这些标志会在定时器/计数器控制寄存 器TCON 中体现。
三点说明:① 设置为电平触发时,处理器每个指令周期都会查询中断引脚,引脚电平为低是触 发中断。
但是如果输入信号一直为低,那么将一直触发中断。
ARM、单片机C语言编程问题笔记串口通讯—通信协议 (2)一、物理接口标准 (2)二、软件协议 (4)51单片机串口通信的发送与接收(转) (9)Printf 输出格式大全: (17)#if defined和#if !defined(c语言的宏定义) (20)C语言的条件编译#if, #elif, #else, #endif、#ifdef, #ifndef.. 22下面本人在学习ARM及单片机过程中遇到的问题在网上查找的相关资料稍作整理供各位参考学习:串口通讯—通信协议所谓通信协议是指通信双方的一种约定。
约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。
因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。
目前,采用的通信协议有两类:异步协议和同步协议。
同步协议又有面向字符和面向比特以及面向字节计数三种。
其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。
一、物理接口标准1.串行通信接口的基本任务(1)实现数据格式化:因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。
在异步通信方式下,接口自动生成起止式的帧数据格式。
在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。
(2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。
所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。
因此串并转换是串行接口电路的重要任务。
(3)控制数据传输速率:串行通信接口电路应具有对数据传输速率——波特率进行选择和控制的能力。
(4)进行错误检测:在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他校验码。
在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。
关于将char化成串行数据的几种方法Address=(bit)(temp&0x80) ddress与0x80相“与”,之后用bit进行强制转换成位变量。
sbit A=P1^0;; A=num&0x80;//送1位位声明bit特殊位声明sbitDs18b20输入输出数据都是最低有效位在前,八次之后,将该数据保存到一个char型变量中J=tempreader();dat=(j<<7)|(dat>>1);异或运算Exclusive OR the first 8-bit byteofthemessagewiththelow-orderbyteofthe16-bitCRC,puttingtheresultintheCRCregister Exclusive OR(异-或运算)异或(xor)是一个数学运算符。
它应用于逻辑运算。
异或符号为“^”。
其运算法则为:a^b=(a' and b) or (a and b')(a'为非a)。
真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。
就是说两个值不相同,则异或结果为真。
反之,为假。
不同为1,相同为0.异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。
异或略称为XOR、EOR、EX-OR程序中有三种演算子:XOR、xor、^。
使用方法如下z=x^y;z=x xor y;编辑本段运算法则2. a ^ b = b ^ a3. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;4. d = a ^ b ^ c 可以推出a = d ^ b ^ c.5. a ^ b ^ a = b.6.若x是二进制数0101,y是二进制数1011则x^y=1110只有在两个比较的位不同时其结果是1,否则结果为0即“相同为0,不同为1”!输入运算符输入结果1 ^ 0 11 ^ 1 00 ^ 0 00 ^ 1 1编辑本段逻辑异或逻辑的真值表如图1所示,其逻辑符号如图2所示。
1、指定变量的地址:unsigned char tmpData @0x20;//变量tmpData
位于RAM中0x20;
2、bit tmpBit0 @tmpData*8+0;//tmpBit0 位于tmpData第0位
3、bank2 unsigned char *ptr1;//定义覆盖bank 2 和bank3的指针。
//指针变量自身放在bank0中。
4、bank2 unsigned char* bank1 ptr0;//bank2:指针的作用域;bank1:指针变量自身的存放位置。
5、问题:const变量& const 限定的内容
下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案与分析:问题出在p2++上。
1)、const使用的基本形式:const char m; 限定m不可变。
2)、替换1式中的m, const char *pm; 限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。
3)、替换1式char, const newType m; 限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。
6、类型声明中const用来修饰一个常量,有如下两种写法,那么,
请问,下面分别用const限定不可变的内容是什么?
1)、const在前面
const int nValue;//nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const 2)、const在后面,与上面的声明对等
int const nValue;// nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const 答案与分析:
const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:
沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
另外,需要注意:对于const (char *) ; 因为char *是一个整
体,相当于一个类型(如char),因此,这是限定指针是const。
7、const用于函数时出现三个位置:
例如:
const returnVal function (const list_array)const;
第一个const意思是:返回值是常量
第二个const意思是:函数过程中不能修改list_array的值
第三个const意思是:函数过程不能隐式的修改function参数的值8、
9、 data ---> 可寻址片内ram(0-127)
bdata ---> 可位寻址的片内ram
idata ---> 可寻址片内ram,允许访问全部内部ram(0-255) pdata ---> 分页寻址片外ram (MOVX @R0) (256 BYTE/页)
xdata ---> 可寻址片外ram (64k 地址范围FFFFH)
code ---> 程序存储区 (64k 地址范围),对应MOVC @DPTR 10、
11、C51读端口,到底要不要读先写1?
理论上需要先写1然后才能读取。
但是有一种说法,在单片机复位后可以不写1直接读取。
12、如何在某一个地址定义RAM
用_at_命令,这样可以定位灵活任何一点的地址:
Unchar xdata dis_buff[16] _at_ 0x6020;//定位RAM,将dis_buff[16]定
//位在0x6020开始的16个字节。