实验.docx
- 文档编号:3750282
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:40
- 大小:1.15MB
实验.docx
《实验.docx》由会员分享,可在线阅读,更多相关《实验.docx(40页珍藏版)》请在冰豆网上搜索。
实验
实验项目一输入/输出端口的基本应用
1.实验目的
2.⑴了解MCS-51单片机的输入/输出端口的基本工作原理与使用方法;
⑵掌握MCS-51单片机的延时函数的时间估算方法。
2.实验内容
实现与单片机某一端口相连的发光二极管的闪烁控制,要点亮0.2s,熄灭0.2s;
3.实验电路框图
4.实验任务分析
⑴硬件电路说明
设置AT89C51的震荡频率为6MHZ,它的机器周期为2us,发光二极管接在P1.0端口,当P1.0端口上为低电平则led亮,否则为灭。
⑵软件设计说明
用三个FOR循环来延时,通过延时函数来延迟灯亮灭的时间。
5.实验流程框图
6.实验过程记录
⑴实验过程
⑵问题及解决方法
如何表示P1.0,如何延时0.2s,怎样才能让函数永远循环?
解决方法:
用sbitP1_0=P1^0表示P1.0。
用三个FOR循环用来延时。
用while
(1),循环条件永远为真,以下程序永远运行下去。
7.实验总结
⑴#defineucharunsignedchar
#defineuintunsignedchar可以简便。
⑵延时函数可以用用三个FOR循环加空语句。
8.成绩评定
附录实验源程序
/****预处理部分****/
#include
#defineucharunsignedchar
#defineuintunsignedchar
/****变量的定义****/
sbitP1_0=P1^0;
/****子函数部分****/
voiddelay_ms(intx)
{
uchari,j,k;//定义三个无符号字符型变量
for(i=0;i for(j=2;j>0;j--) for(k=248;k>0;k--); } /****主函数部分****/ voidmain(void) { while (1) { P1_0=1;//P1口输出高电平,让LED点暗 delay_ms(200);//延迟200MS P1_0=0;//P1口输出低电平,让LED点亮 delay_ms(200);//延迟200MS } } /****中断函数部分****/ 实验项目二定时/计算器的基本应用 1.实验目的 ⑴掌握MCS-51定时/计数器的基本工作原理与使用方法; ⑵了解MCS-51单片机的中断服务程序的基本设计方法。 2.实验内容 用定时器T0实现与P1.0端口相连的发光二极管以1Hz的频率闪烁用定时器T1实现与P1.1端口相连的发光二极管以2Hz的频率闪烁。 3.实验电路框图 4.实验任务分析 ⑴硬件电路说明 设置系统的时钟频率为12MHZ,利用定时/器计数器T0编程实现。 将两个LED分别接在P1.0,P1.1上。 ⑵软件设计说明 从P1.0输出周期为1s的方波,只需P1.0每隔0.5s取反一次,从P1.1输出周期为2s的方波,只需P1.0每隔1s取反一次。 当系统时钟为12MHZ,定时器/计数器T0工作于方式一,最大的定时时间为65536us,TH0=(65536-50000)/256;TL0=(65536-50000)%256;P1.0每循环10次取反一次,P1.1每循环20次取反一次。 5.实验流程框图 6.实验过程记录 ⑴实验过程 ⑵问题及解决方法 系统只能循环一次,不能反复循环。 解决方法: 将num1,num2赋予原值 7.实验总结 ⑴学会了用查询方式来定时。 当计数溢出时,TF0为1; ⑵学会用TH0=(65536-50000)/256;TL0=(65536-50000)%256; 来确定初值的第四位,高四位。 (3)学会了定时器/计数器的初始化。 ①确定工作方式,对TMOD赋值。 ②计算定时或计数的初值,将初值写入TH0,TL0或TH1,TL1。 ③根据需要开启定时器/计数器中断,对IE寄存器赋值。 ④启动定时器/计数器工作,将TR0或TR1置“1”。 8.成绩评定 附录实验源程序 /**********预处理部分**********/ #include #defineucharunsignedchar #defineuintunsignedint /**********变量定义部分**********/ sbitled1=P1^0;sbitled2=P1^1; /**********子函数部分**********/ voidtimer0_init() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; } /**********主函数部分**********/ voidmain(void) { ucharnum1=0,num2=0; timer0_init(); while (1) {do{} while(! TF0); num1++;num2++; TH0=(65536-50000)/256; TL0=(65536-50000)%256;TF0=0; if(num1>=10) { led1=! led1; num1=0; } if(num2>=20) { led2=! led2; num2=0; } } } /**********中断函数部分**********/ 实验项目三中断系统的基本应用 1.实验目的 ⑴掌握MCS-51中断系统的基本工作原理与使用方法; ⑵掌握MCS-51单片机的中断服务程序的基本设计方法。 2.实验内容 基本部分: 在P2端口接8个LED灯,用定时器T0,采用中断方式,每隔1s使点亮的LED增加1个;当8个LED全部点亮后,重新开始下一个循环。 提高部分: 在P3.2端口接一个按键开关,由它来控制以上LED的循环点亮,要求也采用中断控制方式。 3.实验电路框图 4.实验任务分析 ⑴硬件电路说明 在P2端口接8个LED灯,用定时器T0,采用中断方式,系统的震荡周期为12MHz,它的机器周期为1us. ⑵软件设计说明每隔1s使点亮的LED增加1个;当8个LED全部点亮后,重新开始下一个循环。 当系统时钟为12MHZ,定时器/计数器T0工作于方式一,最大的定时时间为65536us,TL0=(65536-50000)%256;TH0=(65536-10000)/256;一经过100次中断,P2向左移动个0; 5.实验流程框图 6.实验过程记录 ⑴实验过程 ⑵问题及解决方法 系统一开始只有一个循环,一个循环结束后不能回到起点。 解决方法: if(P2==0x00){P2=0x7f;}使得系统重新从第一个灯开始循环点亮。 7.实验总结 ⑴学会用中断函数来计时。 (2)学会用依次向左移0来循环点亮小灯 8.成绩评定 附录实验源程序 /*******预处理部分**********/ #include #defineucharunsignedchar #defineuintunsignedint /**********变量定义部分**********/ ucharnum1; /**********子函数部分**********/ void_init_timer0() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1; } /**********主函数部分**********/ voidmain(void) { init_timer0(); P2=0xff; while (1) { if(P2==0x00) { P2=0x7f; } if(num1==100) { num1=0; P2=P2<<1; } } } /**********中断函数部分**********/ voidint_timer0(void)interrupt1 { num1++; TH0=(65536-10000)/256; TL0=(65536-10000)%256; } 实验项目四LED数码管的基本应用 1.实验目的 ⑴了解LED数码管的基本工作原理与使用范围; ⑵掌握LED数码管静态显示程序的基本设计方法; ⑶掌握LED数码管动态显示程序的基本设计方法; 2.实验内容 基本部分: 用LED数码管设计一个0—99秒的计数器,LED的显示方式可以采用静态显示方式实现; 提高部分: 用LED数码管设计一个0—99.99秒的计数器,LED的显示方式采用动态显示方式实现。 3.实验电路框图 4.实验任务分析 ⑴硬件电路说明 ⑵软件设计说明 5.实验流程框图 6.实验过程记录 ⑴实验过程 ⑵问题及解决方法 怎么实现0—99依次增加? 将各位十位用延迟函数分开显示。 7.实验总结 ⑴知道了P0=0xff;P2=0x00;是消影,使显示更加清楚。 ⑵用switc(i&0x01)case语句来控制AT89C51的P2^0,P2^1是输出高电平还是低电平。 8.成绩评定 附录实验源程序 /****预处理部分****/ #include /****变量定义****/ unsignedchari,second; unsignedseg_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /****子函数部分****/ voidtimer0_init() { TMOD=0x01; TH0=(65536-2000)/256; TL0=(65536-2000)%256; ET0=1; EA=1; TR0=1; } /****主函数部分****/ voidmain(void) { timer0_init(); second=00; while (1) { switch(i&0x01) { case0: { P0=0xff;P2=0x00; P0=seg_table[second%10];P2=0x02;}break; case1: { P0=0xff;P2=0x00; P0=seg_table[second/10];P2=0x01;}break; default: break; } } } /****中断函数****/ voidtimer0_int()interrupt1 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; i++; if(i==250) second++; if(second==100) second=0; } 实验项目五单片机键盘的基本应用 1.实验目的 ⑴了解独立式键盘的基本工作原理与使用范围; ⑵掌握独立式键盘的识别方法、软件消抖的原理; ⑶掌握独立式键盘程序的基本设计方法。 2.实验内容 基本部分: 在MCS-51的P3.2管脚接一独立按键,再P1端口接8个LED,要求用按键来控制LED的循环点亮; 提高部分: 将基本部分中LED的点亮方式改为闪烁。 3.实验电路框图 4.实验任务分析 ⑴硬件电路说明 让8盏LED灯分别接在AT89C51的P1端口。 P3.2接按键。 ⑵软件设计说明 软件主要包括延时函数,移动函数,和一个主函数。 移动函数用位运算,实行灯的循环移动。 5.实验流程框图 6.实验过程记录 ⑴实验过程 ⑵问题及解决方法 不知道怎么样才能让灯闪烁? 在主函数里加上一个P1端口为高电平。 怎样让灯依次向左移动? a=temp< b=temp>>(8-count); P1=a|b; 怎么让按键锁定? Button=0. 实验总结 ⑴软件消影的原理: P1=0xff. ⑵确认按键按下的步骤: (1)初次判断是否按下键盘。 (2)延时函数。 (3)再次判断是否按下键盘。 8.成绩评定 附录实验源程序 /****预处理部分****/ #include /****变量定义****/ sbitbutton=P3^2;//定义按键的输入端 unsignedcharcount;//按键计数,每按一下,count加1 unsignedchartemp; unsignedchara,b; /****子函数部分****/ voiddelay10ms(void)//延迟程序 { unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } key()//按键判断程序 { if(button==0//判断是否按下键盘) { delay10ms();//延迟,软件去干扰 if(button==0)//确定按键按下 {count++;//按键计数加1 if(count==8)//计8次重新开始 {count=0;//将count清零 } }while(button==0);//按键锁定,每按一下count只加1 } } move()//led向左移动移动函数 {a=temp< b=temp>>(8-count); P1=a|b;} /****主函数部分****/ main() {count=0; temp=0xfe; P1=0xff; P1=temp; while (1)//永远循环,扫描判断按键是否按下 {key();//调用按键识别函数 move();//调用led移动函数 P1=0xff;} } /****中断函数部分****/ 实验项目六单片机串口通讯实验 1.实验目的 ⑴了解MCS-51单片机串口的基本工作原理与使用范围; ⑵掌握MCS-51单片机串口通讯程序的基本设计方法。 2.实验内容 基本部分: 在PROTEUS软件中采用串口虚拟终端,编写一个发送程序,将自己的学号发送到虚拟终端显示; 提高部分: 在单片机甲的P1口接8个开关,再单片机乙的P1口接8个LED,编写程序,将单片机甲的开关状态再单片机乙上显示出来。 3.实验电路框图 基本部分 提高部分 4.实验任务分析 ⑴硬件电路说明 基本实验: AT89C51的振荡频率为6MHZ,P3.0/RX0与串口检测工具的TX0相连,P3.0/TX0与串口检测工具的RX0相连。 提高部分: 单片机甲发送机,它的P1端口接8个开关;单片机乙接受机,它的P1端口接8个LED。 单片机甲的开关闭合为低电平,不闭合为高电平。 将单片机甲P3.0/TX0与单片机已P3.0/RX0相连。 ⑵软件设计说明 设置串口方式一,SCON=0x40;PCON=0x00;设置计数器方式二,TMOD=0x20;设置波特率为1200,TH1=0xf3;TL1=0xf3;启动定时器TR1=1。 5.实验流程框图 6.实验过程记录 ⑴实验过程 基本部分 提高部分 ⑵问题及解决方法 1.起先输不出学号,是连串的乱码。 解决方法: 89C51的频率没有匹配,要设定为6兆。 7.实验总结 ⑴要进行串口初始化,并且要设定好串行口的工作方式。 ⑵ 8.成绩评定 附录实验源程序 #include voidmain() { unsignedchara[]={"201005014102"}; unsignedinti; SCON=0x40; PCON=0x00; TMOD=0x20; TH1=0xf3; TL1=0xf3; TR1=1; while (1) { for(i=0;i<12;i++) { SBUF=a[i]; while(! TI){;} TI=0;} } } 提高部分发射 #include voidmain() { SCON=0X40; PCON=0X00; TMOD=0X20; TH1=0XF3; TL1=0XF3; TR1=1; while (1) { SBUF=P1; do{;}while(! TI); TI=0;} } 接收 #include #defineucharunsignedchar voidmain() { //unsignedinti; SCON=0X50; PCON=0X00; TMOD=0X20; TH1=0XF3; TL1=0XF3; TR1=1; while (1) { do{;}while(! RI); RI=0; P1=SBUF;} } 实验项目七ADC0808的基本应用 1.实验目的 ⑴了解ADC0808基本工作原理与使用方法; ⑵掌握MCS-51单片机ADC程序的基本设计方法。 2.实验内容 基本部分: 利用AT89C51和ADC0808设计一个简单的数字电压表,测量范围0-4.99V,采用3位LED数码管将采样后的结果进行显示; 提高部分: 将数字电压表的测量范围改为0-9.99V; 将基本部分的单通道数字电压表设计成一个8通道的数字电压表。 3.实验电路框图 4.实验任务分析 ⑴硬件电路说明 Adc0808的A,B,C接地选通0通道,在0通道上外接0~5v变化的电源,adc808的输出端口与at89c51的P1端口相连,P2端口作为控制端口,P0端口与显示译码管相连。 ⑵软件设计说明 软件组要由显示函数,中断函数,主函数构成。 5.实验流程框图 6.实验过程记录 ⑴实验过程 ⑵问题及解决方法 怎样将将二进制转换成十进制? 将P0=n/5.1*10; 7.实验总结 ⑴用switch来选择显示百,十,个。 ⑵学会用adc808来进行ad转换。 8.成绩评定 附录实验源程序 /*****预处理部分*****/ #include #defineucharunsignedchar /*****变量定义*****/ sbitST_abc0808=P3^6; sbitOE_abc0808=P3^5; sbitEOC_abc0808=P3^2; sbitALE=P3^7; unsignedinta1,a2,a3,n,i; unsignedcharcodetable0[]={0x40,0x79,0x24,0x30, 0x19,0x12,0x02,0x78,0x00,0x10}; //数码管编码,小数点点亮 unsignedcharcodetable1[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管编码,小数点不点亮 /***子函数***/ voidtime0_init() { TMOD=0x01;//设置定时器0为为工作方式1(00000001) TH0=(65534-2000)/256;//设置初值 TL0=(65534-2000)%256; EA=1;//开启中断 ET0=1;//开启定时器0中断 TR0=1;//开启定时器 } voiddisplay()//显示函数 { a1=n/100;//百位 a2=(n%100)/10;//十位 a3=n%10;//个位 switch(i%3) { case0: {P0=0Xff;P2=0X01;P0=table0[a1];}break; case1: {P0=0Xff;P2=0X02;P0=table1[a2];}break; case2: {P0=0Xff;P2=0X04;P0=table1[a3];}break; default: break; } } /***主函数***/ voidmain() { time0_init(); while (1) { ST_abc0808=0;//开始转换 ST_abc0808=1; ALE=1; time0_init(); ST_abc0808=0; while(! EOC_abc0808){;}//等待转换结束 OE_abc0808=1; n=P1/5.1*10;//二进制转换成十进制 display(); OE_abc0808=0; } } /****中断函数***/ voidtime0_int(void)interrupt1 { TH0=(65534-2000)/256;//重装初值 TL0=(65534-2000)%256; i++; } 实验项目八基于AT89C51的简单电子万年历 1.实验目的 ⑴了解电子万年历的基本工作原理与使用方法; ⑵掌握AT89C51设计电子万年历的基本方法。 2.实验内容 基本部分: 利用AT89C51和7段LED数码管设计一个简单的电子万年历,能显示时间、星期、年、月、日,并能进行设置; 提高部分: 将电子万年历增加一个闹钟功能; 当设定的闹钟时间到时,让单片机演奏一段音乐。 3.实验电路框图 4.实验任务分析 ⑴硬件电路说明 DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信,实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息。 DS1302与单片机之间采用同步串行的方式进行通信仅需要用到三个口线 (1)RES(复位), (2)I/O(数据线),(3)SCLK(串行时钟). ⑵软件设计说明 构建数组ucharsettime[7]={0x50,0x59,0x09,0x28,0x09,0x07,0x08}来设置秒、分、时、日、日期、月、年;设计函数DS1302_Get1302(gettime) 获得当前时间;设计函数Disp_time(gettime)显示当前时间。 实验流程框图 6.实验过程记录
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)