单片机原理及应用实验_第1页
单片机原理及应用实验_第2页
单片机原理及应用实验_第3页
单片机原理及应用实验_第4页
单片机原理及应用实验_第5页
已阅读5页,还剩15页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

19/19北京航空航天大学单片机实验51

实验一单片机开发环境以及I/O使用实验1、#include<AT89X52.H>//89S52寄存器定义头文件/*延时子程序(有参函数),t=n*10ms*/voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++) for(k=0;k<237;k++);}/*主函数*/voidmain(){while(1){P1_0=0;//P1.0赋值为0,LED灭delay(100);//调用延时子程序,t=100*10msP1_0=1;//P1.0赋值为1,LED亮delay(100);}}2、#include<AT89X52.H>//89S52寄存器定义头文件voidmain(){while(1){P0=0xff;//对端口写"1",作为高阻抗输入端用if(P0_0)//判断P0.0是否为高电平 {P1_0=0;}else//如果P0.0不是高电平,则执行后面的语句 {P1_0=1;}}}3、#include<AT89X52.H>//89S52寄存器定义头文件/*延时子程序(有参函数),t=n*10ms*/#defineK1P0_0#defineK2P0_1#defineL1P1_0#defineL2P1_1#defineL3P1_2#defineL4P1_3#defineL5P1_4#defineL6P1_5#defineL7P1_6#defineL8P1_7voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++) for(k=0;k<237;k++);}/*******正循环******/voidway1(){ while(K1==0&&K2==0) { staticunsignedcharposition=0;P1=1<<position;if(++position>=8)position=0; delay(100); } }/*******逆循环******/voidway2(){ while(K1==0&&K2==1) { staticunsignedcharposition=0;P1=128>>position;if(++position>=8)position=0; delay(100); } }/*******交替闪烁******/voidway3(){ while(K1==1&&K2==0) { P1=0X55; delay(100); P1=0xAA; delay(100); } }/******全亮全灭******/voidway4(){ while(K1==1&&K2==1) { P1=0x00; delay(100); P1=0xff; delay(100); } }/*主函数*/voidmain(){while(1){ way1(); way2(); way3(); way4();}}实验感想:因为这学期已经在测控实验中接触了单片机,课下也重新熟悉了c语言以及汇编语言。所以总体来说这次试验并不很难。试验的程序可以直接根据开发板的一些范例直接修改,总体来说非常简单但是试验中也出现了问题,最后发现是接线的错误。实验二单片机中断及定时器使用实验1、#include<AT89X52.H>//89S52寄存器定义头文件unsignedcharSTATE;unsignedchars0;/*延时子程序(有参函数),t=n*10ms*/voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);}voidmain(){EA=1;//CPU开中断EX0=1;//开外部中断0IT0=1;//边沿触发方式s0=0x01;while(1){if(!STATE)//如果标志位STATE为0,则做流水灯{P1=s0;s0=s0<<1;if(s0==0x00)s0=0x01;delay(30); }else//如果标志位STATE为1,则LED全亮 {STATE=0;P1=0xff;delay(100); }}}/*中断服务函数*/voidint0()interrupt0{STATE=1;//标志位STATE置1}2、#include<AT89X52.H>//89S52寄存器定义头文件inttime;voidmain(){TMOD=0x01;//定时器0工作方式1TH0=64614/256;//计算初值TL0=64614%256;EA=1;//CPU开中断ET0=1;//开定时器中断0TR0=1;//开启定时器0并开始工作while(1);//等待中断}/*定时器0中断服务函数*/voidtime0()interrupt1{time++;//每1ms,time加1if(time==500)//time加满500次后,0.5s时间到{time=0;//time清零,重新计数P1++;}TH0=64614/256;//重新装载定时器初值TL0=64614%256;}3、#include<regx51.h>unsignedcharSTATE;unsignedchars0;/*延时子程序(有参函数),t=n*10ms*/voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);}voidmain(){EA=1;//CPU开中断EX0=1;//开外部中断0IT0=1;//边沿触发方式s0=0x01;while(1){if(!STATE)//如果标志位STATE为0,则做流水灯{P1=s0;s0=s0<<1;if(s0==0x00)s0=0x01;delay(30);}else//如果标志位STATE为1,则LED全亮{STATE=0;3P1=0xff;delay(100);}}}/*中断服务函数*/voidint0()interrupt0{STATE=1;}//标志位STATE置1实验感想:这次是用新板子做的试验,总的来说没有什么太大的区别而且连线的时候也相对简单。但是这次程序在修改过程中出现了一个严重的问题,计算错了led灯所对应的16进制数,导致试验结果出不来,浪费不少时间。终端对于单片机来说意义十分重要,单片机在执行程序时如果想要跳出程序执行另一段程序,完后再回到原来的程序就需要终端。51单片机配合中断管理芯片便可实现更多功能。实验三单片机串口使用实验串口中断串口中断接收数据显示数据高电平发送数据YN1、#include<AT89X52.h>#defineucharunsignedchar//变量类型定义ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//七段码0--70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//七段码8--f,最后一码0x00作用为熄灭数码管ucharsegment[6];//段选ucharbyte[6];//位选ucharplay[6]={0,0,0,0,0,0};//要显示的数字uchark;uchard;voidDisplay_Init();//数码管显示初始化voidUart_Init();//串口初始化voidDisplay();//数码管显示函数/*数码管显示初始化*/voidDisplay_Init()//初始化,通过定时器,按固定频率扫描数码管{TMOD=TMOD|0x01;//定时器0,工作方式1TH0=0xfc;//计算初值,定时时间为1msTL0=0x66;EA=1;//CPU开中断ET0=1;//开定时器中断0TR0=1;//开启定时器0并开始工作}/*串口初始化*/voidUart_Init(){TMOD=TMOD|0x20;//定时器1,工作方式2TH1=0xfd;//波特率为9600TL1=0xfd;SCON=0x50;//设置定时器工作方式PCON=0;EA=1;//CPU开中断ES=1;//允许串口中断TR1=1;//定时器1开始工作}/*扫描数码管数据显示函数*/voidDisplay(){ ucharn=0; ucharm=0x01;for(n=0;n<6;n++){ if(play[n]>0x0f) segment[n]=0x10;//显示的数据大于0x0f,则该位熄灭 else segment[n]=play[n]; byte[n]=m; m=m<<1;}}/*主函数*/voidmain(void){Uart_Init();Display_Init();play[0]=0x00;play[1]=0x00;play[2]=0xff;play[3]=0xff;play[4]=0xff;play[5]=0xff;while(1){ Display();}}/*定时器0中断服务函数*/voidtime0()interrupt1{P1=table[segment[k]];P2=byte[k];k++;if(k==6)k=0;TH0=0xfc;//重新装载初值TL0=0x66;}voiduart()interrupt4{if(RI)//接收标志位{d=SBUF;//读取串口发来的数据play[1]=d/0x10;play[0]=d%0x10;RI=0;//清除接收标志位}}2、//头文件#include<reg52.h>#include<absacc.h> //储存器分配宏定义#defineDATXBYTE[0x1B30]//数据口地址#defineCOMXBYTE[0x1B31]//命令/状态口地址#defineucharunsignedchar//变量类型定义ucharcodetable1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//七段码0--70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//七段码8--fucharcodetable2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,//0--7的ASCII码0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//8--9,A--F的ASCII码voidInit8279(void);//初始化8279voidInitUart(void);//初始化串口voidDisplay(ucharaddr,uchara);//数据显示函数voidTransferData(uchara);//串口发送数据函数/*8279初始化函数*/voidInit8279(void) {ucharreg1;COM=0xd1;//11010001B,总清除命令do{reg1=COM;//读状态字,DU=1时,表示清除命令正在执行}while(reg1&0x80);//10000000B,等待清除结束,DU=0,相与为0,清除结束COM=0;//00000000B,设置8279工作方式,8位字符,左端输入//编码键盘扫描,两键封锁COM=0x32;//00110010B,时钟频率18分频 10010B=18D}/*串口初始化函数*/voidInitUart(void){PCON=0x80;//SMOD=1,波特率加倍TMOD=0x20;//定时器1设置在工作方式2TH1=0xfd; //波特率9600*2=19200TL1=0xfd;TR1=1;//启动定时器1SCON=0x50;//串口初始化,串口工作在方式1,8为,REN=1,允许接受}/*串口发送数据函数*/voidTransferData(uchara){ucharrowdata;//行数寄存器ucharlinedata;//列数寄存器a=a&0x3f;//00111111B,屏蔽高两位数//键的编码格式CNTLSHIFT扫描行序号(3位)(硬件的列号),回馈线列信号(3位)(硬件的行号)linedata=a&0x07;//获得列数值,00000111B;rowdata=a&0x38;//获得行数值,00111000B;rowdata=(rowdata>>3);//变量的第三位表示行号与列号if(rowdata==1) //行数为1的代码为0~7,其列数也为0~7{SBUF=table2[linedata];//把0~7的ASCII码发送出去}elseif(rowdata==0) //行数为0的代码为8,9,A~F,其列号为0~7{SBUF=table2[linedata+8]; //把8,9,A~F的ASCII码发送出去}else //行数为2的代码为GMPRWXYS,其列号为0~7{; //不执行操作}while(TI==0);//等待数据发送完毕TI=0;//清除发送完毕中断标志}/*8279数据显示函数*/voidDisplay(ucharaddr,uchara){ucharrowdata;//行数寄存器ucharlinedata;//列数寄存器a=a&0x3f;//00111111B,屏蔽高两位数//键的编码格式CNTLSHIFT扫描行序号(3位)(硬件的列号),回馈线列信号(3位)(硬件的行号)linedata=a&0x07;//获得列数值,00000111B;rowdata=a&0x38;//获得行数值,00111000B;rowdata=(rowdata>>3);//变量的第三位表示行号与列号COM=addr;//向控制口写显示RAM命令,10000101B,AI=0(不自增),写到RAM中16个地址中的addr地址处if(rowdata==1)//行数为1的代码为0~7,其列数也为0~7{ DAT=table1[linedata];//把0~7的字段码写到数据口} elseif(rowdata==0)//行数为0的代码为8,9,a~f,其列号为0~7{DAT=table1[linedata+8];//把8,9,a~f的字段码写到数据口}else//行数为2的代码为GMPRWXYS,其列号为0~7{;//不执行操作}}/*串口接收数据函数*/voidReceiveData()interrupt4//串口中断,有可能是接收中断或发送中断引起的{ucharread_data;uchara=0;if(RI==1)//接收中断{RI=0;//接收中断标志位清零 read_data=SBUF;//接收数据 if((read_data>=0x30)&&(read_data<=0x37))//如果接收到的是0~7的ASCII码,将其转换为键值 { read_data=read_data&0x0f;//将ASCII码转换为0~7的数字,其列码为0~7,行码为1 a=0x01; a=(a<<3); a=a+read_data;//a为0~7数字的键值 Display(0x83,a);//数码管第三位显示接收到的数据 } elseif((read_data>=0x38)&&(read_data<=0x39))//如果接收到的是0~7的ASCII码,将其转换为键值 { read_data=read_data&0x0f;//将ASCII码转换为8~9的数字,其列码为0~1,行码为0 a=read_data-8; //a为8~9数字的键值 Display(0x83,a); //数码管第三位显示接收到的数据 } elseif((read_data>=0x41)&&(read_data<=0x46)) //如果接收到的是A~F的ASCII码,将其转换为键值 { read_data=read_data&0x0f;//将ASCII码转换为A~F的数字,其列码为2~7,行码为0 a=read_data+1; //a为A~F数字的键值 Display(0x83,a); //数码管第三位显示接收到的数据 } else //其余ASCII码 { ; //不执行操作 }}elseTI=0;//发送中断}/*键盘中断服务程序*/voidKeyIn()interrupt0{ucharkeydata;//定义键盘数据寄存器COM=0x40;//01000000B,读FIFORAM命令,AI=0,从堆栈顶读键值keydata=DAT;//读取键盘数据Display(0x85,keydata);//调用显示函数,在数码管上显示键盘输入数据TransferData(keydata);//调用串口发送函数,在PC机上显示键盘输入数据}/*主函数*/voidmain(void){Init8279();//初始化8279InitUart();//初始化串口IT0=1;//外部中断0下降沿触发EX0=1;//开外部中断0EA=1;//打开中断总开关ES=1;//开串口中断while(1){;//轮询方式,等待键盘按键产生的中断信号}}实验感想:通过实验,了解了对单片机串行口通讯程序的编制、实现串行通讯的硬件环境、数据格式及数据交换的协议。了解了PC机通讯的基本要求。在实验过程中由于要求的波特率与实际实验要求的波特率不同,因此需要适当修改分频数。而且,实验过程中,输入的1与7在软件中均显示7,但是若是通过软件向单片机发送数据则不会出现这种情况,通过老师检查是实验板的问题,是8279的引脚与键盘的引脚接触出现问题。同时由于实验中YXWRPMG几个键盘键在实验中不要求显示,因此需要通过编程对他们进行屏蔽。通过查这几个键盘引脚的地址,编程中实现不读取相应地址的键值完成屏蔽的操作。在实验中还可以使用串口调试助手设置串口号、通讯波特率、校验位、数据位以及停止位等通讯数据格式。界面中大的空白区为接收到的数据显示区,可以修改数据的显示格式,如十六进制,默认格式为ASCII码格式。界面中小的空白区发送数据区,在这里可以输入需要发送的数据,同样可以修改发送数据的格式。实验四单片机扩展模数转换器实验定时器定时器0初始化外部中断初始化设置模拟量输入通道0开始串口初始化任意输入开始A/D转换每秒取一个数字量并D/A转换中断入口读取转换结果并显示开始下次转换中断返回1、#include<reg52.h>#include<intrins.h>#include<absacc.h>charack;sbitSDA=P2^1;sbitSCL=P2^0;#define_Nop()_nop_()//定义空指令#defineAddWr0x90;#defineAddRd0x91;//////////////////////////////////////voidStart_I2c(){SDA=1;//发送起始条件的数据信号_Nop();SCL=1;_Nop();//起始条件建立时间大于4.7us,延时_Nop();_Nop();_Nop();_Nop();SDA=0;//发送起始信号_Nop();//起始条件锁定时间大于4μ_Nop();_Nop();_Nop();_Nop();SCL=0;//钳住I2C总线,准备发送或接收数据_Nop();_Nop();}/////////////////////////////////////voidStop_I2c(){SDA=0;//发送结束条件的数据信号_Nop();//发送结束条件的时钟信号SCL=1;//结束条件建立时间大于4μ_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;//发送I2C总线结束信号_Nop();_Nop();_Nop();_Nop();}//////////////////////////////////////////voidSendByte(unsignedcharc){unsignedcharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位{if((c<<BitCnt)&0x80) SDA=1;//判断发送位elseSDA=0;_Nop();SCL=1;//置时钟线为高,通知被控器开始接收数据位_Nop();_Nop();//保证时钟高电平周期大于4μ_Nop();_Nop();_Nop();SCL=0;}_Nop();_Nop();SDA=1;//8位发送完后释放数据线,准备接收应答位_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;_Nop();_Nop();}////////////////////////////////////////////unsignedcharRcvByte(){unsignedcharretc;unsignedcharBitCnt;retc=0;SDA=1;//置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){

温馨提示

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

评论

0/150

提交评论