2012年春季单片机实验报告书_第1页
2012年春季单片机实验报告书_第2页
2012年春季单片机实验报告书_第3页
2012年春季单片机实验报告书_第4页
2012年春季单片机实验报告书_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、实验一 I /O口输出实验LED流水灯实验一、 实验电路及连线MCU 模块PB-EDU-011硬件连接表P20D1P21D2P22D3P23D4P24D5P25D6P26D7P27D8+5V+5VGNDGND二、 、实验流程图开 始否是LED输出延时0.2S设置LED点亮初值左移一次是否8#include/加载头文件#include/使用库函数void delay()/定义延时函数unsigned char i,j;for(i=0;i255;i+)for(j=0;j255;j+);main()P2=0xfe;/最低位是低电位,灌电流while(1) P2=_crol_(P2,1);/移位依次点

2、亮delay(); 实验二 定时器实验一、实验电路及连线MCU模块PB-EDU-011P10D1+5V+5VGNDGND硬件连接表二、实验程序流程图 定时中断服务程序 主程序定时中断入口保护现场秒计数值减1重新设置秒计数值计到1S?状态位取反恢复现场中断返回是否开 始置T1工作方式设置时间常数设置初始状态位设置秒计数值中断允许输出状态位等待中断 试验程序如下:#include #include /使用库函数sbit K=P32;/定义void delay(int i)/延时 int j;for(i;i0;i-) for(j=0;j255;j+) ;void init();/void main(

3、void) init();/初始化EA=1;/开总中断while(1) P1=0x00;/全亮 delay(127); P1=0xff;/全灭 delay(127);/持续void init() EA=1;/开总中断 EX0=1; /外部中断0void init0() interrupt 0P1=0xfe;/最低位亮delay(200);while(1) P1=_crol_(P1,1);/带进位循环左移 delay(127); /延时255毫秒 if(K=1)/检测开关状态break;/实验三 单个外部中断实验一、实验电路及连线硬件连接表MCU模块PB-EDU-011P10P17D1D8INT

4、0K1+5V+5VGNDGND二、实验程序流程开 始设置初始状态等待中断中断允许设置中断控制寄存器中断入口流水灯程序中断返回恢复现场保护现场主程序框图 外部子程序框图试验程序如下:#includeunsigned char time;sbit K=P10; void t1_init()TMOD=0X10;/定时器T1方式1定时16位 IE=0x88;/总中断允许定时器T1中断 TH1=0x3c;/装入时间常数 50ms (65536-50000)/256 TL1=0xb0;/(65536-50000)%256TR1=1;/启动定时器 void main()K=1;/P1.0口置高t1_init

5、();/中断初始化 time=0;/设定循环初值while(1); /等待中断void t1_func() interrupt 3/中断函数TH1=0x3c;/装入时间常数 50ms TL1=0xb0;if(time20)/循环20次 达到1000ms time=time+1;else if(time=20)time=0;K=K;/P1.0口取反闪烁 实验四 双单片机通信实验 一、实验电路及连线硬件连接表MCU模块PB-EDU-002PB-EDU-012PB-EDU-011P20P27Com1Com8P00P07L-AL-HP10P13R1-R4P14P17C1-C4P33K1INT0INT+

6、5V+5VGNDGND二、实验流程图开始定时器1初始化串口初始化外部中断初始化主程序显示程序1显示程序2串口接收中断服务程序串口中断入口接收数据清RI保存在R2返回外部中断0服务程序串口中断入口关串口中断串口发送数据开串口中断返回/*试验程序如下*/#include reg51.h#define uchar unsigned char#define uint unsigned int#define outk P1#define out P0#define con P2uchar codeseg=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

7、0x88,0x83,0xc6,0xa1,0x86,0x8e;/共阳极二极管编码uchar key_buffer8=0xc0,0xc0,0xbf,0xbf,0xbf,0xbf,0xc0,0xc0;/选通数码管,1100 0000;1100 /0000;1011 1111; 1011 1111; 1011 1111; 1011 1111;1100 0000;1100 0000;没什么用,/在程序中重新赋值了void seg_scan(void);uchar scan(void);void delayms(uint);volatile uchar s_seg=0;bit ok;uchar key,s

