单片机i的运用a[i].type=0; 是什么意思

点阵显示都是使用动态显示的方法。

轮流让每一行(或列)发光一小段时间

下面两句即是完成这个功能:

(1<<i)就是每次把 1 左移 i 位,即在八位数中有一个1。

取反后就是茬八位数中,有一个0

输出到P2,即可使每一行(或列)发光

delay();,代表本行的发光时间

你对这个回答的评价是?

P2=~(1<<i);的作用就是实现流水灯的效果P2口的8位,高电平的LED不亮低电平的LED接通

你对这个回答的评价是?

把1右移i次取反送到p2

兄弟应该是左移i位吧,我是问它在这个程序中囿什么作用。那个是不是扫描该列的意思啊说的明白一点行吗。

你对这个回答的评价是

最近做比赛需要写程序做一个智能小车。C语言的基础和编程的能力我是有的但是我对单片机i的运用等硬件不是很了解,特意进行了一番学习估计以后也用不了多少,特此写一篇笔记方便后人参考学习。

我不喜欢翻着教材或视频一节一节地学习我的学习方式是问题启发式学习:直接切入正题,遇箌不会的问题就找度娘学会之后再次进入正题,遇到问题再查阅资料循环往复,直到走通为止~整个学习下来虽然可能会有些漏洞,泹是已经基本进入状态了

由于我是业余的,所以难免会有错解或不妥之处还请读者能以挑剔的眼光为我指出。

Q1:sbit与sfr代表是什么有什麼作用?

A1:sfr用来声明特殊功能的寄存器sbit用来声明特殊功能位。

位取值范围为0 ~ 255 = 2^8-1。对于I/O端口来说刚好每一位对应一个引脚),例如 sfr P0  = 0x80; 这一呴定义了P0端口与地址0x90对应特殊功能的寄存器一般在开发工具(Keil)中自带的头文件,例如reg52.H中声明好了只需要在程序中引入该头文件就好叻;

w   需要注意的一点是,例如P0对应的是一个”8“字型的数码管若要显示3,则可对P0口赋值:P0 = 0x0D若要将其熄灭,只需对其赋值:P0=0xFF进制的数進制,后两位刚好FF代表十进制的255)。

w   sfr16也是用来声明特殊功能寄存器所不同的是它用于操作占两个字节(取值范围为0~65535)的寄存器,比如定時器T0和T1

sbit只占用一个位,和两个值一般用来给引脚取别名,例如sbit P1_0 = P0^1; 就是定义用符号P1_0来表示P1.0引脚 需要注意的是,一单用了sbit定义某个变量這个变量的地址就是确定的了(不能修改了);

w   对于引脚来说,这个0和1是有物理意义的:0代表低电平1代表高电平。而机器是不懂代码只能识别高低电平(脑补:这样我们就打通了从代码/软件通往硬件的大路~) 高电平就是5伏正电压,低电平就是0伏这个是理想值,实际上咜也有一个范围......(参考自)

A2:长整型数字在数字的后面加字母L如104L,034L等总结如下:

w   浮点型:分为十进制形式和指数形式两种,统一格式為 [±](数)(.数){e[±]数}其中[ ]为可选项,( )表示二者必有其一{ }十进制不填,指数必填例如:3.14,-.1+2;.3e-3,12e+36.66e13

w   字符型:用单引号括住括住,例如'a''c'等。對于特殊字符例如换行符、反斜杠等请参考C语言等教材。

Q3:我粘贴了别人的代码怎么发现没有unit这个类型?

A3:别人的代码只给了函数部汾没有给头文件中的预处理命令。可以在自己的头文件中加入:#typedef unsigned int uint; (后面要加分号)这样就可以用uint类型来代表unsigned int类型了。

Q4:为什么好多变量都是char类型它不是字符类型吗?怎么可以用来计数

A4:int在8位的51单片机i的运用是占用2个字节,char在占用1个字节所以说char类型占用空间更小。單片机i的运用的存储器很小尽量不要浪费空间,能用小的就用小的,且一般都用无符号的

至于它为什么可以计数,因为字符本来就是用②进制表示的所以当你对char类型的变量赋值时(例如 char a = 'A'),它(a)底层仍然是二进制将二进制转化为十进制,当然可以用来计数

表:Keil uVision4面姠51单片机i的运用的基本数据类型各种属性一览表

A5:定义一个变量的格式为:[存储种类]  数据类型  [存储器类型]  变量名表

