《中等职业教育机电类专业规划教材:单片机C语言实用教程》[70M]百度网盘|pdf下载|亲测有效
《中等职业教育机电类专业规划教材:单片机C语言实用教程》[70M]百度网盘|pdf下载|亲测有效

中等职业教育机电类专业规划教材:单片机C语言实用教程 pdf下载

出版社 中国人民大学出版社京东自营官方旗舰店
出版年 2013-08
页数 390页
装帧 精装
评分 9.4(豆瓣)
8.99¥ 10.99¥

内容简介

本篇主要提供中等职业教育机电类专业规划教材:单片机C语言实用教程电子书的pdf版本下载,本电子书下载方式为百度网盘方式,点击以上按钮下单完成后即会通过邮件和网页的方式发货,有问题请联系邮箱ebook666@outlook.com

内容简介

  《中等职业教育机电类专业规划教材:单片机C语言实用教程》内容包括51单片机所有的内部硬件知识(I/O口控制、定时器、中断、通信等),以及编写C51单片机程序的C语言基础知识,外围硬件包括LED灯、独立按钮、钮子开关、数码管、继电器、交/直流电动机、大/小液晶、点阵等。

作者简介

  龙建飞,张箭,珠海市理工职业技术学校责任教师,有多年的从教经验,曾主编、参编教材多部。

目录

第一章 单片机简介和软件使用
第二章 单片机基本I/O口的控制
任务一 用单片机控制发光二极管发光
任务二 单片机I/O控制发光二极管发光或熄灭
任务三 单片机I/O控制发光二极管的闪烁
任务四 延时函数在发光二极管闪烁中的运用
任务五 单片机控制发光二极管特效发光或闪烁
任务六 钮子开关的应用
任务七 独立按钮的应用
任务八 单片机控制流水灯的显示
第三章 单片机定时器和中断技术
任务一 51单片机外部中断在发光二极管中的应用
任务二 51单片机定时器在发光二极管中的应用
第四章 单片机控制数码管的显示
任务一 单片机控制数码管的静态显示
任务二 单片机控制数码管的动态显示
任务三 单片机控制数码管显示00~99
任务四 指针控制数码管的显示数据
任务五 4×4键盘控制数码管的显示
第五章 单片机控制系统的制作
第六章 单片机串口通信
任务一 单片机与上位机(计算机)通信
任务二 单片机双机通信
第七章 单片机控制字符的显示
任务一 单片机控制液晶1602的显示
任务二 单片机控制液晶12864的显示
任务三 单片机控制32×16点阵的显示
第八章 单片机多任务模块化编程
任务一 单片机模块化编程控制LED闪烁
任务二 单片机多任务在模块化编程上的应用
参考文献

精彩书摘