8、end,rec;void main(void)TMOD=0X21; /中断初始化 TH1=0XFD;TL1=0XFD;/TR1=1; /启动定时器TH0=(65536-3000)/256;TL0=(65536-3000)%256;/装载初值,30msTR0=1;/启动定时器0SCON=0X50; /0101 0000,PCON=0X00;/0000 0000,波特率未加倍EA=1;/开总中断EX1=1;/允许外部中断1IT1=1;/方式1EX0=1;/允许外部中断0IT0=1;/方式1ET0=1;/允许定时器中断ES=0;/允许串行口中断while(1)/outk=0xf0;if(ok)/可以

9、显示ok=0;seg_scan();/扫描显示uchar scan(void)uchar k=16,m,n,in;delayms(10);outk=0xf0;/判断有键按下if(outk&0xf0)!=0xf0)/发生变化,有键按下for(m=0;m4;m+) outk=(0xfem); /扫描低4位,1110、1101、1011、0111 in=outk;for(n=0;n(4+n);/移位扫描高四位 if(in&0x01)=0)/若有变化,被改变 delayms(10);/延时消抖 if(in&0x01)=0)k=n+m*4;/行数乘以4加上列数break; if(k!=16)break;

10、/k被改变,则跳出不再循环检测return(k);/返回数值void delayms(uint j)/延时ms级uchar i;for(;j0;j-) i=250; while(-i); i=249; while(-i); void seg_scan(void)/数码管扫描程序out=key_buffers_seg;con=(1s_seg);s_seg+;if(s_seg=8)s_seg=0;/重新开始扫描void ext0()interrupt 0EX0=0;/关闭外部中断0key=scan();if(key!=16)send=key,key_buffer0=segkey/10,key_bu

11、ffer1=segkey%10;EX0=1;/开启外部中断0void timer0(void)interrupt 1 ok=1;/TH0=(65536-3000)/256;/TL0=(65536-3000)%256;/30ms的初值装载out=0xff;/关闭void ext1()interrupt 2/中断传送数据EX1=0;/外部中断1关闭ES=0;/关串行口中断,保证顺利发送SBUF=send;/缓冲器中送入数据while(!TI);/等待发送完成,TI=1时,循环结束TI=0;/软件置零,关中断ES=1;/开中断EX1=1;/开外部中断1void com()interrupt 4/串行

12、口中断RI=0;/接收到数据进入中断,软件置零rec=SBUF;/存储接收到的数据key_buffer6=segrec/10,key_buffer7=segrec%10; /存储十位与个位实验五 单片机与PC之间串行通信实验一、实验电路及连线使用MCU模块,用串口延长线将其和PC相连。使用PB006板接入一按键到P3.5,P3.0接到PB005模块的RXD,P3.1接到PB005模块的TXD,。四、实验说明1 、主要知识点概述:本实验用到的主要知识点是:MAX232工作原理和Proteus虚拟终端使用。在简单的应用中,最常用的是MAX232电路。它只需要有3条线即可完成通信,分别是 第二脚RX

13、D , 第3脚TXD ,第5脚GND。串行通信与单片机之间的接口:由于串行通信的电平逻辑定义是+15V( 高电平1)-15V(低电平0) 而单片机中分别用5V ,0V 来表示1,0 它们之间必须通过电平转换才可以完成通信。 此设计中将两个虚拟终端按图示挂于电路中,属性分别设置如下:VT1:2 、实验效果说明:PROTEUS中,运行仿真后,在弹出虚拟终端窗口中选上HEX DISPLAY MODE,每次按下按键SW1,两个虚拟终端显示51单片机发送的字符01。实际硬件实验中,连接好硬件后,按下按键,通过串口调试助手查看单片机发送的字符。VT2:五、实验流程图开 始设置串行口工作方式设置波特率判断按

14、键是 否按下? 数据送缓存发送数据是否试验程序如下:#includesbit a=P35;/供查询信号void init() SCON=0x50; PCON=0x80;/波特率加倍 TI=0;/定时器0 EA=1;/开总中断 ET1=1; TMOD=0x20;/定时方式1, TH1=0xfd;/溢出率:每秒钟溢出的次数,溢出率*定时时间=1秒 TL1=0xfd;/9600,溢出率/16=波特率,定时时间=1/(16*波特率)秒 TR1=1;main() init(); while(1) if(a=0)/发出了信号 SBUF=0x01;/装入缓冲器 while(!TI); /等待发送结束 TI=