在定义格式中除了触及類型和变量名表是必要的,其他都是可选项存储种类有四种:

存储器类型的说明是指定该变量在C51硬件系统中所使用的存储区域,并在编譯是准确定位如果省略存储器类型,系统则会按编译模式SMALLCOMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。89C51中的存储器类型有:

w   data :鈳直接寻址的内部数据存储区(128B)访问速度最快;

w   idata:间接寻址的内部数据存储区(256B),允许访问全部内存地址;

w   bdata:可位寻址内部数据存儲区(16B)允许位与字节混合访问;

——《51单片机i的运用C语言入门教程》,磁动力工作室第六课 变量

一般需要严格控制变量读取速度的時候用data。例如变量更新速度很快或者需要很短时间内读取或者修改的变量。一般容量要求大的但速度并没有太大要求的,放在xdata里面

洳果所有变量都不加这些关键字的话,编译器会自动分配但编译器的分配方案并不一定是最好的。而且一般都不会非常合理

注:关于“中断”的详细学习放在 第二节:51单片机i的运用相关

A5:关键字interrupt表示这是一个中断函数,具体的书写格式为:

首先需要注意的是中断函数没囿参数传递其无返回值n表示中断源,m为单片机i的运用工作寄存器编号[using m]为非必须内容。在设计中断时尽量让中断函数做少量的工作,這样中断服务时间短系统可以及时的响应其他中断。有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果这时有充足的时間等待中断是十分重要的。

个中断源个优先级,可以实现二级中断嵌套(中断服务进行中再进行一次优先级更高的中断)

所以n的取值為0,1,2,3,4共5个,对应了5种中断源这5种中断源可以分为三种类型:外部中断,定时器中断串口中断。

m的取值有0,1,2,3共4个它涉及到中断的优先权,洳果用不到二级中断using m可以不加,系统会为你自动分配如果加可能会导致不必要的冲突。

Q7:如何写一个1ms延迟的函数

A6:在写函数之前首先要认识到,假如采用for循环则循环一次所花费的时间是多少?这就涉及到单片机i的运用深层的概念:机器周期而单片机i的运用的机器周期并不是最小的周期,在计算它之前还要了解一下其他几个周期的定义:

w   晶振频率OSC:单片机i的运用的最小系统中有一个晶振它能够使嘚CPU跑起来,这个晶振为单片机i的运用的CPU提供主频这个晶振的频率就称为晶振频率外加频率)。

w   时钟周期Tc:又称为“震荡周期”它等於晶振频率的导数。这是最基础的周期

w   机器周期Tm:1机器周期 = 12个震荡周期;单片机i的运用复位至少需要两个机器周期的高电平。

w   指令周期Ti:执行一条指令所需的机器周期数1指令周期 = 1、2、4个机器周期;

?   一条空语句(循环体内)1个机器周期。

假如采用for循环例如for(j=X;j>0;j--){ }; 这行代码有X個循环,每次循环有一条判断语句(j>04Tm),一条空语句({ }1Tm),一条自减语句(j--1Tm),略去第一个循环的赋值语句(j=X2Tm),共6X个机器周期略去最后一次的判断语句(j=0时,4Tm)若要延迟一秒,只需令6X*Tm = 1当采用12MHz的晶振时,X ≈ 167被略去的语句达6Tm,刚好等于一次循环所耗费的时间所以对X进行X=X-1的修正,最终可得:X ≈ 166

这里讲的是j为char类型的变量,它最大只能取到255所以要获得更大的延时,需要用到int类型前面也学到int類型是16位的,而单片机i的运用是8位的所以这会更加复杂。

下面给的两个延时函数这里多说一句:我查阅网络资料发现延时1ms的程序不尽楿同,甚至相差很大如果你需要非常准确的延时,推荐你参考正规的教材或采用其他方法比如计时系统

两种晶振的单片机i的运用,延時1ms的函数

这种方法也有很大的缺点:延迟过程中CPU被占用,无法进行其他任务导致系统效率降低。延迟时间越长该缺点便越明显,因此软件延时只适用于短暂延时或简单项目。

A6:从上面的学习可知TH0与TL0是与定时器/计数器有关的SFR寄存器这两句的含义是给定时/计数器赋初徝,寄存器会按固定的时间间隔累加当寄存器的值达到最大时会触发中断,这时可以利用中断函数进行一系列操作而计时T就等于时间間隔*(最大值 – 初值)。大概就是这个意思

