proteus单片机.ppt

上传人:夺命阿水 文档编号:242193 上传时间:2023-03-17 格式:PPT 页数:321 大小:1.73MB
返回 下载 相关 举报
proteus单片机.ppt_第1页
第1页 / 共321页
proteus单片机.ppt_第2页
第2页 / 共321页
proteus单片机.ppt_第3页
第3页 / 共321页
proteus单片机.ppt_第4页
第4页 / 共321页
proteus单片机.ppt_第5页
第5页 / 共321页
点击查看更多>>
资源描述

《proteus单片机.ppt》由会员分享,可在线阅读,更多相关《proteus单片机.ppt(321页珍藏版)》请在课桌文档上搜索。

1、第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

2、.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

3、.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模拟驾驶员命令,发光

4、二极管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 0 xfc:P1_0=1,P1_1=1;break;case 0 xfd:P1_0=0,P1_1=1;bre

5、ak;case 0 xfe:P1_0=1,P1_1=0;break;case 0 xff: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的所有功能。,

6、图7.2.2 添加十六进制文件,7.3 基于LED数码管的简易秒表设计实训利用51单片机控制1个LED数码管,依次循环显示09,显示间隔时间为1 s,即可实现一位数的简易秒表。基于LED数码管的简易秒表设计实训图如图7.3.1所示,所用元件清单如表7.3.1所示。,图7.3.1 基于LED数码管的简易秒表设计实训,在上述电路图中,利用单片机的P2口控制一个共阳极LED数码管,向P2口输出相应字型码即可显示数字09。对于共阳极数码管,当连接段控制端的I/O引脚输出低电平时,相应段的发光管点亮。程序代码为:,#includeunsigned char led=0 xc0,0 xf9,0 xa4,0

7、 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/定义数组led存放数字09的字型码void delay1s()/采用定时器1实现1s的延时 unsigned char i;for(i=0;i20;i+)/设置循环次数为20,TH1=0 x3c;/设置定时器初值为3CBOH TL1=0 xb0;TR1=1;/启动定时器T1 while(!TF1);/查询计数是否溢出,即50 ms时间到 则TF1=1 TF1=0;/将溢出标志位TF1清零,void main()/主函数 unsigned char i;TMOD=0 x10;/设置定时器1在工作方式1 while

