《单片机控制技术项目式课程》(第2版)课件 王璇 项目7-11 模拟电子闹钟的设计- STC高性能51单片机的应用设计_第1页
《单片机控制技术项目式课程》(第2版)课件 王璇 项目7-11 模拟电子闹钟的设计- STC高性能51单片机的应用设计_第2页
《单片机控制技术项目式课程》(第2版)课件 王璇 项目7-11 模拟电子闹钟的设计- STC高性能51单片机的应用设计_第3页
《单片机控制技术项目式课程》(第2版)课件 王璇 项目7-11 模拟电子闹钟的设计- STC高性能51单片机的应用设计_第4页
《单片机控制技术项目式课程》(第2版)课件 王璇 项目7-11 模拟电子闹钟的设计- STC高性能51单片机的应用设计_第5页
已阅读5页,还剩361页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目7

模拟电子闹钟的设计了解常用键盘的分类。了解行业标准中电子元器件的规范。掌握键盘的工作原理。掌握矩阵键盘的识别和控制方法。掌握电子秒表的设计方法。掌握模拟电子闹钟的硬件设计和软件设计方法。能独立分析和解决硬件设计和软件设计中的问题。掌握完成工作项目的完整步骤和具体实施方法。能利用团队的力量完成任务,培养团队合作精神。学习目标

叙述键盘的类别和工作原理;叙述矩阵键盘的识别方法;设计秒表的硬件电路和控制程序;设计模拟闹钟的硬件电路和控制程序。工作任务

任务7.1键盘的应用项目7模拟电子闹钟的设计任务7.2电子秒表的设计项目拓展STC89C52实验板简易电子琴的设计

项目小结任务7.3模拟电子闹钟的设计

键盘概述是一种常见的输入设备,根据按键的识别方法分类,键盘有编码键盘和非编码键盘两种。根据键盘的结构分类,键盘可分为独立式按键键盘和行列式按键键盘。

任务7.1键盘的应用

(a)四脚直插式按键(b)四脚贴片式按键(c)两脚贴片式按键(d)自锁按键单片机与键盘的接口及其软件的任务主要包括以下几个方面:(1)检测并判断是否有键按下;(2)按键开关的延时去抖动功能;(3)计算并确定按键的键值;(4)程序根据计算出的键值进行一系列的动作处理和执行

7.1.1独立键盘控制LED点亮7.1.1.1独立键盘的工作原理独立式按键键盘的每个按键都单独接到单片机的一个I/O口上,通过判断按键端口的电位即可识别按键操作。例如:K1键的一端接地,另一端接P1.0,当K1键按下,P1.0端口就会检测到低电平“0”信号,否则检测到的应该是高电平“1”信号。所以一旦查询到P1.0口为“0”就说明K1键按下了,也就是识别了按键。

在按键被按下或释放时按键会出现抖动现象,这种现象会干扰按键的识别。因此需要对按键进行消抖动处理,也称为去抖动。按键去抖动一般有硬件和软件两种方法。硬件去抖通常采用R-S触发器或单稳电路构成去抖电路。每一个按键都要连接一个硬件去抖动的电路,所以当电路中按键较多时电路就显得十分复杂。硬件去抖判断按键被按下后,加一个10ms的延时程序,待按键稳定后,再次检测按键,按键仍处于被按下状态,就可以确认确实有按键被按下。软件去抖

7.1.1.2独立键盘控制LED点亮的设计方法应用实例1:要求K1或K2按下时D1或D2点亮,松开时对应LED熄灭;K3或K4按下并释放时D3或D4点亮,再次按下并释放时对应LED熄灭。操作实例源程序编写如下://宏定义#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//端口位定义sbitD1=P0^0;sbitD2=P0^1;sbitD3=P0^2;sbitD4=P0^3;sbitK1=P1^0;sbitK2=P1^1;sbitK3=P1^2;sbitK4=P1^3;//延时1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//按键控制LED灯主程序voidmain(){P1=0xFF;//让P1口处于高电平状态

P0=0xFF;//让P0口处于高电平状态

while(1){D1=K1;//将K1按下后P1.0的值直接送给P0.0去点亮D1D2=K2;//将K2按下后P1.1的值直接送给P0.1去点亮D2if(K3==0)//判断K3是否按下

{while(K3==0);//等待K3释放

D3=~D3;}if(K4==0)//判断K4是否按下

{while(K4==0);//等待K4被释放

D4=~D4;}DelayMS(10);}}

7.1.1.2独立键盘控制LED的点亮应用实例2:P1.0~P1.3连接了4个独立按键,P0.0~P0.7连接8个LED灯。要求按下K1键逐个点亮D1~D8,按下K2键点亮D1~D4,按下K3键点亮D5~D8,按下K4键熄灭D1~D8。源程序编写如下://宏定义#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//延时1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//按键控制LED灯主程序voidmain(){uchark,t,Key_State;P1=0xFF;