第三章单片机定时器和中断技术任务一51单片机外部中断在发光二极管中的应用
一、任务书 用单片机外部中断INT0和INT1控制LED点亮、熄灭、闪烁和花样显示,电路如图3—1所示。图3—1单片机外部中断控制发光二极管电路图二、任务分析如图3—1所示,利用连接在单片机INT0和INT1管脚上的按钮SB3和SB4来控制LED发光、闪烁、流水灯的启动、停止和一些简单的设置,由于采用了中断技术,不会因为长延时而使按钮的响应变得迟缓。三、单片机控制程序(一)利用外部中断INT0(按钮SB3接单片机的INT0引脚 )和外部中断INT1(按钮SB4接单片机的INT1引脚 )控制LED灯的点亮和熄灭1外部中断INT0控制1只发光二极管LED0下载单片机程序,上电后LED1一直以05秒的时间间隔进行闪烁;当按下SB3时,LED0点亮;延时2秒,LED0熄灭,参考程序如下:01 #include 〈reg52h〉//调用52单片机头文件reg52h
02 sbit LED0=P1^0;sbit LED1=P1^1;
03 void delay_1ms(unsigned int x)//延时函数,约1ms
04 {unsigned int i,j;
05for(i=x;i〉0;--i)for(j=114;j〉0;--j);
06 }
07 void main(){
08IT0=1;//设置外部中断INT0触发方式,下降沿触发
09EX0=1;//启动INT0中断
10EA=1;//启动总中断
11while(1){
12LED1=0;//点亮LED1
13delay_1ms(500);//延时05秒
14LED1=1;//熄灭LED1
15delay_1ms(500);
16}
17 }
18 void INT_0(void)interrupt 0//中断子程序
19 {LED0=0;
20delay_1ms(2000);//延时2秒
21LED0=1;
22 } 参考程序分析08~10行:外部中断INT0的设置。① 设置中断控制寄存器TCON中的中断标志位IT0为1,说明连接在单片机INT0硬件上的信号要请求中断,必须是下降沿。② 设置中断允许寄存器IE中的EX0和EA为1,说明启动的是外部中断INT0,并且打开总中断(EA=1)允许开关。12~15行:LED1闪烁程序。18~22行:外部中断INT0的中断处理函数,实现LED0点亮2秒后熄灭功能。中断函数是处理中断事件的专用函数,一般形式如下:void函数名(void)interrupt中断号n[using寄存器组号]
{
语句组;
}(1)函数名是自定义的,但符合标识符的定义规则。(2)中断号n与中断源要相对应(如表3—1所示)。表3—1中断源和中断向量表
中断号n优先级中断源中断入口地址01(最高)外部中断0(INT0 P32)0003H12定时器0000BH23外部中断1(INT1 P33)0013H34定时器10018H45(最低)串行口0023H(3)寄存器组号是可选项,可以由编译软件自动分配。51单片机内部RAM中有4组不同的工作寄存器组,每个寄存器组有8个工作寄存器R0~R7,所以寄存器组号可以取0~3之间常数。如果要设置一个工作寄存器组,则必须保证任何寄存器组在切换时不能发生冲突,否则将产生不正确的结果。建议初学者不要设置此项,让编译器自动分配即可。(4)中断关键字“interrupt”不能写错,其后面不允许跟一个带运算符的表达式,也不允许用于外部函数,如原来的延时函数名“delay”不能取名为“interrupt”。当正确定义了中断程序之后,程序在运行时,若有中断信号的请求,其CPU就会自动进入中断程序执行其代码。编写中断函数需要注意以下几点:(1)函数内的程序尽可能短,否则会影响主程序的执行;(2)中断函数不能有参数和返回值,只能通过全局变量与其他函数进行数据传递;(3)中断函数不需要调用,只有设置好后它就会自动执行。2利用外部中断INT0(按钮SB3接单片机的INT0引脚 )控制一只发光二极管LED0下载单片机程序,上电后LED1一直以05秒的时间间隔进行闪烁;当按下SB3时,LED0点亮;当松开SB3时,LED0熄灭,中断函数参考程序如下,与前面相同部分由读者自行完善:01 void INT_0(void)interrupt0//中断处理函数
02 {
03LED0=0;//点亮LED0
04while(SB3==0);//等待SB3松开
05LED0=1;//熄灭LED0
06 } 参考程序分析01行:中断函数名为“INT_0”,外部中断0的中断号为“0”,按下连接在INT0管脚上的SB3,则单片机自动跳到此处执行。04行:如果按下的SB3没有松开,则单片机一直停在INT0中断函数里不能返回主程序执行,导致主程序中LED1闪烁长时间没有响应。使用外部中断步骤如下:(1)设置触发类型。IT0、IT1置1时下降沿触发外部中断INT0和INT1,清零或单片机复位默认为0则为低电平触发外部中断INT0和INT1。(2)允许中断。EA=1、EX0=1或EX1=1。有时要考虑优先级IP的设置。(3)编写中断函数。INT0中断号n为0,INT1中断号n为2。(二)利用外部中断INT0(按钮SB3接单片机的INT0引脚 )和外部中断INT1(按钮SB4接单片机的INT1引脚 )控制LED灯的闪烁1利用外部中断INT0控制LED0的闪烁单片机上电后LED1一直以05秒的时间间隔进行闪烁;当按下SB3时,LED0闪烁3次后熄灭,时间间隔为1秒。中断函数参考程序如下,与前面相同部分由读者自行完善:01 void INT_0(void)interrupt0{//中断函数
02unsigned char i;//定义局部字符型变量i,取值范围0~255
03for(i=0;i〈6;++i){//LED0闪烁3次
04LED0=!LED0;//LED0状态取反
05delay_1ms(1000);//延时1秒
06}
07 } 参考程序分析03行:由于LED0利用位取反运算符“!”,所以每取反两次才是闪烁1次,故“i〈6”。2利用外部中断INT0控制LED0启动闪烁外部中断INT1控制LED0停止闪烁。单片机上电后LED0熄灭;当按下SB3时,LED0开始闪烁;当按下SB4时,LED0停止闪烁并熄灭。参考程序如下:01 #include 〈reg52h〉//调用52单片机头文件reg52h
02 sbit LED0=P1^0;//定义P10引脚名为LED0,P要大写*/
03 bitQT;//定义启停标志位
04 void delay_1ms(unsigned int x)//延时函数,约1ms
05 {unsigned int i,j;
06for(i=x;i〉0;--i)for(j=114;j〉0;--j);
07 }
08 void main(){
09IT0=1;//设置外部中断INT0触发方式,下降沿触发
10EX0=1;//启动INT0中断
11IT1=1;
12EX1=1;
13EA=1;//启动总中断
14while(1){
15if(QT){
16LED0=!LED0;//LED0取反
17delay_1ms(500);//延时05秒
18}
19}
20 }
21 void INT_0(void)interrupt 0
22 {
23QT=1;//启停标志位置1,启动
24 }
25 void INT_1(void)interrupt 2
26 {
27LED0=1;//LED0熄灭
28QT=0;//启停标志位置0,停止
29 } 参考程序分析03行:定义了一个全局位变量QT,利用QT的置1和置0作为启动和停止的信号,而使QT发出这个信号的是在外部中断函数“INT_0”和“INT_1”中。(三)利用外部中断INT0(按钮SB3接单片机的INT0引脚 )和外部中断INT1(按钮SB4接单片机的INT1引脚 )控制LED灯的花样显示1利用外部中断INT0控制P1口上的8个LED花样显示单片机上电后接在P00口上的LED一直以05秒的时间间隔进行闪烁;当按下SB3时,8个LED从左到右依次点亮3次后熄灭。中断函数参考程序如下,与前面相同部分由读者自行完善:01 #include 〈reg52h〉//调用52单片机头文件reg52h
02 sbit LED0=P0^0;/*定义P00引脚名为LED0,P要大写*/
03 unsigned char code table[ ]={ 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0xb80,0x00 };
//轮流点亮
04 void delay_1ms(unsigned int x)//延时函数,约1ms
05 {unsigned int i,j;
06for(i=x;i〉0;--i)for(j=114;j〉0;--j);
07 }
08 void main(){
09IT0=1;//设置外部中断INT0触发方式,下降沿触发
10EX0=1;//启动INT0中断
11EA=1;//启动总中断
12 while(1){
13LED0=!LED0;//点亮LED0
14delay_1ms(500);//延时05秒
15}
16 }
17 void INT_0(void)interrupt0{
18 unsigned char k;//定义数组下标循环变量
19 for(k=0;k〈8;++k){//8是数组里数据的个数
20P1=table[k];//数组名为table,下标为变量k
21delay_1ms(1000);//延时1秒
22 }
23 P1=0xff;//8个LED全部熄灭
24 } 参考程序分析当按下SB3后,单片机进入中断函数开始执行流水灯程序,使得主函数中闪烁的LED0很久不能进行执行,保持在中断前一刻的状态,直到处理完中断函数后LED0就又开始闪烁。2利用外部中断INT0控制P1口上的8个LED花样显示的启动外部中断INT1按钮SB4接单片机的INT1引脚 )控制P1口上的8个LED花样显示的停止。单片机上电后8个LED熄灭;当按下SB3时,LED开始由中间向两边依次点亮(间隔时间为1秒),不断循环;当按下SB4时,LED停止显示并熄灭。参考程序如下:01 #include 〈reg52h〉//调用52单片机头文件reg52h
02 sbit LED0=P0^0;//定义P00引脚名为LED0,P要大写*/
03 bitQT;//启动、停止标志位
04 unsigned char code table[ ]={ 0xe7,0xc3,0x81,0x00,0xff };
//轮流点亮
05 void delay_1ms(unsigned int x){//延时函数,约1ms
06unsigned int i,j;
07for(i=x;i〉0;--i)
08for(j=114;j〉0;--j);
09 }
10 void main(){
11unsigned char k;//定义数组下标循环变量
12IT0=1;//设置外部中断INT0触发方式,下降沿触发
13EX0=1;//启动INT0中断
14IT1=1;
15EX1=1;
16EA=1;//启动总中断
17while(1){
18if(QT) {
19P1=table[k];//数组名为table,下标为变量k
20delay(1000);//延时1秒
21if(++k〉=5)k=0;
22}
23else{
24P1=0xff;//LED熄灭
25k=0;
26}
27}
28 }
29 void INT_0(void)interrupt 0{
30QT=1;//启停标志位置1,启动
31 }
32 void INT_1(void)interrupt2{
33P1=0xff;//LED熄灭
34QT=0;//启停标志位置0,停止
35 }四、应知应会知识链接(一)中断的概念中断就是主程序执行过程中,产生了另外一个紧急任务,需要打断(暂停)主程序的执行,转向执行紧急任务(中断函数)。紧急任务完成后,再返回主程序原来被打断的地方继续执行接下来的主程序。举一个例子,当你正在看书(执行主程序)→电话突然响起来(产生中断信号1)→你在书上做记号,然后去拿起电话和对方进行通话(处理中断1)→突然门铃响了(产生中断信号2)→你让与你通话的对方稍等一下→你去开门并与来访者交谈片刻(处理中断2)→交谈结束,关好门→回到电话旁拿起电话继续通话(中断返回1)→通话结束挂上电话→拿起书,从作记号处继续看书(中断返回2)。上述例子是一个中断嵌套,就是在中断中又发生了一次中断(开门交谈)。在这三个任务(看书、打电话、接待来访者)中,一个人不可能同时完成这三项任务,只能采用中断技术做完一件后再去做另一件。并且上述的中断都是随机的,不知道电话什么时候响起,也不知道客人什么时候来访,在单片机中也是一样的,突发或随机的不确定事件,不可能在主程序中编写程序,因为执行处理程序时,可能事件并没有发生;或者事件发生的时候,可能处理程序还没有执行到,就会错过时机。所以,中断程序就是很好地解决这种“随机”事件处理的问题。通过中断,单片机能够多任务处理,提高了单片机的“应变”能力。(二)中断控制的特殊功能寄存器:TCON、SCON、IP、IE在AT89S52单片机中,有4个寄存器是供用户对中断进行控制的,这4个寄存器分别是定时器控制寄存器TCON,串行口控制寄存器SCON,中断允许控制寄存器IE,以及中断优先控制寄存器IP。1定时器控制寄存器TCON(见表3—2)表3—2
位地址8F H 8E H 8D H 8C H 8B H 8A H 89 H 88 H 位名称TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 (1)TF0(TF1)内部定时器/计数器0(定时器/计数器1)溢出中断标志位如下:当片内定时器/计数器0(定时器/计数器1)计数溢出的时候,由单片机自动置1,而当进入了中断服务程序之后再由单片机自动清零。(2)TR0(TR1)内部定时器/计数器0(定时器/计数器1)运行控制位如下:TR0(TR1)=1,启动运行定时器T0(T1)。TR0(TR1)=0,停止运行定时器T0(T1)。(3)IE0(IE1)外部中断请求标志位如下:当INT0(或INT1)引脚出现有效的请求信号,此位由单片机自动置1,而当进入了中断服务程序之后再由单片机自动清零。(4)IT0(IT1)外部中断触发方式控制位如下:IT0(IT1)=1,脉冲触发方式,下降沿触发有效。IT0(IT1)=0,电平触发方式,低电平有效。2串行口控制寄存器SCON(见表3—3)表3—3
位地址 9F H 9E H 9D H 9C H 9B H 9A H 99 H 98 H 位名称 SM0 SM1 SM2 REN TB8 RB8 TI RI (1)TI 串行口发送中断标志位如下:当单片机串行口发送完一帧数据后,此位由单片机自动置1,而当进入了中断服务程 序之后是不会自动清零的,必须由用户在中断服务程序中用软件清零。(2)RI串行口接收中断标志位如下:当单片机串行口接收完一帧数据后,此位由单片机自动置1,而当进入了中断服务程序之后是不会自动清零的,必须由用户在中断服务程序中用软件清零。3中断允许控制寄存器IE(见表3—4)表3—4
位地址AF H AE H AD H AC H AB H AA H A9 H A8 H 位名称EA ES ET1 EX1 ET0 EX0 (1)EA中断允许总控制位如下:EA=0,关闭总中断。EA=1,启动总中断,当启动了总中断后,再由各中断源的中断允许控制位进行设置。(2)ES串行中断允许控制位如下:ES=0,关闭串行中断。ES=1,启动串行中断。(3)(30EX0(EX1)外部中断允许控制位如下:EX0(EX1)=0,关闭外部中断0(外部中断1)。(4)EX0(EX1)=1,启动外部中断0(外部中断1)。ET0(ET1)定时中断允许控制位如下:ET0(ET1)=0,关闭定时中断0(定时中断1)。ET0(ET1)=1,启动定时中断0(定时中断1)。4中断优先级控制寄存器IP(见表3—5)表3—5
位地址BF H BE H BD H BC H BB H BA H B9 H B8 H 位名称PS PT1 PX1 PT0 PX0 (1)PX0(PX1)外部中断0(外部中断1)优先级设定位如下:PX0(PX1)=1,外部中断0(外部中断1)定义为最高优先级中断。PX0(PX1)=0,外部中断0(外部中断1)定义为最低优先级中断。(2)PT0(PT1)定时中断0(定时中断1)优先级设定位如下:PT0(PT1)=1,定时中断0(定时中断1)定义为最高优先级中断。PT0(PT1)=0,定时中断0(定时中断1)定义为最低优先级中断。(3)PS 串行通信优先级设定位如下:PS=1,串行通信定义为最高优先级中断。PS=0,串行通信定义为最低优先级中断。如果在同时收到几个同一优先级的中断请求时,哪一个中断请求优先得到响应,取决于内部的查询顺序,其查询顺序为:外部中断0定时器0中断外部中断1定时器中断1串行中断。优先级的作用如下:① 当一个中断函数正在执行时,能被比它级别高的中断所中断。图3—2外部中断响应示意图② 当一个中断函数正在执行时,不能立即响应同级或低级的中断请求。③ 同级中断同时产生中断请求时,先响应中断号小的中断。④ 当一个中断函数正在执行时,产生的同级或低级的中断请求,如果前一个中断函数执行完成时,同级或低级的中断请求信号不存在了(标志位被清零),则中断不会发生。(三)中断响应如图3—2所示,正常情况下单片机执行主程序,但是如果有中断事件的发生,它就会把当前的事件保存起来,去执行中断程序,当执行完中断程序之后,再回来原来主程序的程序段中开始执行。图3—2为中断响应的流程。在允许中断时,一旦出现中断信号,就会进入中断执行中断程序。不同的中断源,执行中断程序的方法不同,但流程是相似的。(1)保护现场。指保护主程序当前的数据。对于C语言编程,保护现场是自动的。(2)执行中断程序。根据中断号来选择执行专门的中断函数,完成中断事件的处理。(3)中断返回。中断程序执行完时,需要恢复主程序的现场,以便主程序能接着刚才被中断的地方继续执行下去。对于C语言编程,恢复现场是自动的。