15、0;/软件置零 while(!a);/a=0时,循环;a=1时,跳出 void t1() interrupt 3实验六 8255并行I/O扩展实验一、实验电路及连线MCU模块PB-EDU-011PB-EDU-06P27CS0P00-P07DB0-DB7硬件连接表K1-K8PB0-PB7D1-D8PA0-PA7ALELEP36,P37WR,RDP35RESET+5V+5V+5VGNDGNDGND二、实验程序流程图试验程序如下:#includeunsigned char xdata *con=0x7fff;/地址unsigned char xdata *pa=0x7ffc;/地址unsigned

16、char xdata *pb=0x7ffd; /地址main() *con=0x82;/1000 0010:最高位表示有效,设置为PA输出、PB输入 while(1) *pb=0xff;/全关 *pa=*pb;/外部输入被传至pa口 实验七 矩阵键盘扫描实验一、实验电路及连线硬件连接表MCU模块PB-EDU-002PB-EDU-012P20P27L-AL-GP10P13R1R4P14P17C1C4+5V+5V+5VGNDGNDGND五、实验流程图否开 始扫描键盘有键按下?延时去抖扫 描键盘找到闭合键计算键值根据键值得到对应段码输出段码显示是#includeunsigned char table

17、=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;unsigned char key_num;void delay_5ms() unsigned char i,j; for(i=0;i=25;i+) for(j=0;j=200;j+);unsigned char key_scan()/*键盘扫描原理:消抖查询:key_temp1用于赋给P1口值、key_temp0用于查询P1口值,对低四位赋高电位,按键按下时,高四位赋给是低电位,按键按下时,按下行被置为低,则再反转扫描,查处所在列,

18、综合后知被按下间的位置*/ unsigned char key_temp0,key_temp1; P1=0x0f; key_temp0=P1; if(key_temp0!=0x0f) delay_5ms();key_temp0=P1;if(key_temp0!=0x0f) P1=0xf0; key_temp1=P1; if(key_temp0=0x0e) switch(key_temp1) case 0xe0: key_num=3;break; case 0xd0: key_num=2;break; case 0xb0: key_num=1;break; case 0x70: key_num=

19、0;break; default: key_num=0;break; else if(key_temp0=0x0d) switch(key_temp1) case 0xe0: key_num=7;break; case 0xd0: key_num=6;break; case 0xb0: key_num=5;break; case 0x70: key_num=4;break; default: key_num=0;break; else if(key_temp0=0x0b) switch(key_temp1) case 0xe0: key_num=11;break; case 0xd0: key

20、_num=10;break; case 0xb0: key_num=9;break; case 0x70: key_num=8;break; default: key_num=0;break; else if(key_temp0=0x07) switch(key_temp1) case 0xe0: key_num=15;break; case 0xd0: key_num=14;break; case 0xb0: key_num=13;break; case 0x70: key_num=12;break; default: key_num=0;break; return key_num;main

21、() while(1) key_num=key_scan();/输出键值P2=tablekey_num;/显示 实验八 1602液晶显示的控制(44780)一、实验电路及连线硬件连接表MCU模块PB-EDU-003PB-EDU-003P00P07DB0DB7LD0LD7P20RSP21RWP22CSALELE+5V+5VGNDGND注:连接好以后,如果液晶无实验现象或显示不对,请通过电位计调整对比度,或按CPU板复位键对系统复位。二、实验程序流程图程序开始LCD初始化显示字符串程序结束详细的程序流程请参考注释。#include #define uint unsigned int #define

22、 uchar unsigned char sbit rs=P20; /1602的数据/指令选择控制线 sbit rw=P21; /1602的读写控制线 sbit en=P22; /1602的使能控制线 uchar code table=Hello; uchar code table1=Welcome To China; void delay(uint n) uint x,y; for(x=n;x0;x-) for(y=110;y0;y-); void lcd_wcom(uchar com) /1602写命令函数 rs=0; /选择指令寄存器 rw=0; /选择写 P0=com; /把命令字送入

23、P2 delay(5); /延时一小会儿,让1602准备接收数据 en=1; /使能线电平变化,命令送入1602的8位数据口 en=0; void lcd_wdat(uchar dat) /1602写数据函数 rs=1; /选择数据寄存器 rw=0; /选择写 P0=dat; /把要显示的数据送入P2 delay(5); /延时一小会儿,让1602准备接收数据 en=1; /使能线电平变化,数据送入1602的8位数据口 en=0; void lcd_init() /1602初始化函数 lcd_wcom(0x3c); /8位数据,双列,5*7字形功能6 lcd_wcom(0x0c); /开启显示

