资源描述
单击此处编辑母版标题样式,第,7,章基于,PROTEUS ISIS,的单片机电路仿真,第,7,章 基于,PROTEUS ISIS,的 单片机电路仿真,7.1,单片机最小系统实训,7.2,模拟汽车转向灯控制实训,7.3,基于,LED,数码管的简易秒表设计实训,7.4,电子广告牌实训,7.5,数码管动态显示实训,7.6,中断扫描方式的矩阵式键盘设计实训,7.7,模拟交通灯控制实训,7.8,液晶显示控制实训,7.9 A/D,转换接口技术实训,7.10 D/A,转换接口技术实训,7.11,双机通信技术实训,7.12,单片机课程设计,7.1,单片机最小系统实训,本实训通过,51,单片机控制一个简单的,LED,灯,实现闪烁功能,并将程序编译下载到单片机中,从而使单片机工作起来。单片机最小系统实训图如图,7.1.1,所示,所用元件清单如表,7.1.1,所示。,图,7.1.1,单片机最小系统实训图,程序代码为:,#include ,sbit P1_0=P10;,void delay(unsigned char i);,void main( ), while(1), P1_0=0;,delay(255);,P1_0=1;,delay(255);,void delay(unsigned char i), unsigned char j,k;,for(k=0;ki;k+),for(j=0;j255;j+);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-1-1.hex,,双击,AT89C51,,将弹出如图,7.1.2,所示的对话框。在图,7.1.2,中添加十六进制文件,7-1-1.hex,,点击“,OK”,即可。最后进行仿真,可发现,LED,灯按要求实现了闪烁功能。,图,7.1.2,添加十六进制文件,7.2,模拟汽车转向灯控制实训,安装在汽车不同位置的信号灯是汽车驾驶员之间及驾驶员向行人传递汽车行驶状况的工具,一般包括转向灯、刹车灯、倒车灯等。其中转向灯包括左转灯和右转灯,其状态表示的意义如表,7.2.1,所示。,本实训利用,PROTEUS,模拟汽车转向灯控制,其中开关,S0,、,S1,模拟驾驶员发出命令,若开关状态为,0,,则表示开关断开,反之闭合。其实训图如图,7.2.1,所示,所用元件清单如表,7.2.2,所示。,图,7.2.1,模拟汽车转向灯控制实训图,在上述电路图中,开关,S0,、,S1,模拟驾驶员命令,发光二极管,D1,、,D2,模拟左转灯和右转灯,两者之间的关系如表,7.2.1,所示。利用开关,S0,、,S1,的状态即可控制,D1,和,D2,的状态。程序代码为:,#include ,sbit P1_0=P10;,sbit P1_1=P11;,sbit P3_0=P30;,sbit P3_1=P31;,void delay(unsigned char i);,void main( ),bit left,right;,while(1),P3_0=1;,P3_1=1;,left=P3_0;,right=P3_1;,switch(P3),case 0xfc: P1_0=1,P1_1=1;break;,case 0xfd: P1_0=0,P1_1=1;break;,case 0xfe: P1_0=1,P1_1=0;break;,case 0xff: P1_0=0,P1_1=0;break;,delay(255);,P1_0=1;,P1_1=1;,delay(255);,void delay(unsigned char i),unsigned char j,k;,for(k=0;ki;k+),for(j=0;j255;j+);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-2-1.hex,,双击,AT89C51,,将弹出如图,7.2.2,所示的对话框。在图,7.2.2,中添加十六进制文件,7-2-1.hex,,点击“,OK”,即可。最后进行仿真,可实现表,7.2.1,的所有功能。,图,7.2.2,添加十六进制文件,7.3,基于,LED,数码管的简易秒表设计实训,利用,51,单片机控制,1,个,LED,数码管,依次循环显示,0,9,,显示间隔时间为,1 s,,即可实现一位数的简易秒表。基于,LED,数码管的简易秒表设计实训图如图,7.3.1,所示,所用元件清单如表,7.3.1,所示。,图,7.3.1,基于,LED,数码管的简易秒表设计实训,在上述电路图中,利用单片机的,P2,口控制一个共阳极,LED,数码管,向,P2,口输出相应字型码即可显示数字,0,9,。对于共阳极数码管,当连接段控制端的,I/O,引脚输出低电平时,相应段的发光管点亮。程序代码为:,#include,unsigned char,led=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;,/,定义数组,led,存放数字,0,9,的字型码,void delay1s(),/,采用定时器,1,实现,1s,的延时,unsigned char i;,for(i=0;i20;i+) /,设置循环次数为,20,TH1=0x3c; /,设置定时器初值为,3CBOH,TL1=0xb0;,TR1=1; /,启动定时器,T1,while(!TF1); /,查询计数是否溢出,即,50 ms,时间到 则,TF1=1,TF1=0; /,将溢出标志位,TF1,清零,void main(),/,主函数,unsigned char i;,TMOD=0x10;,/,设置定时器,1,在工作方式,1,while(1),for(i=0;i10;i+),P2=ledi; /,字型码送段控制口,P1,delay1s(); /,延时,1 s,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-3-1.hex,,双击,AT89C51,,将弹出如图,7.3.2,所示的对话框。在图,7.3.2,中添加十六进制文件,7-3-1.hex,,点击“,OK”,即可。最后进行仿真,可实现每隔,1s,依次循环显示数字,0,9,。,图,7.3.2,添加十六进制文件,7.4,电子广告牌实训,利用,51,单片机控制,1,个,88 LED,点阵显示模块,依次循环显示,0,9,,显示间隔时间为,1 s,,实现一位数的简易秒表。电子广告牌实训图如图,7.4.1,所示,所用元件清单如表,7.4.1,所示。,图,7.4.1,电子广告牌实训图,LED,点阵显示是把很多,LED,按矩阵方式排列在一起,通过对各,LED,发光与不发光的控制来完成各种字符或图形的显示。,88 LED,点阵分别由,8,行和,8,列来控制。在图,7.3.1,中,用单片机的,P1,口控制点阵屏的,8,行,用,P0,口控制点阵屏的,8,列。,实际应用中,,P0,口用于控制列线,需串联一个,300,左右的限流电阻。同时,为了提高单片机端口带负载的能力,通常在端口和外接负载之间增加一个缓冲驱动器。图,7.4.1,中,P1,口通过,74LS245,与点阵连接,既保证了点阵的亮度,又能保护单片机的引脚。其程序代码为:,#include,void delay(unsigned char i), unsigned char k,j;,for(k=0;ki;k+),for(j=0;j255;j+);,void delay1ms() /,软件实现延时,1ms, unsigned char i;,for(i=0;i0x10;i+);,void main(), unsigned char code led=0x00,0x18,0x24,0x24,0x24,0x24,0x18,0x00, /0 0x08,0x18,0x28,0x08,0x08,0x08,0x3e,0x00, /1 0x00,0x18,0x24,0x24,0x08,0x10,0x3c,0x00, /2 0x00,0x18,0x24,0x04,0x18,0x04,0x24,0x18, /3 0x00,0x08,0x10,0x28,0x48,0x3e,0x08,0x00, /4 0x00,0x2c,0x20,0x28,0x04,0x24,0x18,0x00, /5 0x08,0x10,0x20,0x38,0x24,0x24,0x18,0x00, /6,0x00,0x3c,0x04,0x08,0x10,0x10,0x10,0x00, /7 0x00,0x18,0x24,0x24,0x18,0x24,0x24,0x18, /8 0x00,0x18,0x24,0x24,0x1c,0x04,0x24,0x18;/9,unsigned char w;,unsigned int j,k,l,m;,while(1), for(j=0;j10;j+)/,字符个数控制变量, for(k=0;k1000;k+)/,每个字符扫描,1000,次,控制每 个字符的显示时间, w=0x01;/,行变量指向第一行,l=j*8; for(m=0;m8;m+), P1=0x00; /,关闭行,防止出现显示残留,P0=,ledl;/,列数据取反后值送至,P0,口,P1=w;/,打开行,delay1ms(); w=1; /,逐行扫描,l+;/,指向数组中下一个显示码,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-4-1.hex,,双击,AT89C51,,将弹出如图,7.4.2,所示的对话框。在图,7.4.2,中添加十六进制文件,7-4-1.hex,,点击“,OK”,即可。最后进行仿真,可实现每隔,1 s,依次循环显示,0,9,。,图,7.4.2,添加十六进制文件,如果要在,88,点阵上显示的图形如图,7.4.3,所示,程序该如何修改?请读者自行实现此功能。,图,7.4.3,显示汉字字符,7.5,数码管动态显示实训,本节利用数码管动态显示自己的生日,(,修定生日为,1980,年,7,月,8,日,),,实训图如图,7.5.1,所示,所用元件清单如表,7.5.1,所示。,图,7.5.1,数码管动态显示实训,在上述电路图中,六位数码管的位选端由,P2.0,P2.5,控制,段选端由,P1,口控制,,P1,口通过,74LS245,与数码管的段选端连接,既能保证数码管的亮度,又能保护单片机引脚。其程序代码为:,#include,voiddelay1ms(),unsigned char i;,TMOD=0x20;,TH1=6;,TL1=6;,TR1=1;,for(i=0;i4;i+),while(!TF1);,TF1=0;,void disp(),unsigned char led =0x80,0xc0,0xc0,0xf8,0xc0,0x80;,unsigned char i,w;,w=0x01;,for(i=0;i6;i+),P2=w;,w=1;,P1=ledi;,delay1ms(); ,voidmain(),while(1),disp();,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-5-1.hex,,双击,AT89C51,,将弹出如图,7.5.2,所示的对话框。在图,7.5.2,中添加十六进制文件,7-5-1.hex,,点击“,OK”,即可。最后进行仿真,可显示如图,7.5.3,所示的生日。,图,7.5.2,添加十六进制文件,图,7.5.3,显示生日图,7.6,中断扫描方式的矩阵式键盘设计实训,采用中断扫描方式设计,44,矩阵键盘,当某个键被按下时,,LED,数码管显示相应按键的键值。中断扫描方式的矩阵式键盘实训图如图,7.6.1,所示,所用元件清单如表,7.6.1,所示。,图,7.6.1,中断扫描方式的矩阵式键盘实训图,44,矩阵式键盘的,4,根行线连接到,P0,口的低四位,,4,根列线连接到,P0,口的高四位。按照矩阵式键盘的扫描方法可知,,P0.0,P0.3,为扫描输入线,,P0.4,P0.7,为键输出线。图,7.6.1,中的与门用于产生按键中断,其输入端与各行线相连,再通过上拉电阻接至,+5V,电源,输出端接至外部中断,0,的输入端,P3.2,。,LED,数码管由单片机的,P1,口控制。,具体工作过程如下:当键盘没有键按下时,与门各输入端均为高电平,与门输出端也保持高电平;当有键被按下时,与门输入端有低电平,相应地与门输出端变为低电平,从而控制,P3.2,向,CPU,申请中断,若,CPU,开放外部中断,则会响应中断请求,转去执行键盘扫描程序并获得对应键值,最终通过,LED,数码管显示。,其程序代码为:,#include,#define uchar unsigned char,void display(uchar num);,void delay10ms();,uchar code led=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;,void main(,), P1=0xff;TMOD=0x10; /T1,在工作方式,1,IE=0x87;/,开中断总允许位和外部中断,0,允许位,IT0=1;/,设置外部,0,中断下降沿触发,while(1),P0=0xef;P0=0xdf;P0=0xbf;P0=0x7f;,void display(uchar num),P1=lednum;,voiddelay10ms(),TH1=0xd8;TL1=0xf0;TR1=1;while(!TF1);TF1=0;,voidinth() interrupt 0,/,外部中断,0,uchar temp,key;P0=0xef;/,扫描第一行,temp=P0;/P0,状态送给变量,temptemp=temp/,与操作屏蔽低四位,if(temp!=0x0f)/P0,高四位有低电位进入,delay10ms(); /,延时,10 mstemp=P0; /P0,状态送给变量,temptemp=temp /,与操作屏蔽低四位,if(temp!=0x0f) temp=P0; /,判断后的,P0,状态送给变量,temp switch(temp),case 0xee:key=0;break; /,键值为,0,的按键按下,case 0xed:key=4;break;/,键值为,1,的按键按下,case 0xeb:key=8;break;/,键值为,2,的按键按下,case 0xe7:key=12;break;/,键值为,3,的按键按下,while(temp!=0x0f) /,等待按键释放,即,P0,高四位恢复 高电位,结束循环,temp=P0;temp=temp/,显示键值,P0=0xdf;/,扫描第一行,temp=P0;/P0,状态送给变量,temptemp=temp/,与操作屏蔽低四位,if(temp!=0x0f)/P0,高四位有低电位进入,delay10ms();temp=P0;temp=tempif(temp!=0x0f),temp=P0;switch(temp)case 0xde:key=1;break;case 0xdd:key=5;break;case 0xdb:key=9;break;case 0xd7:key=13;break;,while(temp!=0x0f)/,等待按键释放,temp=P0;temp=temp/,显示键值,P0=0xbf;/,扫描第一行,temp=P0;/P0,状态送给变量,temptemp=temp/,与操作屏蔽低四位,if(temp!=0x0f)/P0,高四位有低电位进入,delay10ms();temp=P0;,temp=temp,while(temp!=0x0f)/,等待按键释放,temp=P0;temp=temp /,显示键值,P0=0x7f;/,扫描第一行,temp=P0;/P0,状态送给变量,temptemp=temp/,与操作屏蔽低四位,if(temp!=0x0f)/P0,高四位有低电位进入,delay10ms();temp=P0;temp=tempif(temp!=0x0f),temp=P0;switch(temp)case 0x7e:key=3;break;case 0x7d:key=7;break;case 0x7b:key=11;break;case 0x77:key=15;break;,while(temp!=0x0f)/,等待按键释放,temp=P0;temp=temp /,显示键值,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-6-1.hex,,双击,AT89C51,,将弹出如图,7.6.2,所示的对话框。在图,7.6.2,中添加十六进制文件,7-6-1.hex,,点击“,OK”,即可。最后进行仿真,若按键,S0,按下,数码管显示的数字为“,0”,;若按键,S1,按下,数码管显示的数字为“,1”,;若按键,S2,按下,数码管显示的数字为“,2”,,以此类推,若按键,S15,按下,数码管显示的数字为“,F”,。,图,7.6.2,添加十六进制文件,7.7,模拟交通灯控制实训,(1),正常情况下双方向轮流点亮信号灯。信号灯的状态如表,7.7.1,所示。,(2),有紧急车辆通过时,,A,、,B,方向均亮红灯。本实训主要是定时控制东南西北四个方向上的,12,盏交通信号灯,并且出现紧急情况时,能及时调整交通灯指示状态。,观察表,7.7.1,不难发现,在不考虑左转弯行驶车辆的情况下,东、西两个方向的信号灯的显示状态是一样的,所以对应两个方向上的,6,个发光二极管只用,P1,口的,3,根,I/O,口线控制即可。同理,南、北方向上的,6,个发光二极管可用,P1,口的另外,3,根,I/O,口线控制。当,I/O,口线输出高电平时,对应的交通灯灭;反之,当,I/O,口线输出低电平时,对应的交通灯亮。各控制口线的分配以及控制状态如表,7.7.2,所示。,根据上述分析,模拟交通灯控制实训图如图,7.7.1,所示,所用元件清单如表,7.7.3,所示。,表,7.7.3,模拟交通灯控制实训元件清单,图,7.7.1,模拟交通灯控制实训图,按键,S1,模拟紧急情况发生,当,S1,为高电平,(,不按按键,),时表示正常情况,,S1,为低电平,(,按下按键,),时表示紧急情况。,S1,按键接至,(P3.2),脚可实现外部中断,0,中断申请,实现,A,、,B,方向双向红灯显示。,其程序代码为:,#include,unsigned char t0,t1;,void delay0_5s(),for(t0=0;t010;t0+),TH1=0x3c;,TL1=0xb0;,TR1=1;,while(!TF1);,TF1=0;,void delay_t1(unsigned char t),for(t1=0;t1t;t1+),delay0_5s();,void int_0() interrupt 0,unsigned char i,j,k,l,m;,i=P1;,j=t0;,k=t1;,l=TH1;,m=TH0;,P1=0xdb;,delay_t1(20);,P1=i;,t0=j;,t1=k;,TH1=1;,TH0=m;,void main(),unsigned char k;,TMOD=0x10;,EA=1;,EX0=1;,IT0=1;,while(1),P1=0xf3;,delay_t1(10);,for(k=0;k3;k+),P1=0xf3;,delay0_5s();,P1=0xfb;,delay0_5s();,P1=0xeb;,delay_t1(4);,P1=0xde;,delay_t1(10);,for(k=0;k3;k+),P1=0xde;,delay0_5s();,P1=0xdf;,delay0_5s();,P1=0xdd;,delay_t1(4);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-7-1.hex,,双击,AT89C51,,将弹出如图,7.7.2,所示的对话框。在图,7.7.2,中添加十六进制文件,7-7-1.hex,,点击“,OK”,即可。最后进行仿真,可实现表,7.7.1,的所有功能,且当紧急情况发生,(,按键,S1,按下,),时,,A,、,B,两方向双向红色显示。,图,7.7.2,添加十六进制文件,7.8,液晶显示控制实训,在实际生活中,经常可以看到八段,LED,数码管构成的广告牌显示屏,但数码管构成的显示屏显示的字符有限,不能灵活显示更多的字符和文字。对于显示多个字符的应用场合,就需要使用液晶显示器。液晶显示控制实训图如图,7.8.1,所示,所用元件清单如表,7.8.1,所示。,图,7.8.1,液晶显示控制实训,其程序代码为:,#include,typedef unsigned char uint8;,typedef unsigned int uint16;,sbit RS=P20;,sbit RW=P21;,sbit EN=P25;,sbit BUSY=P07;,unsigned char code word1=“Welcome to Shenz”;,/,定义显示的字符,unsigned char code word2=“hen Polytechnic”;,/,定义显示的字符,void delay(), uint16 i,j;,for(i=0;i200;i+),for(j=0;j200;j+);,void wait(,) /,等待繁忙标志,P0=0xff;,do,RS=0;,RW=1;,EN=0;,EN=1;,while(BUSY=1);,EN=0;,void w_dat(uint8 dat) /,写数据,wait(,);,EN=0;,P0=dat;,RS=1;,RW=0;,EN=1;,EN=0;,void w_cmd(uint8 cmd) /,写命令,wait(,);,EN=0;,P0=cmd;,RS=0;,RW=0;,EN=1;,EN=0;,void Init_LCD1602(,),/,初始化,w_cmd(0x38);,w_cmd(0x0f);,w_cmd(0x06);,w_cmd(0x01);,void w_string(uint8 addr_start, uint8 *p) /,显示字符,w_cm,d(addr_start);,while (*p != 0),w_dat(*p+);,delay();,main(),Init_LCD1602();,w_string(0x80,word1);,w_string(0xc0,word2);,w_cmd(0x0c);,while(1);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-8-1.hex,,双击,AT89C51,,将弹出如图,7.8.2,所示的对话框。在图,7.8.2,中添加十六进制文件,7-8-1.hex,,点击“,OK”,即可。最后进行仿真,从仿真结果来看,液晶上显示的字符为“,Welcome to Shenzhen Polytechnic”,。,图,7.8.2,添加十六进制文件,7.9 A/D,转换接口技术实训,采用,TI,公司生产的,A/D,转换芯片,TLC2543,采集,0,5V,连续可变的模拟电压信号,并将其转变为,12,位数字信号,送至,51,单片机进行处理,在四位数码管上显示出对应的数字信号。,0,5 V,的模拟电压信号可通过调节电位器获得。,A/D,转换接口技术实训图如图,7.9.1,所示,所用元件清单如表,7.9.1,所示。,图,7.9.1 A/D,转换接口技术实训图,在上述电路图中,,0,5 V,模拟电压信号可通过调节电位器获得,并被送至,A/D,芯片,TLC2543,的,AIN0,通道。数据输出端,SDO,、串行数据输入端,SDI,、片选端和输入,/,输出时钟,CLK,分别与,51,单片机的,P1.0,P1.3,相连。四位数码管选用共阳极数码管,位选端由单片机的,P3.0,P3.3,控制,段码端由单片机的,P2.0,P2.7,控制,采用动态扫描法显示。,其程序代码为:,#include,#include,#include,#define uchar unsigned char,#define uint unsigned int,sbit AD_CLOCK=P13; /TLC2543,控制位的宏定义,sbit AD_IN=P11;,sbit AD_OUT=P10;,sbit AD_CS=P12;,uchar table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /,共阳极数码管段码,static const uchar ad_channel_select=,0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78,0x88,0x98,0xa8;,/,通道,0,10,均为,12,位数据,,MSB,在前,无符号,uint ad2543(uchar chunnel_select),/,二进制,,A/D,转换子程序,读出上一次,AD,值,(12,位精,/,度,),,并开始下一次转换, uint din,j;,uchar dout,i;,din=0;,dout=ad_channel_selectchunnel_select;,for(j=0;j100;j+); /,延时大于,1us,AD_CLOCK=0;,AD_CS=0;,for(i=0;i12;i+),if(dout,else AD_IN=0;,AD_CLOCK=1;,dout=1;,din=1;,if(AD_OUT=1) din|=0x0001;,AD_CLOCK=0;,AD_CS=1;,for(j=0;j100;j+); /,延时大于,1us,return(din);,void display(uint num),/AD,输出,12,位数字信号,数码管显示程序,uint a;,P3=0x08;,P2=tablenum/1000;,for(a=0;a1000;a+);,P3=0x04;,P2=table(num%1000)/100;,for(a=0;a1000;a+);,P3=0x02;,P2=table(num%1000)%100)/10;,for(a=0;a1000;a+);,P3=0x01;,P2=table(num%1000)%100)%10;,for(a=0;a1000;a+);,void main(void),uint ad;,while (1), ad=ad2543(0);,display(ad);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-9-1.hex,,双击,AT89C51,,将弹出如图,7.9.2,所示的对话框。在图,7.9.2,中添加十六进制文件,7-9-1.hex,,点击“,OK”,即可。,图,7.9.2,添加十六进制文件,最后进行仿真,,调节电位器的滑动旋钮,发现在四位数码管上可正确显示,A/D,转换后的,12,位数据:若模拟电压为,5 V(,最大值,),,其数码管上显示,1111 1111 1111(FFFH),,即十进制为,4095,;若模拟电压为,0 V(,最小值,),,其数码管上显示,0000 0000 0000(000H),,即十进制为,0000,;若模拟电压为,2.5 V(,中间值,),,其数码管上显示,1000 0000 0000(800H),,即十进制为,2048,。,7.10 D/A,转换接口技术实训,采用,TI,公司生产的,D/A,转换芯片,TLC5615,及,51,单片机组成波形发生器,编制程序产生锯齿波信号,通过程序控制锯齿波信号的幅值及周期。,D/A,转换接口技术实训如图,7.10.1,所示,所用元件清单如表,7.10.1,所示。,图,7.10.1 D/A,转换接口技术实训图,在上述电路图中,,TLC5615,与单片机的连接只需,3,根线,即串行时钟输入端,SCLK,、片选端和串行输入端,DIN,分别与单片机的,P3.0,P3.2,相连;参考电压端,REFIN,通过稳压管与电阻相连,以实现各种不同的输入参考电压;输出端,OUT,与示波器相连,以观察锯齿波波形幅值及周期。,其程序代码为:,#include ,sbit SCK=P30; /TLC5615,控制位的宏定义,sbit CS=P31;,sbit DIN=P32;,void TLC5615(unsigned int x) /TLC5615,转换子程序,unsigned char y;,CS=1;,SCK=0;,DIN=0;,CS=0;,x=6; /,舍弃前,6,位,,16,位数据的低,10,位变为高,10,位,for(y=0;y12;y+) /,高位到低位发送,DIN=x,SCK=1;,x=1;,SCK=0;,CS=1;,void main( ),unsigned int V_dat=0;,unsigned char i;,while(1),if(V_dat700) V_dat+=10;,/V_dat,的取值决定了锯齿波的幅值及频率,/,其值越大,信号幅值及周期就越大,else V_dat=0;,TLC5615(V_dat); /,进行数,/,模转换,i=10;,while(i-);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-10-1.hex,,双击,AT89C51,,将弹出如图,7.10.2,所示的对话框。在图,7.10.2,中添加十六进制文件,7-10-1.hex,,点击“,OK”,即可。最后进行仿真,可从示波器上观察到锯齿波波形,如图,7.10.3,所示。,图,7.10.2,添加十六进制文件,图,7.10.3,锯齿波波形小提示,7.11,双机通信技术实训,本实训通过,51,单片机建立一套简单的单片机串行口双机通信测试系统,发射和接收各用一套,AT89C51,单片机电路,分别称为甲机和乙机,将单片机甲机中存放的数据,(,例如,617528),发送给乙机,并在乙机的,6,个数码管上显示出来。双机通信技术实训图如图,7.11.1,所示,所用元件清单如表,7.11.1,所示。,图,7.11.1,双机通信技术实训图,在上述电路图中,乙机的六个数码管采用动态连接方式,各位共阳极数码管相应的段选控制端并联在一起,由,P1,口控制,由同相三态缓冲器,/,线驱动器,74LS245,驱动,各位数码管的位选端由,P2,口控制。甲机作为发送端,乙机作为接收端,将甲机的,TXD(P3.1,,串行数据发送端,),引脚接乙机的,RXD(P3.0,,串行数据接收端,),引脚,将甲机的,RXD,引脚接乙机的,TXD,引脚。值得注意的是,两个系统必须共地。,其程序代码如下。,(1),甲机发送数据的程序代码:,#include ,void main(),/,主函数, unsigned char i;,unsigned char send=6,1,7,5,2,8;,/,定义要发送的数据,TMOD=0x20; /,定时器,1,工作于方式,2,TL1=0xf4; /,波特率为,2400 b/s,TH1=0xf4;,TR1=1;,SCON=0x40; /,定义串行口工作于方式,1,for (i=0;i6;i+),SBUF=sendi; /,发送第,i,个数据,while(TI=0); /,查询等待发送是否完成,TI=0; /,发送完成,,TI,由软件清,0,while(1);,(2),乙机接收数据的程序代码:,#include ,code unsigned char,tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /,定义,0,9,显示字型码,unsigned char buffer =0x00,0x00,0x00,0x00,0x00,0x00;,/,定义接收数据缓冲区,void disp(void); /,显示函数声明,void main() /,主函数,unsigned char i;,TMOD=0x20; /,定时器,1,工作于方式,2,TL1=0xf4; /,波特率定义,TH1=0xf4;,TR1=1;,SCON=0x40;,/,定义串行口工作于方式,1,for(i=0;i6;i+),REN=1;,/,接收允许,while(RI=0);,/,查询等待接收标志为,1,,表示接收到数据,bufferi=SBUF; /,接收数据,RI=0; /RI,由软件清,0,for(; ;),disp(); /,显示接收数据,void disp(), unsigned char w,i,j;,w=0x01; /,位码赋初值,for(i=0;i6;i+),P2=w;,w5;j-);,/,显示延时,在,KEIL,软件中输入上述发送和接收代码,编译后产生十六进制文件,7-11-1.hex,和,7-11-2.hex,,分别双击甲机的,AT89C51,和乙机的,AT89C51,,将弹出如图,7.11.2,所示的对话框。在图,7.11.2,中分别添加十六进制文件,7-11-1.hex,和,7-11-2.hex,,点击“,OK”,即可。最后进行仿真,可观察到乙机的,6,位数码管上显示的正是甲机发送过来的数据“,617528”,,如图,7.11.3,所示。,图,7.11.2,添加十六进制文件,图,7.11.3,仿真后乙机显示的数据,7.12,单片机课程设计,7.12.1,数字频率计,1.,设计题目利用,51,单片机设计一个简易频率计,要求如下:,(1),测量范围为,1 Hz,9999 Hz,,误差在,20 Hz,以内。,(2),用四位数码管显示测量值。,(3),可测量方波、三角波及正弦波等多种波形。,2.,设计过程本数字频率计采用单片机的定时器,T0,,工作于计数状态,,P2,口控制四位数码管段码显示,,P0,口控制四位数码管位码,其实训图如图,7.12.1,所示,所用元件清单如表,7.12.1,所示。,图,7.12.1,数字频率计课程设计实训图,在上述电路图中,单刀三掷开关可选择正弦波、矩形波、三角波外部输入信号,,74HC14,为带施密特整形功能的非门,可将正弦波、三角波信号整形为矩形波信号,输入到,AT89C51,的,P3.4,作为计数脉冲输入端,,P2.0,P2.7,控制四位数码管段码,A,DP,,,P0.0,P0.3,控制四位数码管位码。,其程序代码为:,#include,/,头文件,#include,/,头文件,#define uchar unsigned char/,宏定义,#define uint unsigned int/,宏定义,sfr16 DPTR=0x82;/,定义,DPTR,bit status_F=1;/,状态标志位,uint aa, qian, bai,shi,ge,bb,wan,shiwan; /,定义变量,uchar cout;,unsigned long temp;/,定义长整型变量,uchar code,table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;,void delay(uint z); /,子函数声明,void init();,void display(uint qian,uint bai,uint shi,uint ge);,void xtimer0();,void xtimer1();,void xint0();,void main() /,主函数,P0=0xFF; /,初始化,P0,口,init();/,调用定时器,计数器初始化,while(1),if(aa=19)/,定时,20*50ms=1s,aa=0;/,定时完成一次后清,0,status_F=1;/,完成计数,TR1=0; /,关闭,T1,定时器,定时,1 s,完成,delay(46); /,延时校正误差,TR0=0;,/,关闭,T0,DPL=TL0; /,计数量的低,8,位,DPH=TH0;/,计数量的高,8,位,temp=DPTR+cout*65535; /,计数值放入变量,qian=temp%10000/1000;,/,显示千位,bai=temp%1000/100;,/,显示百位,shi=temp%100/10;,/,显示十位,ge=temp%10;,/,显示个位,display(qian,bai,shi,ge);,/,调用显示函数,void init() /,定时器,计数器初始化,temp=0;/,变量赋初值,aa=0;,cout=0;,IE=0X8A;/,开中断,,T0,,,T1,中断,TMOD=0x15;,/T0,为定时器工作于方式,1,,,T1,为计数器工作于方式,1,TH1=0x3c;/,定时器赋高,8,初值,,12 MHz,晶振,TL1=0xb0;/,定时器赋低,8,初值,,12 MHz,晶振,TR1=1;/,开定时器,1,TH0=0;/,计数器赋高,8,初值,TL0=0;/,计数器赋低,8,初值,TR0=1;/,开计数器,0,void display(uint qian,uint bai,uint shi,uint ge),/,显示子函数,P0=0xf7;/P0,口是位选端,P2=tableqian;/,显示千位,delay(3);,P0=0xfb;/P0,口是位选端,P2=tablebai;/,显示百位,delay(3);,P0=0xfd; /P0,口是位选端,P2=tableshi;/,显示十位,delay(3);,P0=0xfe;/P0,口是位选端,P2=tablege;/,显示个位,delay(3);,void xtimer1() interrupt 3 /,定时中断子函数,TH1=0x3c;/,定时器赋高,8,初值,TL1=0xb0;/,定时器赋低,8,初值,aa+;,void xtimer0() interrupt 1 /,计数器中断子函数,cout+;,void delay(uint z) /,延时子函数,延时,1 ms,uint i,j;,for(i=0;iz;i+),for(j=0;j110;j+);,在,KEIL,软件中输入上述代码,编译后产生十六进制文件,7-12-1.hex,,双击,AT89C51,,将弹出如图,7.12.2,所示的对话框。在图,7.12.2,中添加十六进制文件,7-12-1.hex,,点击“,OK”,即可。,图,7.12.2,添加十六进制文件,双击正弦波信号源,CP1,,在弹出的对话框中设置其幅值为,4 V,,频率为,1 kHz,。开始仿真,数码管上显示的频率值为,998 Hz,,如图,7.12.3,所示。同理,设置矩形波和三角波的频率分别为,1234 Hz,及,1 Hz,,拨动单刀三掷开关,四位数码管显示的频率分别为,1231 Hz,及,1 Hz,,如图,7.12.4,和图,7.12.5,所示,均符合课程设计题目要求。,图,7.12.3,显示正弦波信号频率值,图,7.12.4,显示方波信号频率值,图,7.12.5,显示三角波信号频率值,7.12.2,波形发生器,1.,设计题目利用,51,单片机设计一个简易波形发生器,要求如下:,(1),可输出锯齿波、三角波、方波和正弦波四种波形;,(2),上述四种波形分别由开关,S0,S3,进行切换;,(3),可由程序控制各种波形的频率及幅值。,2.,设计过程本波形发生器采用,AT89C51,单片机实现,采用程序设计方法编程实现锯齿波、三角波、方波和正弦波四种波形,再通过,D/A,转化器,DAC0832,将数字信号转换成模拟信号,最后经过运算放大器放大,由示波器显示所需要的波形,各种波形频率及幅值可由程序控制。其实训图如图,7.12.6,所示,所用元件清单如表,7.12.2,所示。,图,7.12.6,波形发生器课程设计实训图,在上述电路图中,开关,S0,S3,分别为四种波形的控制键,利用单片机,P0,口将,8,位数字量与数,/,模转换芯片,DAC0832,连接,数,/,模转换后经运算放大器,OPAMP,进行放大,最后在示波器的,A,通道显示所需要的波形。图中各器件的连接多采用网络标号连接。,其程序代码为:,#include,#define uchar unsigned char,sbit ksaw=P10; /,锯齿波按键,sbit ktran=P11; /,三角波按键,sbit ksquare=P12; /,方波按键,sbit ksin=P13; /,正弦波按键,void delay( );,uchar code tab128=64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,
展开阅读全文