P0=0xFF;while(1){t=P1;//将键值保存起来if(t!=0xFF)//判断有键按下{DelayMS(10);//再次检查按键是否按下,去抖动if(t!=P1)continue;//如果按键没有按下,下一次循环Key_State=~t;//取得4位按键值,由1111xxxx变为0000xxxxk=0;//获取按键号kwhile(Key_State!=0){k++;Key_State>>=1;}switch(k){case1:if(P0==0x00)P0=0xFF;P0<<=1;//逐个点亮D1~D8DelayMS(200);break;case2:P0=0xF0;break;//点亮D1~D4case3:P0=0x0F;break;//点亮D5~D8case4:P0=0xFF;//熄灭D1~D8}}}}7.1.2矩阵键盘控制数码管显示7.1.2.1矩阵键盘的工作原理矩阵键盘由行线和列线组成,按键位于行、列的交叉点上。如图所示,1个4×4的行、列结构可以构成1个含有16个按键的键盘。在按键数量较多的场合,矩阵键盘与独立键盘相比要节省很多I/O口线。7.1.2矩阵键盘控制数码管显示7.1.2.1矩阵键盘的工作原理矩阵键盘的按键识别方法:扫描法和线反转法扫描法第一步:识别键盘是否有键闭合第二步:识别具体闭合的按键扫描法线反转法第一步:将行线编程为输入线,列线编程为输出线,并使输出线输出为全零电平,则行线中电平由高到低所在行为按键所在行。第二步:将行线编程为输出线,列线编程为输入线,并使输出线为全零电平,则列线中电平由高到低所在列为按键所在列。综合一二步的结果可确定按键所在行和列,从而识别出所按的键。矩阵按键键盘常用的有2种编码方式:(1)对于矩阵式键盘,按键的位置由行号和列号确定,分别对行号和列号进行二进制编码,然后将两值合成1个字节,高4位表示行号,低4位表示列号。如12H表示第1行第2列的按键。(2)采用依次排列键号的方式对按键进行编码。以4×4键盘为例,可以将键号编码为:0x00、0x01、0x02、…、0x0D、0x0E、0x0F共16个。对键盘的控制方式主要有:定时扫描中断扫描定时扫描就是每隔一定的时间读取一次键盘I/O口状态。中断方式下,当有键按下时,就会有一根行线被拉为低电平,经过与门之后就会触发一次外中断,这种方式避免了对键盘的空扫描,可以提高CPU的效率。任务操作1.任务要求设计一个电路,AT89C51单片机的P1口连接一个4×4矩阵键盘,其中P1.0~P1.3为行线,P1.4~P1.7为列线,P0端口连接一只共阴极的一位数码管,要求按下一只按键时在数码管上显示器对应的键号,如按下K1则显示“1”,按下K2则显示“2”……,按下KF则显示“F”。

7.1.2.2矩阵键盘控制数码管显示的设计方法2.任务分析键号2进制键值取反的2进制键值取反的16进制键值K011101110000100010x11K111101101000100100x12K211101011000101000x14K311100111000110000x18K411011110001000010x21K511011101001000100x22K611011011001001000x24K711010111001010000x28K810111110010000010x41K910111101010000100x42KA10111011010001000x44KB10110111010010000x48KC01111110100000010x81KD01111101100000100x82KE01111011100001000x84KF01110111100010000x88矩阵键盘按键特征码值表3.任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻11kΩX8排阻1轻触按键16一位共阴极数码管1矩阵键盘设计器件列表(2)硬件原理图设计(3)软件程序设计

源程序编写如下://宏定义#include<reg51.h>#include<intrins.h>#defineucharunsignedchar//0~F的数码管共阴极段码表ucharcodeDSY_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//矩阵键盘按键特征码表ucharcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,

0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延时子函数voidDelay(){uchari;for(i=0;i<200;i++);}//矩阵键盘扫描子函数ucharKeys_Scan()

{ucharsCode,kCode,i,k;

P1=0xF0;//低4位置0,放入四行

if((P1&0xF0)!=0xF0){Delay();if((P1&0xF0)!=0xF0){sCode=0xFE;//行扫描码初值

for(k=0;k<4;k++)//对4行分别扫描

{P1=sCode;if((P1&0xF0)!=0xF0){kCode=~P1;for(i=0;i<16;i++)//查表得到按键序号并返回

if(kCode==KeyCodeTable[i])returni;}elsesCode=_crol_(sCode,1);}}}return-1;}//主函数voidmain()

{ucharKeyNo=-1;//按键序号,-1表示无按键

while(1){KeyNo=Keys_Scan();//扫描键盘获取按键序号KeyNoif(KeyNo!=-1)P0=DSY_CODE[KeyNo];//数码管显示按键序号}}任务7.2电子秒表的设计1.任务要求设计一只电子秒表,从0秒计到59秒,并用两只一位的共阴极数码管实时显示当前的秒数,按键控制秒表的启动和清零。2.任务分析

采用T0的定时工作方式1,则TMOD=0x01,由于晶体振荡频率为12MHz,机器周期就为1us,设置定时时间为50000us(50ms),反复计数20次就为1s。把计数的实时数值用两只一位的共阴极数码管显示,采用静态的显示方式,计数值的十位和个位分别显示在不同的数码管上即可。在任意的两根口线上分别连接一只轻触按键,分别控制秒表的启动和数码管清零。3.任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻11kΩX8排阻1轻触按键1一位共阴极数码管2电子秒表设计器件列表(2)硬件原理图设计(3)软件程序设计

源程序编写如下://宏定义#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P3^2;sbitK2=P3^3;//0~9的数码管共阴极段码表ucharcodeDSY_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//延时1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//定时1s子程序voidsTime(){uinti;TMOD=0x01;//设定时器1为方式0TH0=(65536-50000)/256;//置定时器初值

TL0=(65536-50000)%256;TR0=1;//启动T1for(i=0;i<=20;){if(TF0==1)//查询计数溢出

{i++;TF0=0;TH0=(65536-50000)/256;//重新置定时器初值

TL0=(65536-50000)%256;}}return;}//秒表主程序voidmain(){uchars;P0=DSY_CODE[0];

P2=DSY_CODE[0];

K1=1;

K2=1;

while(1)

{if(K1==0)//K1键按下

{DelayMS(10);//按键去抖动

if(K1==0)//再次检查按键

{for(s=1;s<=60;s++)//从0到59显示秒数

{P0=DSY_CODE[s/10];//显示秒的十位

P2=DSY_CODE[s%10];//显示秒的个位

sTime();//调用1s定时

}

}

}

if(K2==0)

{DelayMS(10);//按键去抖动

if(K2==0)//再次检查按键

{P0=DSY_CODE[0];//十位清零

P2=DSY_CODE[0];

//个位清零

}}}}任务7.3矩阵键盘控制模拟电子闹钟的设计

