• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

一个维修工如何学单片机(讲述自己学单片机经历)2

前几个贴说了,学单片机所具备的软件和硬件.接下来说说如何用C语言进行编写程序.在 编程序之前,有几个东西要讲清楚.1-学单片机就是要学习如何随意控制单片机的I/O端口.AT89S52一共有32个I/O口,分成4个组,分别是P0,P1,P2,P3,每个组分成8位,分别是P0.0--P0.7,P1.0--P1.7,P2.0--P2.7,P3.0--P3.7.每个人对单片机的理解都不一样,我当初把单片机理解成下面这个图
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/81/3540261251812802.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
32个I/O口分布如图,单片机每个I/O口占一个小方格,小方格具备存储电荷功能,满电荷的时候,小方格的逻辑电平为1,对应的实际电压是5V,没有电荷的时候逻辑电平是0,对应实际电压是0(确切来说是小于0.7V,其实0.7伏电压做不了什么事情,就可以认为是0V啦).那我们编写程序的时候,就是让小方格要么是1(5V),要么是0(0V).
   下面这些操作是假设你的编程软件安装成功,并且你会建立第一个工程文件的前提下进行.我就编一个小成程序让下面图的小灯亮起来.

500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/81/3540261251813790.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
程序代码:
#inlcude--程序的头文件,作用是把程序代码和单片机内部的硬件 结构联系上,初学的朋友不要过多钻这句话,反正每次写程序都要写这句话就对了.
#define uint unsigned int---定义一个无符号整型数据类型变量
#define uchar unsigned char----定义一个无符号字符型数据变量

void main()--程序主函数,一定要记住程序的函数结构写法,都是固定的.程序             执行都是从主函数开始执行.
{
P2=0Xfe;
while(1);

}
P2=0Xfe;把一个数0Xfe付给P2口,0X代表16进制,这时P2口的状态如图




500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/81/3540261251815358.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
P2=0Xfe这句话的目的就是让P2.0口的逻辑电平为0,实际电压为0,这样LED两端就会有电压差,从而使其点亮.可能有人不知道16进制和2进制是怎么回事.好简单的,0000-0,0001-1,0010-2,0011-3,0100-4,0101-5,0110-6,0111-7,1000-8,1001-9,1010-a,1011-b.1100-c,1101-d,1110-e,1111-f.16进制就是从0数到f,一共16个数,完了.细心的朋友可能会发现,让P2.0发光,就是让P2口最后一位为0,那只要P2口最后一位为0,LED就会发光,看上面的2进制数值,只要最后一位为0就达到目的,如P2=0X00,P2=0X02,P2=0Xdc....等等.
这种操做方法叫总线操作方法.让P2.0的LED发光还可以用位操作的方法.
程序代码如下:
#inlcude
#define uint unsigned int
#define uchar unsigned char
sbit D1=P2^0;
void main
{
D1=0;
while(1);

}

sbit D1=P2^0;这句话意思是把P2^0定义为一个变量D1,操作D1就可以操作P2.0.有的人会有疑问,这多麻烦了,直接P2.0=0,不就完了吗?不可以,这样写编译器不认识这种格式,所以大家一定要记得如何定义一个位变量,格式不能改了,一定是sbit D1=P2^0,当然D1可以是其他字母,A1,B2,C1都没有问题.
总结一下,让LED发光办法2个,总线操作,位操作.学习懂得总结进步才快.(待续)
全部回复(3)
正序查看
倒序查看
janyao
LV.1
2
2009-09-03 11:32
讲得很详细易懂,但while(1)是啥意思?还有前面定义的数据变量,我在其他教程看到不需要这个啊?

直接是:
#include
void main()
{
P1=0xfd;
}
0
回复
yaojiajia
LV.1
3
2009-09-03 14:25
@janyao
讲得很详细易懂,但while(1)是啥意思?还有前面定义的数据变量,我在其他教程看到不需要这个啊?直接是:#includevoidmain(){P1=0xfd;}
可能是写的太仓促了,这个也是我写程序的习惯吧!因为我以后发贴while(1)的使用率达到90%以上.
其实这个程序实际上是这样的:
void main()
{
P2=0xff;---单片机上电的时候,关掉所有的LED.
while(1)---这是一个条件判断语句,只要wihle()括弧里的表达式为真(逻辑直为1,那么单片机就会执行while 语句里的语句(也就是大括弧里的语句),反之就不执行.
{
P2=0Xfe;---这条语句将会一直被执行,所以灯一直在亮.
}
}
0
回复
janyao
LV.1
4
2009-09-07 08:48
@yaojiajia
可能是写的太仓促了,这个也是我写程序的习惯吧!因为我以后发贴while(1)的使用率达到90%以上.其实这个程序实际上是这样的:voidmain(){P2=0xff;---单片机上电的时候,关掉所有的LED.while(1)---这是一个条件判断语句,只要wihle()括弧里的表达式为真(逻辑直为1,那么单片机就会执行while语句里的语句(也就是大括弧里的语句),反之就不执行.{P2=0Xfe;---这条语句将会一直被执行,所以灯一直在亮.}}
多谢指教,我也自己查询了相关资料,明白了它的意思,希望你的经验继续写下去!
0
回复