24、屏,关光标,光标不闪烁功能4 lcd_wcom(0x06); /显示地址递增,即写一个数据后,显示位置右移一位功能3 lcd_wcom(0x01); /清屏功能1 lcd_wcom(0x80+0x05); /显示地址设为80H(即05H,)上排第一位功能8 void main() /主函数 uchar n,m=0; lcd_init(); /液晶初始化 for(m=0;m5;m+) /将table中的数据依次写入1602显示 lcd_wdat(tablem); delay(200); lcd_wcom(0x80+0x40); /重新设定显示地址为0xc4,即下排第5位 相对地址到绝对地址的变换

25、 for(n=0;n16;n+) /将table1中的数据依次写入1602显示 lcd_wdat(table1n); delay(200); while(1); /动态停机 实验九 A/D转换实验一、实验电路及连线ADC0808是8位的A/D转换器件,在本实验中,它的输出口连接到单片机的P1口,控制信号ALE和START连接到P21,时钟信号CLOCK连接到P20,EOC连接到P23,输出控制信号OE到P27,输入选择地址ADD_A、ADD_B和ADD_C连接到P24-P26。硬件连接表MCU模块PB-EDU-010PB-EDU-011P00P07D1D8P10P17DB0DB7P200809

26、_CLKP210809_STP210809-ALEP230809_EOCP240809_AP250809_BP260809_CP270809_OE+5V+5V+5VGNDGNDGND程序开始选择输入通道启动转换等待转换结束读取转换结果,并保存二、实验程序流程图#includesbit clk=P20;/时钟信号sbit st=P21;/启动信号sbit ale=P22;/地址锁存允许,锁存模拟通道地址sbit eoc=P23;/转换完成信号输出sbit adda=P24;/模拟通道选择地址位:adda/addb/addcsbit addb=P25;sbit addc=P26;sbit oe=P

27、27;/允许输出信号:output enabledvoid init()/初始化 EA=1;/开总中断 TMOD=0x02;/设置定时器方式: TH0=0xfb;/转载定时器初值 TL0=0xfb;/ ET0=1;/中断 TR0=1; adda=0;/初始化,选通道0 addb=0; addc=0; st=0;/正脉冲启动 oe=0;/ 输出允许,高电平打开 ale=0;/上升沿锁存 clk=0;main() unsigned char outdata; init(); ale=1; /上升沿锁存 while(1) st=1;/正脉冲启动脉冲 st=0; while(!eoc); /转换结束信

28、号,初始化为0,表示正在转换中 oe=1;/完成后输出允许 outdata=P1;/输出数据 P0=outdata;/显示数据void t0() interrupt 1TH0=0xfb; TL0=0xfb; clk=clk;实验十 D/A转换实验一、实验电路及连线DAC0832的8位输入口连接到单片机的P1口,CS和WR1引脚分别是片选信号和数据信号,都是低电平有效。WR2和XFER直接连接到地,ILE连接到VCC。IOUT1和IOUT2为DAC0808的输出口,输出的是电流值,还需要通过运算放大器LM358把它转换为电压值。在硬件实验中,使用电压表测最后转换得到的电压值,并与理论值作比较。硬

29、件连接MCU模块PB-EDU-010P10P17DB0DB7P200832_CSP210832_WR+5V+5VGNDGND二、实验程序流程图#includesbit ILE=P20;sbit wr=P21;sbit XR=P22;sbit CS=P23;void delay() unsigned char i,j; for(i=0;i255;i+) for(j=0;j255;j+);main() unsigned char i; CS=0;/低电平片选 wr=0;/与XR同为0输入寄存器状态 XR=0;/传送控制信号, ILE=1;/允许输入锁存信号 while(1) P0=i; delay

30、(); i+; 实验十一 温度传感器DS18B20实验一、实验电路及连线硬件连接表MCU模块PB-EDU-002PB-EDU-005P00P03BCD-ABCD-DQAQGLALGP04COM-2P05COM-1P37DQ 5V5V5V GNDGNDGND二、实验流程图开始定时器初始化清LED显示缓冲温度转换读取数据定时器中断LED显示程序中断入口重载TH值存储区21H的内容为0显示低位是显示高位21H的内容取反否返回主程序试验程序如下:#include#include #define uchar unsigned char #define uint unsigned intsbit DATA