任务准备

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器的驱动电路一般包含以下几个部分:三极管、蜂鸣器、续流二极管和电源滤波电容。蜂鸣器实物图蜂鸣器的驱动电路1.任务要求设计一只模拟电子闹钟,要求用矩阵键盘输入设置,用4位共阳极的数码管显示模拟时间,用蜂鸣器提醒设置的时间已到。具体要求如下:(1)用按键K0、K1、K2、K3、K4、K5、K6、K7、K8、K9输入0000~9999中的任意一个数值作为设定时间,数值的1表示1s,比如输入0060就表示60s即1分钟,输入0600就表示600s即10分钟。(2)数值由四位共阳极的数码管动态显示,实时显示当前的数值(时间);(3)K10键作为开始键,按下后设置的数值以1s的时间间隔减1倒数;(4)K11键作为取消键,按下后取消前面的输入重新设置;(5)当设置的数值减到0时蜂鸣器报警。2.任务分析采用矩阵键盘:用AT89C51的P1.0~P1.3作为矩阵键盘的行线,P1.4~P1.7作为列线。采用一只4位的共阳极数码管,动态地显示模拟的时间,由于4位最大只能显示9999,所以显示的时间范围是0~9999秒。用AT89C51的P0口连接数码管的段线,用P2.0~P2.3连接位线。由定时/计数器的中断来实现1s定时。可以采用T1的8位自动重装载初值方式2,TMOD为0x20,采用12MHz晶体,设置定时时间为250us中断,中断4000次就为1s。键盘一位一位地输入需要设置的时间数值,按下开始键后,定时器开始计数,每过1s数值减1,直到数值减为0则启动蜂鸣器报警。3.任务设计(1)器件的选择器件名称数量(只)AT89C51112MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻1510Ω电阻1轻触按键164位共阳极数码管1BC850B三极管4BC858B三极管1有源蜂鸣器1模拟电子闹钟设计器件列表(2)硬件原理图设计①主函数main():②T1初始化子函数init_time1():初始化定时器1③T1的1s定时减1中断函数timer1():定时250us

④减1子函数plus():⑤动态显示子函数display():显示⑥键盘扫描子函数keyscan():矩阵键盘扫描⑦延时1ms子程序DelayMS():延时1ms。(3)软件程序设计:模块程序设计源程序编写如下://宏定义#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P2^7;//矩阵键盘键值表ucharcodeKeyCodeTable[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//共阳极数码管段码表ucharcodeDisplayTable[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义全局变量uchardigbit; //字位ucharwordbuf[4]; //字型码缓冲区ucharcount; //字型码缓冲区计数 intt1count; //定时器1计数//延时1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//键盘扫描子函数ucharkeyscan(){ucharsCode,kCode,i,k;P1=0xF0;//低4位行线置0

if((P1&0xF0)!=0xF0) {DelayMS(10); if((P1&0xF0)!=0xF0) {sCode=0xFE;//设置行扫描码初值

for(k=0;k<4;k++)//对4行分别扫描

{P1=sCode; if((P1&0xF0)!=0xF0) {kCode=~P1; do{P1=0xF0;} //等待按键弹起 while((P1&0xF0)!=0xF0);

for(i=0;i<16;i++)//查表得到按键序号并返回

if(kCode==KeyCodeTable[i])returni;

}

elsesCode=_crol_(sCode,1);

}

}

}

return-1;}

