实验一LED流水灯一、实验目的制作一个流水灯,编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。
二、程序设计#include<reg51.h>#include<intrins.h>sbit LED = P1^0;void delay(){unsigned int i,j;for(i=120;i>0;i++)for(j=120;j>0;j++);}void main(){unsigned char i;LED = 0;while(1){for(i=0;i<8;i++){LED=0xfe;delay( );LED = _crol_(LED,1);P1 = LED;}LED=0X01;for(i=0;i<8;i++){delay( );LED = _cror_(LED,1);P1 = LED;}}}实验二按键扫描一、实验目的使用单片机片内的I/O口来进行开关状态的检测。
当开关打开时,I/O引脚为高电平,当开关闭合时,I/O引脚为低电平。
编写一个程序,控制流水灯,开关闭合,对应的发光二极管点亮。
二、程序设计#include<reg51.h>#include<intrins.h>#define GPIO_LED P1sbit K1=P3^5;sbit K2=P3^4;void Delay10ms( );void main(void){unsigned int i,j,l;j=0xfe;while(1){GPIO_LED=j;if (K1==0){Delay10ms( );if (K1==0){j=_cror_(j,1);while((i<50)&&(K1==0)){Delay10ms( );i++;}i=0;}}if (K2==0){Delay10ms( );if (K2==0){l=0xff;GPIO_LED=~l;while((i<500)&&(K2==0)){Delay10ms( );i++;}}}}}void Delay10ms(void){unsigned char a,b,c;for(c=1;c>0;c--){for(b=38;b>0;b--){for(a=130;a>0;a--);}}}实验三数码管数码管动态计数一、实验目的单片机控制数码管,程序运行时,让数码管进行动态计数0~99。
二、程序设计#include<reg51.h>#define GPIO_DIG P0sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;unsigned char code DIG_CODE[7]={0x66,0x06,0x4f,0x06,0X3f,0x5b,0x6d};//{0x06,,0x7d,0x07,0x7f,0x 6f};unsigned char DisplayDate[7];void DigDisplay();void main(void){unsigned char i;for(i=0;i<7;i++){DisplayDate[i]=DIG_CODE[i];}while(1){DigDisplay();}}void DigDisplay(){unsigned char i;unsigned int j;for(i=0;i<7;i++){switch(i){case(0):LSA=0;LSB=0;LSC=0; break;case(1):LSA=1;LSB=0;LSC=0; break;case(2):LSA=0;LSB=1;LSC=0; break;case(3):LSA=1;LSB=1;LSC=0; break;case(4):LSA=0;LSB=0;LSC=1; break;case(5):LSA=1;LSB=0;LSC=1; break;case(6):LSA=0;LSB=1;LSC=1; break;}GPIO_DIG=DisplayDate[i];j=10;while(j--);GPIO_DIG=0x00;}}实验四LCD显示一、实验目的用AT89C51单片机驱动字符型液晶显示器LCD1602,使其显示自己的名字。
二、程序设计Main.c#include<reg51.h>#include"lcd.h"unsigned char PuZh[]="liu bo wei";void main(void){unsigned char i;LcdInit();while(1){for(i=0;i<16;i++){LcdWriteData(PuZh[i]);}}}LCD.h#include"lcd.h"void Lcd1602_Delay1ms(uint c) //误差0us{uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);}}}#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能LCD1602_RS = 0; //选择发送命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //放入命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}#elsevoid LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能清零LCD1602_RS = 0; //选择写入命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com << 4; //发送低四位Lcd1602_Delay1ms(1)LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif#ifndef LCD1602_4PINSvoid LcdWriteData(uchar dat) //写入数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择输入数据LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}#elsevoid LcdWriteData(uchar dat) //写入数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择写入数据LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = dat;Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; //写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif#ifndef LCD1602_4PINSvoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x38); //开显示LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}#elsevoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x32); //将8位总线转为4位总线LcdWriteCom(0x28); //在四位线下的初始化LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}#endif实验五外部中断一、实验目的在单片机应用系统中,中断技术主要用于实时监测与控制,本次实验采用外部中断实现控制LED灯的点亮形式。
二、程序设计#include<reg51.h>#include<intrins.h>#define LED P1sbit K3=P3^4;sbit K4=P3^5;void kaiguan();void Delay(unsigned int n);unsigned char KeyValue=0;void main(void){LED=0x01;kaiguan();while(1){if(KeyValue)LED=_crol_(LED,1);elseLED=_cror_(LED,1);Delay(2000);}}void kaiguan(){IT0=1;EX0=1;IT1=1;EX1=1;EA=1;}void Int0()interrupt 0{Delay(1);if(K3==0)KeyValue=1;}void Int1()interrupt 2{Delay(1);if(K4==0)KeyValue=0;}void Delay(unsigned int n) {unsigned char a,b;for(;n>0;n--){for(b=1;b>0;b--)for(a=22;a>0;a--);}}实验六定时器实验一、实验目的在AT89C51单片机中,采用定时器T0的方式0的定时中断方式,使P1口外接的8只LED每隔20ms闪亮一次。
二、程序设计#include<reg51.h>#include<intrins.h>#define LED P2void timer();unsigned char Time;void main(void){Time=0;LED=0xfe;timer();while(1){if(Time==20){LED=_crol_(LED,1);Time=0;}}}void timer(){TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=1;}void Timer0() interrupt 1{TH0=0x3c;TL0=0xb0;Time++;}实验七串口实验一、实验目的本次实验采用AT89C51单片机应用系统中的串行口进行操作,运行程序时,实现PC对单片机的控制。