Q1:单片机i的运用的引脚电压是多少?它的电压是由谁控制的

A1:单片机i的运用的引脚有两种電平:高电平与低电平。高电平的电压与单片机i的运用的工作电压有关一般有5V和3.3V两种。低电平一般为0V

P0,P1,P2,P3又称为并行I/O端口,还是低电平0;玳表红外光被反射并被接收管接收高电平1代表红外光被外界(黑线等)吸收。

P1称为端口P1.1称为P1端口的引脚,这两个概念之间的关系就是“整体”与“个体”的关系

Q2:P3口的8个引脚有哪些复用功能(第二功能),默认开启吗

当复用功能没有开启时,P3可以做为普通I/O口使用┅般情况下,复位后第二功能都是关闭的需要设置对应寄存器才能打开。

问题解决1:程序通过USB口无法烧入单片机i的运用

我的单片机i的运鼡插座要用一个USB转TTL设备才能从电脑上给单片机i的运用烧程序当时我就在P3.0和P3.1上连了其他模块,结果每次下载都失败后来我才明白TTL插口是囷单片机i的运用上的RXD,TXD连着的,下载时是开启了它们的复用功能的

Q3:我的程序编译后生成的HEX文件超过了8k,烧进单片机i的运用不会有问题吗

A3:HEX文件不只包含了实际的操作指令,还包含了地址代码这个文件是为了易于下载器的理解。真正下载到单片机i的运用上的并不是HEX文件参考下面的链接,给单片机i的运用烧入160+K的HEX文件仍然没有问题

这是因为你所使用的Keil没有经过注册,需要注册一下就可以生成超过8K的文件叻至于如何注册这里就不多说了。

注意:如果真的是代码量超过所选单片机i的运用的容量(STC89C52RC的容量为8K)那么编译器在生产HEX文件时会提礻 xxx code limit 之类的。

Q4:为了写中断程序我需要详细了解一下中断系统。

A3:CPU在处理某一事件A时事件B请求CPU迅速去处理,CPU暂时中断当前工作A转去处悝事件B,待CPU将事件B处理完后再返回继续处理A事件这一过程称为中断。在这之中有几个专业名词需要解释一下:

中断源:引起CPU中断的根源断源能够向CPU提出中断请求;

中断系统的结构如下图所示。

第一列解释:INT0:外部中断0INT1:外部中断1,T0定时器中断0T1定时器中断0,RX、TX:串口Φ断(包装在一起的)中断引起原因如下:

串行通信完成一帧数据发送或接受引起中断。

第二列TCON解释:该列的第二列代表了五种中断源嘚中断标志所谓中断标志就是“中断请求的标志”,CPU要进行中断服务首先要判断中断请求标志,再判断中断使能标志是否Enable最后才会響应这个中断。——

对于外部中断当中断到来时(引脚的电平发生变化),硬件会自动将中断标志置为;而对于计时器中断中断标志嘚值是可以认为修改,所以可以利用这一点进行人为中断(通过软件/程序)可以达到计数、时钟累加、自检、扫描等目的。

外部中断需偠外部条件触发计时器中断不用。

需要注意的是无论是机器中断还是人为中断,在中断服务完成后机器并不一定会清除该中断标志位(不同的MCU情况不同)所以为安全起见,我们一般利用程序清除

外部中断的中断标志前(第一列)各有两个开关,对应了外部中断的两種触发方式:触发;当过渡到低电平的过程)这两种触发方式有不同的效果,低电平可以持续一段时间而电平下降却是一瞬间的事,所以两种触发方法在延时效果上不同

第三列IE解释个开关全部闭合),第一列的5个开关:EX0、ET0、EX1、ET1、ES分别对应了第一列的5个中断源

若这5個中断源被设置为同等优先级,则按自然优先级排序依次执行中断服务如下表所

89C51单片机i的运用的中断优先级有三条原则:

1、CPU同时受到几個中断时,首先响应优先级别最高的中断请求

2、正在进行的中断服务不能被新的同级或低级的中断请求所打断。

3、正在进行的低级中断垺务能被高级的中断请求所打断

、中断源有中断请求;、此中断的中断允许;CPU开总中断(EA=1)。

程序示例1:蜂鸣器滴两次、进入中断服务——數码管显示8延迟1秒后熄灭。

// 蜂鸣器发出滴滴声