//减1子函数voidplus() {inti;i=wordbuf[0]*1000+wordbuf[1]*100+wordbuf[2]*10+wordbuf[3];//将千百十个位合成一整数

i--;if(i<=0)//数值减为0时使蜂鸣器响BEEP=0;wordbuf[0]=i/1000;//减1后的数值再分为一位一位的放入数组去显示

wordbuf[1]=i%1000/100;wordbuf[2]=i%100/10;wordbuf[3]=i%10;}//初始化定时器1函数(定时器1,8位自动重装载初值模式2,250次计数)voidinit_time1(){TMOD=0x20;TH1=0x06;TL1=0x06;EA=1;ET1=1;TR1=1;}//定时器1,1s定时减1中断函数

timer1()interrupt3{t1count++;if(t1count==4000) //进入中断4000次为1s{t1count=0; plus();//调用减1函数

}}//数码管动态显示子函数voiddisplay(){uchari;switch(digbit) {case1: i=0; break; case2: i=1; break; case4: i=2; break; case8: i=3; break; default: break; }P2=0x00; //关闭显示P0=DisplayTable[wordbuf[i]];//送字型码P2=digbit; //送字位码

DelayMS(2);if(digbit<0x08) //共4位digbit=digbit*2; //左移一位elsedigbit=0x01;}

//主函数voidmain(){intm,j,key;count=0; //初始没有输入,计数器设为0for(j=0;j<4;j++) //刚加电时,初始0000wordbuf[j]=0;while(count<5){ key=keyscan(); //调用键盘扫描函数

if(key>=0&&key<10)m=1; //输入0~9 elseif(key==10)m=2; //开始倒计时键

elseif(key==11)m=3; //取消键

elsem=4; //其他按键