8、(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依次循环显示数字09。,图7.3.2 添加十六进制文件,7.4 电子广告牌实训利用51单片机控制1个88 LED点阵显示模块,依次循环显示09,显示间隔时间为1 s,实现一位数的简易秒表。电子广告牌实训图如图7.4.1所示,所用元件清单如表7.4.1所示。,图7.

9、4.1 电子广告牌实训图,LED点阵显示是把很多LED按矩阵方式排列在一起,通过对各LED发光与不发光的控制来完成各种字符或图形的显示。88 LED点阵分别由8行和8列来控制。在图7.3.1中,用单片机的P1口控制点阵屏的8行,用P0口控制点阵屏的8列。,实际应用中,P0口用于控制列线,需串联一个300 左右的限流电阻。同时,为了提高单片机端口带负载的能力,通常在端口和外接负载之间增加一个缓冲驱动器。图7.4.1中P1口通过74LS245与点阵连接,既保证了点阵的亮度,又能保护单片机的引脚。其程序代码为:,#includevoid delay(unsigned char i)unsigned

10、char k,j;for(k=0;ki;k+)for(j=0;j255;j+);,void delay1ms()/软件实现延时1ms unsigned char i;for(i=0;i0 x10;i+);void main(),unsigned char code led=0 x00,0 x18,0 x24,0 x24,0 x24,0 x24,0 x18,0 x00,/0 0 x08,0 x18,0 x28,0 x08,0 x08,0 x08,0 x3e,0 x00,/1 0 x00,0 x18,0 x24,0 x24,0 x08,0 x10,0 x3c,0 x00,/2 0 x00,0 x1

11、8,0 x24,0 x04,0 x18,0 x04,0 x24,0 x18,/3 0 x00,0 x08,0 x10,0 x28,0 x48,0 x3e,0 x08,0 x00,/4 0 x00,0 x2c,0 x20,0 x28,0 x04,0 x24,0 x18,0 x00,/5 0 x08,0 x10,0 x20,0 x38,0 x24,0 x24,0 x18,0 x00,/6,0 x00,0 x3c,0 x04,0 x08,0 x10,0 x10,0 x10,0 x00,/7 0 x00,0 x18,0 x24,0 x24,0 x18,0 x24,0 x24,0 x18,/8 0 x0

12、0,0 x18,0 x24,0 x24,0 x1c,0 x04,0 x24,0 x18;/9 unsigned char w;unsigned int j,k,l,m;while(1),for(j=0;j10;j+)/字符个数控制变量 for(k=0;k1000;k+)/每个字符扫描1000次,控制每 个字符的显示时间 w=0 x01;/行变量指向第一行 l=j*8;for(m=0;m8;m+),P1=0 x00;/关闭行,防止出现显示残留 P0=ledl;/列数据取反后值送至P0口 P1=w;/打开行 delay1ms();w=1;/逐行扫描,l+;/指向数组中下一个显示码,在KEIL软件中

13、输入上述代码,编译后产生十六进制文件7-4-1.hex,双击AT89C51,将弹出如图7.4.2所示的对话框。在图7.4.2中添加十六进制文件7-4-1.hex,点击“OK”即可。最后进行仿真,可实现每隔1 s依次循环显示09。,图7.4.2 添加十六进制文件,如果要在88点阵上显示的图形如图7.4.3所示,程序该如何修改?请读者自行实现此功能。,图7.4.3 显示汉字字符,7.5 数码管动态显示实训本节利用数码管动态显示自己的生日(修定生日为1980年7月8日),实训图如图7.5.1所示,所用元件清单如表7.5.1所示。,图7.5.1 数码管动态显示实训,在上述电路图中,六位数码管的位选端由

14、P2.0P2.5控制,段选端由P1口控制,P1口通过74LS245与数码管的段选端连接,既能保证数码管的亮度,又能保护单片机引脚。其程序代码为:,#includevoiddelay1ms()unsigned char i;TMOD=0 x20;TH1=6;TL1=6;TR1=1;for(i=0;i4;i+),while(!TF1);TF1=0;void disp()unsigned char led=0 x80,0 xc0,0 xc0,0 xf8,0 xc0,0 x80;unsigned char i,w;,w=0 x01;for(i=0;i6;i+)P2=w;w=1;P1=ledi;dela

15、y1ms();,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 中断扫描

16、方式的矩阵式键盘实训图,44矩阵式键盘的4根行线连接到P0口的低四位,4根列线连接到P0口的高四位。按照矩阵式键盘的扫描方法可知,P0.0P0.3为扫描输入线,P0.4P0.7为键输出线。图7.6.1中的与门用于产生按键中断,其输入端与各行线相连,再通过上拉电阻接至+5V电源,输出端接至外部中断0的输入端P3.2。LED数码管由单片机的P1口控制。,具体工作过程如下:当键盘没有键按下时,与门各输入端均为高电平,与门输出端也保持高电平;当有键被按下时,与门输入端有低电平,相应地与门输出端变为低电平,从而控制P3.2向CPU申请中断,若CPU开放外部中断,则会响应中断请求,转去执行键盘扫描程序并获

17、得对应键值,最终通过LED数码管显示。,其程序代码为:#include#define uchar unsigned char void display(uchar num);void delay10ms();uchar code led=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e;,void main()P1=0 xff;TMOD=0 x10;/T1在工作方式1IE=0 x87;/开中断总允许位和外部中断0允许位IT0=1;/设置外部0中断下降沿触

18、发while(1),P0=0 xef;P0=0 xdf;P0=0 xbf;P0=0 x7f;void display(uchar num)P1=lednum;,voiddelay10ms()TH1=0 xd8;TL1=0 xf0;TR1=1;while(!TF1);TF1=0;,voidinth()interrupt 0/外部中断0uchar temp,key;P0=0 xef;/扫描第一行temp=P0;/P0状态送给变量temptemp=temp/与操作屏蔽低四位if(temp!=0 x0f)/P0高四位有低电位进入,delay10ms();/延时10 mstemp=P0;/P0状态送给变

19、量temptemp=temp/判断后的P0状态送给变量temp switch(temp),case 0 xee:key=0;break;/键值为0的按键按下case 0 xed:key=4;break;/键值为1的按键按下 case 0 xeb:key=8;break;/键值为2的按键按下case 0 xe7:key=12;break;/键值为3的按键按下 while(temp!=0 x0f)/等待按键释放,即P0高四位恢复 高电位,结束循环,temp=P0;temp=temp/显示键值,P0=0 xdf;/扫描第一行temp=P0;/P0状态送给变量temptemp=tempif(temp!

20、=0 x0f),temp=P0;switch(temp)case 0 xde:key=1;break;case 0 xdd:key=5;break;case 0 xdb:key=9;break;case 0 xd7:key=13;break;,while(temp!=0 x0f)/等待按键释放temp=P0;temp=temp/显示键值,P0=0 xbf;/扫描第一行temp=P0;/P0状态送给变量temptemp=temp,temp=temp,while(temp!=0 x0f)/等待按键释放temp=P0;temp=temp/显示键值,P0=0 x7f;/扫描第一行temp=P0;/P0

21、状态送给变量temptemp=tempif(temp!=0 x0f),temp=P0;switch(temp)case 0 x7e:key=3;break;case 0 x7d:key=7;break;case 0 x7b:key=11;break;case 0 x77:key=15;break;,while(temp!=0 x0f)/等待按键释放temp=P0;temp=temp/显示键值,在KEIL软件中输入上述代码,编译后产生十六进制文件7-6-1.hex,双击AT89C51,将弹出如图7.6.2所示的对话框。在图7.6.2中添加十六进制文件7-6-1.hex,点击“OK”即可。最后进行

22、仿真,若按键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个发光二极管

23、只用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方向双向红灯显示。

24、,其程序代码为:#includeunsigned char t0,t1;void delay0_5s()for(t0=0;t010;t0+)TH1=0 x3c;TL1=0 xb0;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=0 xdb;delay_t1(20);,P1=i;t0=j;t1=k;TH1=1;TH0=m;v

25、oid main(),unsigned char k;TMOD=0 x10;EA=1;EX0=1;IT0=1;while(1)P1=0 xf3;delay_t1(10);for(k=0;k3;k+),P1=0 xf3;delay0_5s();P1=0 xfb;delay0_5s();P1=0 xeb;delay_t1(4);P1=0 xde;delay_t1(10);for(k=0;k3;k+),P1=0 xde;delay0_5s();P1=0 xdf;delay0_5s();P1=0 xdd;delay_t1(4);,在KEIL软件中输入上述代码,编译后产生十六进制文件7-7-1.hex,

26、双击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

27、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=0 xff;do,RS=

28、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(0 x38);w_cmd(0 x0f);w_cmd(0 x06);w_cmd(0 x01);void w_string(uint8 addr_start,uint8*p)/显示字符,w_cmd(addr

29、_start);while(*p!=0)w_dat(*p+);delay();main(),Init_LCD1602();w_string(0 x80,word1);w_string(0 xc0,word2);w_cmd(0 x0c);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 添加十六进制文件

30、,7.9 A/D转换接口技术实训采用TI公司生产的A/D转换芯片TLC2543采集05V连续可变的模拟电压信号,并将其转变为12位数字信号,送至51单片机进行处理,在四位数码管上显示出对应的数字信号。05 V的模拟电压信号可通过调节电位器获得。A/D转换接口技术实训图如图7.9.1所示,所用元件清单如表7.9.1所示。,图7.9.1 A/D转换接口技术实训图,在上述电路图中,05 V模拟电压信号可通过调节电位器获得,并被送至A/D芯片TLC2543的AIN0通道。数据输出端SDO、串行数据输入端SDI、片选端和输入/输出时钟CLK分别与51单片机的P1.0P1.3相连。四位数码管选用共阳极数码

31、管,位选端由单片机的P3.0P3.3控制,段码端由单片机的P2.0P2.7控制,采用动态扫描法显示。,其程序代码为:#include#include#include#define uchar unsigned char#define uint unsigned intsbit AD_CLOCK=P13;/TLC2543控制位的宏定义sbit AD_IN=P11;sbit AD_OUT=P10;,sbit AD_CS=P12;uchar table10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/共阳极数码管段码sta

32、tic const uchar ad_channel_select=0 x08,0 x18,0 x28,0 x38,0 x48,0 x58,0 x68,0 x78,0 x88,0 x98,0 xa8;/通道010均为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;

33、AD_CS=0;for(i=0;i12;i+),if(dout,AD_CS=1;for(j=0;j100;j+);/延时大于1us return(din);void display(uint num)/AD输出12位数字信号,数码管显示程序,uint a;P3=0 x08;P2=tablenum/1000;for(a=0;a1000;a+);P3=0 x04;P2=table(num%1000)/100;for(a=0;a1000;a+);P3=0 x02;,P2=table(num%1000)%100)/10;for(a=0;a1000;a+);P3=0 x01;P2=table(num%1

34、000)%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),即十进制为409