31、 = P37; /DS18B20接入口unsigned char table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;char shi,ge; /定义变量/*延时子函数*/void delay(uint num)while(num-);/*DS18b20温度传感器函数*/ void Init_DS18B20(void) /传感器初始化 uchar x=0; DATA = 1; /DQ复位 delay(10); /稍做延时 DATA = 0; /单片机将DQ拉低 delay(8

32、0); /精确延时 大于 480us /450 DATA = 1; /拉高总线 delay(20); x=DATA; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30);/读一个字节float ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0x80; delay(8); return(dat);/写一个字节void WriteOneChar(unsigned char dat) uchar

33、 i=0; for (i=8; i0; i-) DATA = 0; DATA = dat&0x01; delay(10); DATA = 1; dat=1; delay(8);/读取温度int ReadTemperature(void)uchar a=0;uchar b=0;int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读

34、取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();/低位b=ReadOneChar();/高位t=b;t=8;t=t|a;tt=t*0.0625;return(tt);/*显示子函数*/void display(int shi,int ge) P2=0x01;P1=tableshi;/显示百位delay(100); P2=0x02;P1=tablege;/显示十位delay(30);void main()float temp;while(1) temp=ReadTemperature();/读温度shi=(int)temp/10;/显示十位,强制数据类型转换ge

35、=(int)temp%10;/显示个位display(shi,ge);/显示函数delay(100); 实验十二 直流电机控制实验一、实验电路及连线硬件连接表MCU模块PB-EDU-009P36DIRP37PWMP34K1(加速)P35K2(减速)+5V+5VGNDGND二、实验程序流程图程序开始输出波形延时试验程序如下:#include#define uchar unsigned char#define uint unsigned intsbit K5=P14;/加速sbit K6=P15;/减速sbit PWM1=P10;/ 正转反转控制sbit PWM2=P11;/ sbit FMQ=P

36、36;/ uchar ZKB1,ZKB2;/void delaynms(uint aa) uchar bb; while(aa-) for(bb=0;bb115;bb+) /1ms ; void delay500us(void) int j; for(j=0;j57;j+) ; void beep(void)/蜂鸣 uchar t; for(t=0;t99)/加溢出 ZKB1=1; if(ZKB1100)/归零 N=0; if(N=ZKB1) PWM1=0; else PWM1=1; if(N=ZKB2) PWM2=0; else PWM2=1;实验十三 步进电机控制实验一、实验电路及连线硬件

37、连接表MCU模块PB-EDU-009MCU模块PB-EDU-009P00K1P2.2B3P01K2P2.3B4P20B1+5V+5VP21B2GNDGND二、实验程序流程图开始初始化,设置常量及指针将电机角度调整为0度读按键状态P键按下N键按下设指针R4=1,指向表头查表,输出控制数据延时P键按下N键按下R4=R4+1R4=R4-1R4=9R4=0设R4=1设R4=8查表,输出控制数据查表,输出控制数据查表,输出控制数据设指针R4=8,指向表尾延时YNNYYYNYNYNN#include #define uchar unsigned char sbit a=P00;sbit b=P01;uch

38、ar loop24=0x0c,0x06,0x03,0x09,0x09,0x03,0x06,0x0c;/低四位1100,0110,0011,1001,0011,0110,1100,单四拍控制方式void delay() uchar i,j; for(i=0;i150;i+) for(j=0;j255;j+);main() uchar i; while(1) if(a=0) for(i=0;i4;i+) P2=loop1i;delay(); if(b=0) for(i=0;i4;i+) P2=loop0i;delay(); 实验十四 直流电机测速实验一、实验电路及连线硬件连接表MCU模块PB-ED

39、U-009T0PLE+5V+5VGNDGND二、实验程序流程图主程序:数据显示开定时器并开始计数初 始 化开 始读计数器计数器清零中断程序:/测频计数法:定时器T1定时1s,freq=T0/1s#include#define uchar unsigned char#define uint unsigned intuchar code weikong=0x01,0x02,0x04,0x08;void delay(uchar time) uchar i,j; for(i=0;itime;i+) for(j=0;j110;j+) ; /void TimerConfig()/ 产生定时 TMOD=0x

40、15; /定时器1方式1,计数器0方式1 TL1=0xb0;TH1=0x3c;/定时50ms TL0=0;TH0=0;void display(uint freq);/uint freq=0; / /数字编码0-9uchar code gongyangtab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;/共阳极二极管void main(void) TimerConfig(); IE=0x8c; /T1,T0开中断TR0=1;TR1=1; while(1) display(freq); void Timer1() interrupt 3 static uchar n=0; /*/ 在局

温馨提示

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

评论

0/150

提交评论