switch(m){ case1:if(count<4) {wordbuf[count]=key; //将按键序号即数字存入数组

P0=DisplayTable[key];//每次输入一个数字时4位都显示该数

count++; }break; case2:count=5; //按下开始键就跳出此循环

break; case3:count=0; //计数清零

for(j=0;j<4;j++) {wordbuf[j]=0; //数码管显示0000 P0=DisplayTable[0]; } break; default:break;}}digbit=0x01;init_time1(); //打开T1的1s计时while(1){display(); } //调用动态显示}项目拓展STC89C52实验板简易电子琴的设计

在实验板上设计一个简易的电子琴,具体要求:按K1键发1音,按K2键发2音……按K8键发高音1。由蜂鸣器来发出相应的音调。1.任务要求2.任务分析音乐主要是由音符和节拍决定的,“哆、唻、咪、法、嗦、啦、唏”音符对应于不同的声波频率,而节拍则表达的是声音持续的时间。通过控制单片机定时器的定时时间可以产生不同频率的方波,用于驱动无源蜂鸣器就能发出不同的音符,然后利用延时子程序来控制发音时间的长短,即可控制节拍。把乐谱中的音符和相应的节拍变换成定时常数和延时常数,做成数据表格存放在存储器中。由程序查表得到定时常数和延时常数,用1个定时器控制产生方波的频率,用延时程序控制发出该频率方波的持续时间。当延时时间到后再查询下1个音符的定时常数和延迟常数,依次进行下去即可。发音原理:在方式1的定时状态下,改变定时器的计数初值来产生不同的频率。音符(低音)频率/Hz简谱码(T值)音符(中音)频率/Hz简谱码(T值)音符(高音)频率/Hz简谱码(T值)低126263628152364580高1104765058低229463835258764684高2117565110低333064021365964777高3131965157低434964103469964820高4139765178低539264260578464898高5156965127低644064400688064968高6176065252低749464524798865030高7197665283C调音符、频率、定时常数关系表用杜邦线将单片机外围的J22的3脚与J42的7脚连接,就用P1.2控制喇叭的发声了;J26连接8只独立按键K1~K8,见“独立按键”电路,用杜邦线将J22的10~17脚与J26连接上,这样就用P3口控制8只独立按键。3.任务设计简易电子琴源程序如下://宏定义#include<reg52.h>#defineKeyPortP3//定义全局变量unsignedcharHigh,Low;//定时器预装值的高8位和低8位sbitSPK=P1^2;//定义喇叭接口unsignedcharcodefreq[][2]={0x44,0xFC,//523Hz“1”

0xAC,0xFC,//587Hz“2”

0x09,0xFD,//659Hz“3”

0x34,0xFD,//699Hz“4”

0x82,0xFD,//784Hz“5”

0xC8,0xFD,//880Hz“6”

0x06,0xFE,//988Hz“7”

0x22,0xFE,//1047Hz“高1”}//函数声明voidInit_Timer0(void);//初始化定时器//主函数voidmain(void){unsignedcharnum;Init_Timer0();//初始化定时器0SPK=0;//在未按键时,喇叭低电平,防止长期高电平损坏喇叭while(1)//主循环

{switch(KeyPort) {case0xfe:num=1;break; case0xfd:num=2;break; case0xfb:num=3;break; case0xf7:num=4;break; case0xef:num=5;break; case0xdf:num=6;break; case0xbf:num=7;break; case0x7f:num=8;break; default:num=0;break; }

if(num==0){TR0=0;SPK=0;//在未按键时,喇叭低电平,防止长期高电平损坏喇叭

}else{High=freq[num-1][1]; Low=freq[num-1][0]; TR0=1; }}}//定时器0初始化子程序voidInit_Timer0(void){TMOD=0x01; //使用模式1,16位定时器EA=1;//总中断打开

ET0=1;//定时器中断打开

TR0=1;//定时器开关打开}//定时器中断子程序voidTimer0_isr(void)interrupt1{TH0=High;TL0=Low;SPK=!SPK;}项目小结键盘有编码键盘和非编码键盘两种。非编码键盘又分为独立键盘和矩阵(行列式)键盘。独立键盘的识别比较简单,通过判断按键端口的电位即可识别按键操作,但独立键盘比较浪费端口线。矩阵键盘节约了端口线,比如8根端口线就可以控制16个按键,但是它的识别方法相对复杂一些。对按键的识别矩阵键盘的按键识别方法有扫描法和线反转法。按键应用时一定要去抖动一般有硬件去抖和软件去抖两种方法。我们一般采用软件去抖动的方法,在识别按键后延时10ms后再次进行识别。应用键盘、数码管和单片机的定时/计数器、中断等知识我们在本项目中主要学习了电子秒表和电子闹钟的设计方法。在项目拓展中学习了运用单片机的定时/计数器和蜂鸣器实现乐音的方法。

项目8单片机通信系统的设计了解串行通信的基本知识。了解RS-232C接口。了解MCS-51系列单片机串行口的组成。掌握MCS-51系列单片机串行口的工作原理及应用方法。掌握MCS-51系列单片机串行口工作电路的分析与设计方法。掌握单片机与PC串行口通信系统的设计方法。能熟练编写单片机串行口通信的发送和接收数据的程序。能独立分析和解决硬件设计和软件设计中的问题。能利用团队的力量完成任务,培养团队合作精神。学习目标叙述RS-232C串行通信接口标准;叙述51单片机的串行口工作原理;设计单片机与单片机之间的通信电路和工作软件;设计单片机与PC机之间的通信电路和工作软件。工作任务任务8.1MCS-51单片机之间的串行通信设计任务8.2单片机与计算机通信系统的设计项目拓展STC89C52实验板串口和USB口软件下载的设计项目小结项目8单片机通信系统的设计任务8.1MCS-51系列单片机之间的串行通信设计

CPU与外部的信息交换称为通信。基本的通信方式有两种:并行通信和串行通信8.1.1RS232串行通信标准

8.1.1.1串行通信

并行通信是数据的各位同时发送或同时接收;并行通信优点:传送速度快

缺点:不便长距离传送串行通信优点:便于长距离传送

缺点:传送速度较慢串行通信是数据的各位依次逐位发送或接收。1.串行通信的分类(1)异步通信(AsynchronousCommunication)

异步通信中数据是以字符为单位组成字符帧传送,每一帧数据低位在前,高位在后。发送端和接收端可由各自独立的时钟来控制数据的发送和接收,互不同步。字符帧格式:异步通信的重要指标。接收端依靠字符帧格式来判断发送端发送的开始和结束。优点:对硬件要求较低,实现较简单、灵活,适用于数据的随机发送/接收。缺点:工作速度较低,每个字节都要建立一次同步(额外附加两位)。单片机主要采用异步通信方式。

字符帧(CharacterFrame)也叫数据帧,由起始位、数据位、奇偶校验位和停止位等4部分组成。

起始位:位于字符帧开头,只占1位,为逻辑“0”电平,用于向接收设备表示发送端开始发送一帧信息。

数据位:D0~D7紧跟起始位之后,用户根据情况可取5~8位,低位在前,高位在后。

奇偶校验位:位于数据位之后,仅占1位,用来表征串行通信中采用奇校验还是偶校验,由用户决定。

停止位:位于字符帧最后,为逻辑“1”电平。通常可取1位、1.5位或2位,用于向接收端表示一帧字符信息已经发送完,也为发送下一帧作准备。图8.1串行异步通信的字符帧格式(a)无空闲位字符帧(b)有空闲位字符帧(2)同步通信(SynchronousCommunication)

同步通信是指在发送设备和接收设备同步时钟频率的情况下,发送设备先发送串行通信数据同步信号给接收设备,接收设备接收到同步信号后,开始进行串行数据块的传送,当串行数据块传送完毕时,发送设备发送结束串行通信同步数据,停止串行通信。优点:数据传输速率较高,通常可达56000b/s或更高。

缺点:要求发送时钟和接收时钟必须保持严格同步。图8.2串行同步通信的数据块格式2.串行通信的波特率(BaudRate)

波特率:每秒钟传送二进制数码的位数,也叫比特数,单位为b/s,即位/秒。波特率表征数据传输的速度,波特率越高,数据传输速度越快。字符的实际传输速率是每秒内所传字符帧的帧数,和字符帧格式有关。异步通信的波特率通常为50~9600b/s,同步通信的波特率可达56kb/s或更高。

3.串行通信方式(制式)

串行通信根据数据传送的方向及时间关系可分为单工、半双工和全双工三种制式。

单工制式(Simplex)单工制式是指甲乙双方通信时只能单向传送数据,发送方和接收方固定。半双工制式(HalfDuplex)半双工制式是指通信双方都具有发送器和接收器,既可发送也可接收,但不能同时接收和发送,发送时不能接收,接收时不能发送。全双工制式(FullDuplex)全双工制式指通信双方均设有发送器和接收器,并且信道划分为发送信道和接收信道,因此全双工制式可实现甲乙双方同时发送和接收数据,发送时能接收,接收时也能发送。4.串行通信协议串行通信的格式及约定(如:同步方式、通讯速率、数据块格式、信号电平……等)不同,形成了多种串行通信的协议与接口标准:☞通用异步收发器(UART)——本课程介绍的串口☞通用串行总线(USB)☞I2C总线☞CAN总线☞SPI总线☞RS-485,RS-232C,RS422A标准……等等异步通信的硬件电路称为UART,即通用异步接收器/发送器(UniversalAsychronousReceiver/Transmitter)同步通信的硬件电路称为USRT(UniversalSychronousReceiver/Transmitter)异步和同步通信共用的硬件电路称为USART(UniversalSychronousAsychronousReceiver/Transmitter)8.1.1.2RS-232C简介

RS-232C的全称是EIARS232C标准,EIA(ElectronicIndustryAssociation)代表美国电子工业协会,RS(RecommendedStandard)代表EIA的“推荐标准”,232为标识号。

RS-232C主要用来定义计算机系统的一些数据终端设备(DTE)和数据电路终接设备(DCE)之间的电气性能。例如:CRT、打印机与CPU的通信

MCS-51单片机与PC机的通信

RS-232C适用范围:设备间的通信距离不大于15m

传输速率最大为20kb/s

1. RS-232C信息格式标准

RS-232C采用串行格式。标准规定:信息的开始为起始位,信息的结束为停止位;信息本身可以是5、6、7、8位再加一位奇偶校验位。如果两个信息之间无信息,则写“1”,表示空。RS-232C信息格式

2. RS-232C引脚定义

RS-232C接口规定使用25针“D”型口连接器。现在微型计算机通信中,常用的只有9根信号引脚,所以用9针“D”型接口(DB9)连接器替代25针连接器。

DB9连接器的引脚排列插针序号信号名称功能1PGND保护接地2(3)TXD发送数据(串行输出)3(2)RXD接收数据(串行输入)4(7)RTS请求发送RTS(输出)5(8)CTS消除发送CTS(输入)6(6)DSRDCE就绪(数据建立就绪)7(5)SGND信号接地8(1)DCD载波检测20(4)DRTDTE就绪(数据终端准备就绪)22(9)RI振铃指示表8.1RS-232C标准接口主要引脚定义

注:插针序号()内为9针非标准连接器的引脚号。

3.RS-232C电器特性

RS-232C的电气标准采用负逻辑:

逻辑“0”:+5V~+15V

逻辑“1”:-5V~-15V

注意:RS-232C必须进行电平转换后才能和TTL电平直接相连,否则将把TTL电路烧坏。

RS232与TTL之间的电平转换目前多采用MAX232、MAX220、HIN232等芯片,它们同时集成了RS-232电平与TTL电平之间的互换。第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。

8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。

TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DP9插头;DP9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。第三部分是供电。15脚DNG、16脚VCC(+5v)。TTL/CMOSINPUTS端口:输入TLL或CMOS信号,一般为0-5V,低电平为零,高电平为VCC。TTL/CMOSOUTPUTS端口:输出TLL或CMOS信号,输出电压一般为0-5V,低电平为零,高电平为VCC。RS232OUTPUTS

端口:把TTL或CMOS的信号转为RS232的信号输出,输出为正负12V连接到电脑。RS232INPUTS端口:接收到电脑发出的正负12伏,由RS232输出转为TTL或CMOS信号。MAX232内部有二组RS232转换电路,使用时

11-----14

13----12为一组.10-----7

8----9为一组图8.7MAX232通信接口电路8.1.2MCS-51单片机串行口的工作原理

51单片机内部有一个可编程的全双工的异步串行通信接口,它通过数据接收引脚RXD(P3.0)和数据发送引脚TXD(P3.1)与外设进行串行通信,可以同时发送和接收数据。这个串行口既可以实现异步通信,又可以用于网络通信,还可以作为同步移位寄存器使用。其帧格式有8位、10位和11位,并能设置各种波特率。

1.串行口内部结构串行口包含的特殊功能寄行器有SBUF、SCON、PCON51系列单片机串行口的结构框图(1)串行口数据缓冲器SBUF在逻辑上只有一个,既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H,用同一寄存器名SBUF。在物理上有两个,一个是发送缓冲寄存器,另一个是接收缓冲寄存器。

发送时,只需将发送数据输入SBUF,CPU将自动启动和完成串行数据的发送;

接收时,CPU将自动把接收到的数据存入SBUF,用户只需从SBUF中读出接收数据。

SBUF=0xFF

启动一次数据发送,可向SBUF

再发送下一个数

P1=SBUF

完成一次数据接收,SBUF可再接收下一个数(2)串行口控制寄存器SCON

SCON用来控制串行口的工作方式和状态,可以位寻址,字节地址为98H。单片机复位时,SCON的所有位全为0。图8.9SCON的各位定义

SM0、SM1:串行方式选择位,其定义如表8.2所示。

表8.2串行口方式的定义

SM2:多机通信控制位,用于方式2和方式3中。在方式2、3处于接收方式时,若SM2=1,且接收到的第9位数据RB8为0,则不激活RI;若SM2=1,且RB8=1,则置RI=1。在方式2、3处于接收或发送方式时,若SM2=0,则不论接收到的第9位RB8为0还是为1,TI、RI都以正常方式被激活。在方式1处于接收时,若SM2=1,则只有当收到有效的停止位后,RI才置1。在方式0中,SM2应为0。

REN:允许串行接收位。它由软件置位或清零。REN=1时,允许接收;REN=0时,禁止接收。

TB8:发送数据的第9位。在方式2和方式3下,TB8由软件置位或复位,可用做奇偶校验位。在多机通信中,TB8可作为区别地址帧或数据帧的标识位:地址帧时TB8为1;数据帧时TB8为0。

RB8:接收数据的第9位。功能同TB8。

TI:发送中断标志位。在方式0下,发送完8位数据后,TI由硬件置位;在其它方式中,TI在发送停止位之初由硬件置位。TI是发送完一帧数据的标志,可以用指令查询是否发送结束。TI=1时,也可向CPU申请中断,响应中断后,必须由软件清除TI。RI:接收中断标志位。在方式0下,接收完8位数据后,RI由硬件置位;在其它方式中,RI在接收停止位的中间由硬件置位。同TI一样,也可以通过指令查询是否接收完一帧数据。RI=1时,也可申请中断,响应中断后,必须由软件清除RI。(3)电源及波特率选择寄存器PCON

PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,不可以位寻址,字节地址为87H。在HMOS的8051单片机中,PCON除了最高位以外,其它位都是虚设的。只有SMOD与串行通信有关。SMOD为波特率选择位。在方式1、2和3下,串行通信的波特率与SMOD有关。当SMOD=1时,通信波特率乘2;当SMOD=0时,波特率不变。

2.串行口的工作方式(1)

方式0在方式0下,串行口作为同步移位寄存器使用,其波特率固定为fosc/12。串行数据从RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)送出。移位数据的发送和接收以8位为一帧,不设起始位和停止位,无论输入/输出,均低位在前高位在后。