// 中断函数一般放在main函数的下面

Q5:为了理解某段程序的作用我需要详细了解一下计时/计数系统。

A5:单片机i的运用中有多个小闹钟(T0T1;52单片机i的运用还有一个T2小闹钟),可以用来计数、定时等它们的结构图如下

定时/计数器0,T0它的触发引脚为P3.4,计数器为8位寄存器TL0和TH0用于存放数值,TL0是低八位TH0是高八位。当低八位计数满了之后会向高八位进一位对于T1同理。

配置寄存器TCON:控制寄存器控制T0、T1的启动和停止及设置溢出标志,与之相关的sbit由TF1、TR1、TF0、TR0;单片机i的运用才有

TF0、TF1是溢出中断请求标志为,詳细参考“本节 Q4:为了写中断程序我需要详细了解一下中断系统。”

TR0、TR1是运行控制位TRX=1时,TX开始工作;TRX=0时TX停止工作。TRX由软件置1或清0所以可以用软件控制定时/计数器的启动与停止。

配置寄存器TMOD:定时/计数器的工作方式寄存器用来确定工作方式(M0和M1)和功能(GATE和C/T)

C/T:定時器或计数器功能的选择位。计数器的计时间隔为1个机器周期(计数频率为晶振频率的1/12)所以定时时间T = 计数值N * 机器周期Tm

GATE:门控位当GATE=0時,只要用软件使TCON中的TR0或TR1为1就可以启动定时/计数器工作;当GATE=1时,要用软件是TR0或TR1为1同时外部中断引脚为高电平时,才能启动定时/计数器笁作我们一般让GATE=0

T0、T1定时/计数器可以在四种方式下工作由M0和M1的取值来确定。

方式1以T0为例:的实质是的由计数脉冲触发的按递增规律(即累加方式)工作的循环位的,由高八位的TH0与第八位的TL0组成从预先设定的初始值开始,每来一个计数脉冲(时间间隔固定)就加计数器1当TL0溢出后,对TH0进位当TH0溢出后,TF0会被硬件置1从而发出中断请求。

溢出:当计数器的每一位都是1时对计数器再加1就会溢出,结果就昰计数器的每一位都回0

当TF0=1时,cpu可以不做响应学习了后面的中断系统后就会知道,cpu对中断做出响应需要两个判断条件另外一个就是开啟中断使能标志:EA=1;ET0=1;

Q6:如何用定时/计数器进行1ms的延迟?

A5:定时器的操作步骤(下面的X代表0或1):

选择定时器还是计数器模式(设置C/T)一般采用定时器模式即C/T=0;;

给定时/计数器赋初值(设置THX和TLX),注意结合一下两个公式:

如果频率的单位是MHz(兆赫兹)则时间的单位为us(微秒)

計算出初值进制,个数个数。或者将其转化为进制它除以的商为THX,余数为TLX

程序示例2:定时器的配置

程序示例3:蜂鸣器持续滴滴,利鼡定时器完成Nms的延时进入中断服务——数码管显示8,延迟1秒后熄灭

延迟1ms的计数N的精确值为921.6,这里舍入为921

以计数的方式一次性最多可鉯延迟70ms

// 中断函数一般放在main函数的下面

从程序示例1与程序示例3的对比可以得出以下结论:

利用定时器中断有两种方法,一种方法只需将定时器0的中断标志置1(TF0 = 1;即程序示例1)另一种方法需要开启定时器0(TR0 = 1;即程序示例3)

利用定时器进行延时,这个计时进程与main进程是并行的

无论采用定时器延时中断还是手动中断,中断服务与mian进程总是串行的

改程序的测试结果表明:有时候,当数码管显示8时蜂鸣器是静音的;洏有时候,当数码管显示8时蜂鸣器在一直鸣响。这说明两点:

定时器中断可以中断函数类型的延迟

单片机i的运用在服务中断的时候,既定的事实不会发生变化也就是说若中断发生在蜂鸣器响的中间时刻,则蜂鸣器会一直响下去直到中断服务返回。

Q7:单片机i的运用的囿好多特殊寄存器我需要总结一下他们的名称及用途

A6:关于8051单片机i的运用特殊功能寄存器的说明,可以查阅:

为防止链接失效这里给絀文件名:《8051,STC89C52单片机i的运用特殊功能寄存器》

下面给出第一页的预览图:

我要回帖

更多关于 单片机i的运用 的文章

 

随机推荐