35、5;若模拟电压为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、片选端和

36、串行输入端DIN分别与单片机的P3.0P3.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=xvoid

37、 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所示

38、。,图7.10.2 添加十六进制文件,图7.10.3 锯齿波波形小提示,7.11 双机通信技术实训本实训通过51单片机建立一套简单的单片机串行口双机通信测试系统,发射和接收各用一套AT89C51单片机电路,分别称为甲机和乙机,将单片机甲机中存放的数据(例如617528)发送给乙机,并在乙机的6个数码管上显示出来。双机通信技术实训图如图7.11.1所示,所用元件清单如表7.11.1所示。,图7.11.1 双机通信技术实训图,在上述电路图中,乙机的六个数码管采用动态连接方式,各位共阳极数码管相应的段选控制端并联在一起,由P1口控制,由同相三态缓冲器/线驱动器74LS245驱动,各位数码管的位选端由

39、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=0 x20;/定时器1工作于方式2 TL1=0 xf4;/波特率为2400 b/s TH1=0 xf4;TR1=1;SCON=0 x40;/定义串行口工作于方式1 for

40、(i=0;i6;i+),SBUF=sendi;/发送第i个数据 while(TI=0);/查询等待发送是否完成 TI=0;/发送完成,TI由软件清0 while(1);,(2)乙机接收数据的程序代码:#include code unsigned char tab=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/定义09显示字型码unsigned char buffer=0 x00,0 x00,0 x00,0 x00,0 x00,0 x00;/定义接收数据缓冲区void disp(void);/显示函数声明void mai