这种方式常用于扩展I/O口。

①方式0用于扩展输出口(发送)当一个数据写入串行口发送缓冲器SBUF时,串行口将8位数据以fosc/12的波特率从RXD引脚输出(低位在前),发送完置中断标志TI为1,请求中断。在再次发送数据之前,必须由软件清TI为0。74LS164为串入并出移位寄存器(SIPO)。图8.12方式0扩展输出口电路应用实例1:用单片机的串行口外接74LS164,控制8只LED滚动显示。源程序:#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintvoidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}voidmain(){ucharc=0x80;SCON=0x00;//串行模式0TI=0;//TI清零

while(1){c=_crol_(c,1);SBUF=c;while(TI==0);TI=0;DelayMS(400);}}

②方式0用于扩展输入口(接收)在满足REN=1和RI=0的条件下,串行口即开始从RXD端以fosc/12的波特率输入数据(低位在前),当接收完8位数据后,置中断标志RI为1,请求中断。在再次接收数据之前,必须由软件清RI为0。具体接线图如图8.15所示。其中,74LS165为并入串出移位寄存器(PISO)。串行控制寄存器SCON中的TB8和RB8在方式0中未用。值得注意的是,每当发送或接收完8位数据后,硬件会自动置TI或RI为1,CPU响应TI或RI中断后,必须由用户用软件清0。方式0时,SM2必须为0。图8.15方式0扩展输入口电路应用实例2:用74LS165连接的8位拨码开关从单片机串行口输入控制8只LED的显示。

