单片机实验
/***************实验1*********************************************/
Name: LED显示累加和
Function:将2~20的累加和,在LED上显示
CPU:STC89C52RC
Date:Sep 13,2017
By:Bolanche L
C code as following:
/****************************
#include<reg52.h>
#defineuchar unsigned char
voidmain()
{
uchar i,sum=0;
for(i=2;i<=20;i++)
{
sum+=i;
}
P1=sum;
while(1);
}
****************************/
**************实验1******************************************************/
/**************实验2****************************************/
Name: 3 keys control 3 LEDs
Function: 独立按键控制三个LED,当按下时,LED亮,松开时LED熄灭
CPU:STC89C52RC
Date:Sep 13,2017
By:Bolanche L
C code as following:
****************************/
#include<reg52.h>
#defineuchar unsigned char
#defineuint unsigned int
sbitLED1=P1^0;
sbitLED2=P1^1;
sbitLED3=P1^2;
sbitKEY1=P3^2;
sbitKEY2=P3^3;
sbitKEY3=P3^4;
voiddelay(uchar m)
{
uint i;
uchar j;
for(i=m;i>0;i--)
for(j=250;j>0;j--);
}
voidmain() //主函数
{
while(1)
{
if(KEY1==0)
{
delay(5);//消抖
if(KEY1==0)LED1=0;
}
else
LED1=1;
if(KEY2==0)
{
delay(5);
if(KEY2==0)LED2=0;
}
else
LED2=1;
if(KEY3==0)
{
delay(5);
if(KEY3==0)LED3=0;
}
else
LED3=1;
}
}
****************************/
**************实验2**************/
/**************实验3**************/
Name: LED显示自增1
Function: 板上流水灯显示的8位二进制数从0开始每隔200ms自增1,增至255变回0
CPU:STC89C52RC
Date:Sep 13,2017
By:Bolanche L
C code as following:
/*************************************
#include<reg52.h> //文件包含,把必要的头文件reg52.h加载在到程序当中
#defineuchar unsigned char //宏定义,用字符串uchar代替无符号字符变量
#defineuint unsigned int //宏定义,用uint代替无符号整形变量
voiddelay(void) //定义一个无参数无返回值的延迟函数
{
uchar j; //定义一个无符号字符变量j
uint i; //定义一个无符号整型变量i
for(i=1000;i>0;i--) //for语句,外循环,给i赋初值,i自减1直到不满足条件为止
for(j=250;j>0;j--) //for语句,内循环,给j赋初值,j自减1直到不满足条件为止
; //空语句,程序运行到这里,不执行其他的操作,直到i、j不满足条件为止,会消耗CPU时间,从而起到延时的作用
}
voidmain() //主函数
{
P1=0; //给P1端口赋初值,将P1端口所有的电平置为零
while(1) //while循环,条件永远为真
{
P1++; //P1的值自加1,
delay(); //调用延时函数delay().
}
}
**************************************/
/**************实验3**************/
/**************实验4**************/
Name: sanshuodeng
Function: LED每次间隔一个亮,每次亮四个,第二次亮另外四个,延迟函数时间控制好就可以起到闪烁的效果
CPU:STC89C52RC
Date:Sep 13,2017
By:Bolanche L
C code as following:
/*************************************
****************************/
#include<reg52.h>
#defineuchar unsigned char
#defineuint unsigned int
voiddelay(uchar m)
{
uchar i,j;
for(i=m;i>0;i--)
for(j=250;j>0;j--);
}
voidmain() //主函数
{
while(1)
{
P1=0xaa;
delay(255);
P1=0x55;
delay(255);
}
}
/**************实验4**************/
/**************实验5**************/
Name: liushuideng
Function: one bitliushuideng
CPU:STC89C52RC
Date:Sep 13,2017
By:Bolanche L
C code as following:
/*************************************
#include<reg52.h>
#include<intrins.h> //method 中移位函数的使用需要加载头文件intrins.h
#defineuint unsigned int
#defineuchar unsigned char
uchartable[]={0xfe,0xfc,0xfb,0xf7,0xef,0xcf,0xbf,0x7f}; //method 5中赋值使用
voiddelay1s()
{
uchar j;
uint z;
for(z = 1000;z>0;z--)
for(j=200;j>0;j--);
}
voidmain()
{
/*************************
//method 1
uchar i, temp;
while(1)
{
temp=0xfe;
P1= temp;
for(i=1;i<=8;i++)
{
delay1s();
temp<<=1;
P1=temp;
}
}
***********************/
/**********************
//method 2 老师您写的
P1 = 0xFE;
while(1)
{
delay1s();
P1 <<= 1;
if(CY) P1 +=1; //打开reg52.h可以看到sbit CY = PSW^7;特殊功能寄存器PSW的第7端口,进位标志位,用于表示加法或减法运算时最高位是否有进位或借位,如有则被置1
}
*****************/
/***************************
//method 3
uchar i, temp;
while(1)
{
temp=0x01;
P1= ~temp;
for(i=1;i<=8;i++)
{
delay1s();
temp=0x01;
P1=~(temp<<i);
}
}
**********************/
/******** method 4 移位函数的使用************
uchar i;
while(1)
{
char temp=0xFe;
P1=temp;
for(i=1;i<=8;i++)
{
P1=0xFE;
P1=(_crol_(P1,1)) ;
delay1s();
}
}
/******method 5 直接赋值的思想**************
uchar i;
while(1)
{
for(i=0;i<=7;i++)
{
P1=table[i];
delay1s();
}
}
***********method 6 将某一位置零的思想************/
uchar i;
while(1)
{
for(i=0;i<=7;i++)
{
P1=0xff;
P1 &=~(1<<i);
delay1s();
}
}
}
/**************实验5**************/
/**************实验6**************/
Name: liushuideng
Function: 2bit liushuideng
CPU:STC89C52RC
Date:Sep 13,2017
By:Bolanche L
C code as following:
*******************/
#include<reg52.h>
#defineuchar unsigned char
#defineuint unsigned int
uchartable[]={0xfc,0xf3,0xcf,0x3f};//method 2 使用
voiddelay1s()
{
uchar z;
uint j;
for(z = 250;z>0;z--)
for(j=255;j>0;j--);
}
main()
{ /********* method 1*************
uchar i,temp;
while(1)
{
temp=0x03;
P1= ~temp;
for(i=0;i<=3;i++)
{
delay1s();
temp<<=2;
P1=~temp;
}
}
********* method 1*************/
//method 2
uchar i;
while(1)
{
P1= 0xff;
for(i=0;i<=3;i++)
{
P1=table[i];
delay1s();
}
}
}
**************************************/
/**************实验6**************/
实验感想:
每次做实验的时候,我都会想一想,这道题该怎么去构建自己的思维。因为我以前学的时候也是比较零散,思维比较混乱,所以现在应该好好的考虑一下怎么去优化代码之类的,虽然说条条大路通罗马,但是我们还是得考虑一下单片机的负担,思维是很重要的东西,虽然我以后不一定学单片机之类的,但是,编程对我的思维训练是一种很大的提升。51单片机编程的时候,需要看电路原理图,还有一个就是芯片手册,它对你的编程是有很大的帮助。对一位流水灯的编程,我们可以会有很多很多的方法,所以说我们在编程的时候,可以去考虑很多很多的东西,它能够帮助你实现你需要的功能,它既可以帮助你去复习很多的知识,还可以帮助你去锻炼一种发散的思维,何乐而不为?有时我也觉得自己的思维太死板了,应该多尝试一下天马行空的感觉,不管能不能实现,but I believe there can be miracle when you believe!