41、n()/主函数,unsigned char i;TMOD=0 x20;/定时器1工作于方式2 TL1=0 xf4;/波特率定义 TH1=0 xf4;TR1=1;SCON=0 x40;/定义串行口工作于方式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=0 x01;/位码赋初值 for(i=0;i6;i+),P2=w;w5;j-);/显示延时,在KEI

42、L软件中输入上述发送和接收代码,编译后产生十六进制文件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 Hz99

43、99 Hz,误差在20 Hz以内。(2)用四位数码管显示测量值。(3)可测量方波、三角波及正弦波等多种波形。,2.设计过程本数字频率计采用单片机的定时器T0,工作于计数状态,P2口控制四位数码管段码显示,P0口控制四位数码管位码,其实训图如图7.12.1所示,所用元件清单如表7.12.1所示。,图7.12.1 数字频率计课程设计实训图,在上述电路图中,单刀三掷开关可选择正弦波、矩形波、三角波外部输入信号,74HC14为带施密特整形功能的非门,可将正弦波、三角波信号整形为矩形波信号,输入到AT89C51的P3.4作为计数脉冲输入端,P2.0P2.7控制四位数码管段码ADP,P0.0P0.3控制四

44、位数码管位码。,其程序代码为:#include/头文件#include/头文件#define uchar unsigned char/宏定义#define uint unsigned int/宏定义sfr16 DPTR=0 x82;/定义DPTRbit status_F=1;/状态标志位uint aa,qian,bai,shi,ge,bb,wan,shiwan;/定义变量uchar cout;,unsigned long temp;/定义长整型变量uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x

45、6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;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=0 xFF;/初始化P0口init();/调用定时器,计数器初始化while(1)if(aa=19)/定时20*50ms=1s,aa=0;/定时完成一次后清0status_F=1;/完成计数 TR1=0;/关闭T1定时器,定

46、时1 s完成delay(46);/延时校正误差TR0=0;/关闭T0DPL=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=0 x15;/T0为定时器

47、工作于方式1,T1为计数器工作于方式1TH1=0 x3c;/定时器赋高8初值,12 MHz晶振,TL1=0 xb0;/定时器赋低8初值,12 MHz晶振TR1=1;/开定时器1TH0=0;/计数器赋高8初值TL0=0;/计数器赋低8初值TR0=1;/开计数器0void display(uint qian,uint bai,uint shi,uint ge)/显示子函数,P0=0 xf7;/P0口是位选端P2=tableqian;/显示千位delay(3);P0=0 xfb;/P0口是位选端P2=tablebai;/显示百位delay(3);P0=0 xfd;/P0口是位选端P2=tablesh

48、i;/显示十位,delay(3);P0=0 xfe;/P0口是位选端P2=tablege;/显示个位delay(3);void xtimer1()interrupt 3/定时中断子函数,TH1=0 x3c;/定时器赋高8初值TL1=0 xb0;/定时器赋低8初值aa+;void xtimer0()interrupt 1/计数器中断子函数,cout+;void delay(uint z)/延时子函数,延时1 msuint i,j;for(i=0;iz;i+)for(j=0;j110;j+);,在KEIL软件中输入上述代码,编译后产生十六进制文件7-12-1.hex,双击AT89C51,将弹出如图

49、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.

50、2 波形发生器1.设计题目利用51单片机设计一个简易波形发生器,要求如下:(1)可输出锯齿波、三角波、方波和正弦波四种波形;(2)上述四种波形分别由开关S0S3进行切换;(3)可由程序控制各种波形的频率及幅值。,2.设计过程本波形发生器采用AT89C51单片机实现,采用程序设计方法编程实现锯齿波、三角波、方波和正弦波四种波形,再通过D/A转化器DAC0832将数字信号转换成模拟信号,最后经过运算放大器放大,由示波器显示所需要的波形,各种波形频率及幅值可由程序控制。其实训图如图7.12.6所示,所用元件清单如表7.12.2所示。,图7.12.6 波形发生器课程设计实训图,在上述电路图中,开关S0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号