while(1){SPL=0;//置数,读入并行输入8位数据

SPL=1;//移位,输入封锁,串行转换

while(RI==0);//未收到等待

RI=0;P0=SBUF;DelayMS(20);}}源程序:#include<reg51.h>#include<intrins.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitSPL=P2^5;voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}voidmain(){SCON=0x10;//串行模式0,允许串口接收(2)方式1工作在方式1时,串行口为波特率可调的10位通用异步接口UART。发送或接收的一帧信息包括1位起始位0,8位数据位和1位停止位1。图8.17串行口方式1的数据格式

①发送发送时,数据从TXD端输出,当数据写入发送缓冲器SBUF后,启动发送器发送。当发送完一帧数据后,置中断标志TI为1。方式1所传送的波特率取决于定时器1的溢出率和PCON中的SMOD位。

②接收接收时,由REN置1,允许接收,串行口采样RXD,当采样由1到0跳变时,确认是起始位“0”,开始接收一帧数据。当RI=0,且停止位为1或SM2=0时,停止位进入RB8位,同时置中断标志RI;否则信息将丢失。所以,采用方式1接收时,应先用软件清除RI或SM2标志。

③波特率方式1波特率可变,由定时/计数器T1的计数溢出率决定。波特率=2SMOD×(T1溢出率)/32

