《微机原理与应用》实验报告姓名:侯伟学号:2015012214年级:2015级专业:电气工程及其自动化2017年秋季学期实验一 LCM控制实验1、功能要求1、掌握利用单片机控制字符型LCM1602的方法;2、完成与LCM1602的接口,并尝试各种显示功能。
2、硬件原理3、软件程序流程4、程序清单#include "reg52.h"#define uchar unsigned char#define uint unsigned intuint q;uchar str1[]="wu li xue yuan"; uchar str2[]="houwei2015012214";sbit E=P2^2;sbit RW=P2^1 ;sbit RS=P2^0;void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--) ;}void write_com(uchar com) {RS=0;RW=1;H1:P0=0xff;E=1;q=P0;E=0;if(q&0x80)goto H1 ;RS=0;RW=0;P0=com;E=1;delay(5);E=0;}void write_data(uchar DATE) {RS=0;RW=1;H2:P0=0xff;E=1;q=P0;E=0;if(q&0x80)goto H2 ;RS=1;RW=0;P0=DATE;delay(5);E=1;delay(5);E=0;}void init() {E=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}void main(){uchar i;init();for(i=0;i<14;i++){write_data(str1[i]);delay(100);}write_com(0x80+0x40);for(i=0;i<16;i++){write_data(str2[i]);delay(100);}while(1){delay(200);write_com(0x0f);write_com(0x1e);}}5、实验心得及建议C语言编写函数不同于汇编语言,函数嵌套使得程序变得精炼,此外一定要读懂每个器件的硬件设计,做到软硬件结合实验二基于I2C总线的EEPROM读写实验1、功能要求1熟悉24C02的芯片功能。
2掌握采用单片机和I2C芯片的硬件接口技术。
3掌握24C02的读写程序的设计和调试方法。
4向芯片中写入10个字节,然后再读出显示。
2、硬件原理3、软件程序流程总流程:写n个字节流程:读n个字节流程:4、程序清单#include "reg52.h"#define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1sbit SCL=P1^0;sbit SDA=P1^1; void Delay(unsigned int n) {while(n!=0)n--;}void Start(){SDA=1;Delay(10);SCL=1;Delay(10);SDA=0;Delay(10);SCL=0;Delay(10);}void Stop(){SDA=0;Delay(10);SCL=1;Delay(10);SDA=1;Delay(10);}void Ack(){int i;SCL=1;Delay(10);while(SDA==1&&i<100)i++;SCL=0;Delay(10);}void NoAck(){SDA=1;Delay(10);SCL=1;Delay(10);SCL=0;Delay(10);}void Write8bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);Delay(10);SCL=1;Delay(10);SCL=0;input=input<<1;}}void WriteI2C(unsigned char Wdata ,unsigned char RomAddress ) {Start();Write8bit(WriteDeviceAddress); Ack();Write8bit(RomAddress);Ack();Write8bit(Wdata);Ack();Stop();}int Read8bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){SCL=1;Delay(10);rbyte=rbyte<<1;Delay(10);rbyte=rbyte|SDA;SCL=0;Delay(10);}return(rbyte);}int ReadI2C(unsigned char RomAddress){int Data;Start();Write8bit(WriteDeviceAddress); Ack();Write8bit(RomAddress);Ack();Start();Write8bit(ReadDeviceAddress); Ack();Data=Read8bit();NoAck();Stop();return Data;}void main(){int writeByte[]={1,2,3,4,5,6,7,8,9,1 0};int readByte[10];int i;P2=0x00;for(i=0;i<=9;i++){WriteI2C(writeByte[i],0x00+i);Delay(1000000);}i=0;while(1){Delay(900000000);readByte[i]=ReadI2C(i+0x00);P2=readByte[i];Delay(90000000);i++;if(i==10)i=0;}}5、实验心得及建议I2C总线的协议比较多,程序编写起来比较困难,这要求我们对24C02芯片十分清楚,如果对它的协议不够清楚,读写函数很难实现实验三 A/D转换实验1、功能要求1 掌握A/D转换芯片ADC0809转换性能及编程方法。
2 掌握A/D转换芯片ADC0809与单片机的接口方法。
3 通过实验了解单片机如何进行数据采集。
4.利用实验箱产生0-5V的模拟电压。
编写程序,采集该模拟电压并将转换的结果用发光二极管显示。
5.采集光敏电阻的亮度变化,设置门限值,实现超过门限值使蜂鸣器报警的功能。
2、硬件原理3、软件程序流程4、程序清单#include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned intsbit ADC_START=P2^0;sbit ADC_ALE =P2^1;sbit ADC_OE =P2^2;sbit ADC_EOC =P2^3;sbit clk =P2^7;sbit E=P2^6; sbit R_W=P2^5; sbit D_I=P2^4;sbit D0=P0^0; sbit D1=P0^1; sbit D2=P0^2; sbit D3=P0^3; sbit D4=P0^4; sbit D5=P0^5; sbit D6=P0^6;sbit D7=P0^7;//unsigned data i; unsigned char q;void WCOM(unsigned char d); /*写指令函数*/void Dat(unsigned char d); /*写数据函数*/void Imim();/*初始化*/void Clearcld();/*清屏*/void Delay(){int d;for(d=0;d<30000;d++){_nop_();}}void Timer0Init(){TMOD|=0X01;TH0=0XFC;TL0=0XFF;ET0=1;EA=1;TR0=1;}void init0809(){ADC_START=0;ADC_OE=0;ADC_ALE=0;_nop_();_nop_();ADC_ALE=1; //ALE=1时地址进入锁存器_nop_();P3=0x07;_nop_();ADC_ALE=0; //ALE=0时地址被锁存住}void ADC_0809(){ADC_START=0;_nop_();_nop_();_nop_();ADC_START=1; //上升沿复位_nop_();_nop_();_nop_();ADC_START=0; //下降沿开始_nop_();_nop_();_nop_();while(!ADC_EOC); //等待转换结束ADC_OE =1;_nop_();_nop_();_nop_();Dat(0x30+(uchar)D0);Dat(0x30+(uchar)D1);Dat(0x30+(uchar)D2);Dat(0x30+(uchar)D3);Dat(0x30+(uchar)D4);Dat(0x30+(uchar)D5);Dat(0x30+(uchar)D6);Dat(0x30+(uchar)D7);Delay();ADC_OE =0;}void WCOM(unsigned char d){R_W=1;D_I=0;LOOP:P1=0xFF;E=1;q=P1;E=0;if(q&0x80){goto LOOP;}R_W=0;D_I=0;P1=d;E=1;E=0;}void Dat(unsigned char d) {R_W=1;D_I=0;LOOP:P1=0xFF;E=1;q=P1;E=0;if(q&0x80){goto LOOP;}D_I=1;R_W=0;P1=d;E=1;E=0;}void Imim(){P1=0xFF;E=0;WCOM(0x38);WCOM(0x08);WCOM(0x06);Clearcld();WCOM(0x0c);}void Clearcld(){D_I=0;R_W=0;// P0=0x01;WCOM(0x01);}void main(){int i;init0809();Imim();Clearcld();WCOM(0x02);Timer0Init();Delay();while(1){WCOM(0x80);ADC_0809();WCOM(0X88);for(i=0;i<8;i++)Dat(' ');WCOM(0X80+0x40);for(i=0;i<16;i++)Dat(' ');}}void Timer0() interrupt 1 {static uint i;TH0=0XFC;TL0=0xFF;i++;if(i==1){i=0;clk=~clk;}}5、实验心得及建议该实验硬件电路出错次数较多,需要锻炼排错的能力,结合软件程序,一步一步检查,这样每一部分都十分清楚实验四 D/A转换实验1、功能要求1.了解D/A(DAC0832)的基本原理和功能。