本人也是前几天开始接触单片机,从最经典也是最实用的8051开始入手。看了几天书和资料,发现以前一直看的微机还有大一上时候在计算机学的一些东西还是挺有用的。大家都是看郭天祥的吧=。= 本*不是。我是在x宝上买的开发板讲课都是x宝店家独家镜头,可谓是高端大气上档次,低调奢华有内涵,简约时尚国际范,低端粗俗甩节操,土憋矫情无下限,狂拽酷帅吊炸天,冷艳高贵接地气,时尚动感小清新,可爱乡村非主流。好吧,废话不多,其实我也是看郭天祥的,哈工大毕竟不是盖的。ps:x宝老板是南邮的高材生。
本*老老实实地把PPT最后的课后练习都做了遍,完全没有什么百度,那些弱爆了换句话说。
下面,本*就郭天祥课件里面课后练习的题目做出自己的独家见解-。-
题一:第一个发光管以间隔200ms闪烁。
卧槽-,- 这种题目小儿科。本*表示,写这类程序有两种方法,我还是喜欢直接对IO口总线定义。
#include<reg52.h>
#include <intrins.h> //就蜂鸣器接的IO口不同的开发板设计电路时候可能会有所不同,本*x宝买的这块接的是P3.4.
sbit buzz=P3^4;
void delay()
{
unsigned int t=30000;
while (t--);
}
void main()
{
unsigned char temp;
temp=0xfe;
while(1)
{
P1=temp;
temp=_crol_(temp,1);
buzz=~buzz;
delay();
}
}
题三:用8个发光管演示出8位二进制数累加过程。
#include<reg52.h> //表示这样题目还是比较有意思的 ps:要学单片机首先我觉得这些进制的问题要搞清楚,二进制 十六进制和我们用的十进制的转换关系。
#include<intrins.h>
void delay()
{
unsigned int a=30000;
while(a--);
}
void main() //灯亮为0,灭为1;
{
P1=0x00;
for(;P1<=0xfe;P1++)
delay();
}
题四:8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。重复此过程。
#include<reg52.h>
#include<intrins.h>
unsigned int temp;
void delay(unsigned int z)
{
unsigned int x;
unsigned char y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void main()
{
unsigned int a,b,c;
while(1)
{
for(a=0;a<2;a++)
{
temp=0xfe;
b=0;
while(b<=6)
{
P1=temp;
temp=_crol_(temp,1);
b++;
delay(500);
}
c=0;
while(c<=6)
{
P1=temp;
temp=_cror_(temp,1);
c++;
delay(500);
}
}
P1=0xff;
for(a=0;a<5;a++)
{
P1=~P1;
delay(1000);
}
}
}
题五:间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
#include<reg52.h>
#include<intrins.h>
unsigned int temp;
void delay(unsigned int z)
{
unsigned char x;
unsigned char y;
for(x=z;x>0;x++)
for(y=100;y>0;y++);
}
void main()
{
unsigned int a;
while(1)
{
a=0;
temp=0xfe;
while(a<=6)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
a=0;
temp=0xfc;
while(a<=5)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
a=0;
temp=0xf8;
while(a<=4)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
a=0;
temp=0xf0;
while(a<=3)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
a=0;
temp=0xe0;
while(a<=2)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
a=0;
temp=0xc0;
while(a<=1)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
a=0;
temp=0x80;
while(a<=0)
{
P1=temp;
temp=_crol_(temp,1);
delay(30000);
a++;
}
temp=0x00;
P1=temp;
delay(30000);
}
}
题六:间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
#include<reg52.h>
void delay()
{
unsigned int a=30000;
while(a--);
}
void main()
{
unsigned char a;
while(1)
{
for(a=0;a<3;a++)
{
P1=0x55;
delay();
P1=0xaa;
delay();
}
for(a=0;a<3;a++)
{
P1=0x7e;
delay();
P1=0xbd;
delay();
P1=0xdb;
delay();
P1=0xe7;
delay();
}
for(a=0;a<3;a++)
{
P1=0xe7;
delay();
P1=0xdb;
delay();
P1=0xbd;
delay();
P1=0x7e;
delay();
}
for(a=0;a<3;a++)
{
P1=0x00;
delay();
P1=~P1;
delay();
}
}
}
学习是一个不断积累的过程,郭天祥说十天可以学完,表示我做不到,不仅仅是学完8051,其实别的芯片程序大体还是通用的,我诶想想是这样的=。= 不管怎么说,c语言是基础,当然也有用汇编的,本*表示汇编看不懂。。。。
明天写关于独立按键和LED之间关系的各种程序。
To be continue....
void delay() //关于这个延迟函数,本*学术有限,只会有这种估计的方法,关于晶振来计算然后写的之后补强
{
unsigned int a =30000;
while(a--);
}
void main()
{
while(1)
{
P1=0xfe;
delay();
P1=0xff;
delay();
}
}
题二:8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
#include <reg52.h> //表示蜂鸣器和led这些链接方式比较相同,同样的还有继电器,所以程序也都一样,变下IO口而已。