其中SMOD为PCON寄存器中最高位的值,SMOD=1表示波特率倍增。在实际应用时,通常是先确定波特率,后根据波特率求T1定时初值,因此上式又可写为:

X=256-2SMOD/32×fosc/(12×波特率)表8.3定时器1产生的常用波特率(3)方式2方式2下,串行口为11位UART,传送波特率与SMOD有关。发送或接收的一帧数据包括1位起始位0,8位数据位,1位可编程位(用于奇偶校验)和1位停止位1。图8.20方式2的数据格式

可编程位TB8/RB8既可作奇偶校验位用,也可作控制位(多机通信)用,其功能由用户确定。

波特率:方式2波特率固定,即fosc/32和fosc/64。如用公式表示则为:波特率=2SMOD╳fosc/64当SMOD=0时,波特率=20

╳fosc/64=fosc/64当SMOD=1时,波特率=21

╳fosc/64=fosc/32(4)方式3方式3为波特率可变的11位UART通信方式。除了波特率不同以外,方式3和方式2完全相同。注意:单片机进行多机通信时常常采用串行口的工作方式2或工作方式3。

(5)串行口四种工作方式的比较四种工作方式的区别主要表现在帧格式及波特率两个方面。工作方式帧格式波特率方式08位全是数据位,没有起始位、停止位固定,每个机器周期传送一位数据方式110位没,其中1位起始位,8位数据位,1位停止位不固定,取决于T1溢出率和SMOD方式211位,其中1位起始位,9位数据位,1位停止位固定,即2SMOD×fosc/64方式3同方式2同方式13.串行口的初始化

51单片机的串行口需初始化后,才能完成数据的输入、输出。其初始化过程如下:(1)按选定串行口的工作方式设定SCON的SM0、SM1两位二进制编码。(2)对于工作方式2或3,应根据需要在TB8中写入待发送的第9位数据。(3)若选定的工作方式不是方式0,还需设定接收/发送的波特率。(4)设定SMOD的状态,以控制波特率是否加倍。(5)若选定工作方式1或3,则应对定时器T1进行初始化以设定其溢出率。

例:51单片机的晶振频率为11.0592MHz,波特率为1200b/s,要求串口发送数据为8位,编写它的初始化程序。解:假设SMOD=1,T1工作在方式2。初始化程序如下:SCON=0x50;//串口工作于方式1 PCON=0x80;//SMOD=1 TMOD=0x20;//T1工作于方式2定时方式 TH1=0xD0;//设置时间常数(根据公式计算得来或查表) TL1=0xD0;//自动重装时间常数 TR1=1;//启动T1

8.1.3单片机之间的双机串行通信的设计方法

8.1.3.1单片机之间的通信

1.双机通信距离较近的两个MCS-51单片机系统可以将它们的串行口直接相连,实现双机通信。为了增加通信距离,减少通道和电源干扰,可以在通信线路上利用RS-232C等标准接口进行双机通信。图8.23单片机双机通信系统

51单片机串行口的方式2和方式3有一个专门的应用领域,即多机通信。所谓多机通信是指一台主机和多台从机之间的通信,构成主从式多机分布通信系统。主机发送的信息可以传输到各个从机,各从机只能向主机发送信息,从机之间不能进行相互通信。

2.多机通信

图8.24单片机多机通信系统单片机作为下位机,主要实现数据采集、检测与控制等功能。PC机通常作为上位机接收下位机采集的各种数据,并进行数据运算、处理与管理等功能,同时向下位机发出各种指令。通常PC机工作于查询方式,而51单片机既可以工作于查询方式,又可以工作于中断方式。因此,实现PC机与用单片机间数据通信是十分重要的。PC机与单片机之间可以由RS-232C等标准接口相连。

3.单片机和计算机机之间的通信

8.1.3.2MCS-51系列单片机之间的双机串行通信设计

1.任务要求甲机发送数据,乙机接收数据,甲机的K1按键通过串口发送信息控制乙机的LED灯D3和D4闪烁:①第一次按下K1键,甲机发送字符“A”,甲机的D1和乙机的D3都闪烁;②第二次按下K1键,甲机发送字符“B”,甲机的D2和乙机的D4都闪烁;③第三次按下K1键,甲机发送字符“C”,甲机的D1、D2和乙机的D3、D4都闪烁;④第四次按下K1键,甲机停止发送,甲机的D1、D2和乙机的D3、D4都停止闪烁。2.任务分析首先要根据任务的要求将两机串行口工作的方式和其中的参数设置好。两机的串行口

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论