|
本帖最后由 yangcheng84 于 2014-5-21 00:17 编辑
初学贴<1>:http://www.crystalradio.cn/thread-552316-1-1.html
学习51单片机,点亮一个灯以后....
在第一帖子的视频里我们看到,当单片机时钟没有的时候(视频中用镊子对地短接19脚),单片机外部LED的状态保持上次状态不变,这就是我们常说的“数据锁存”. C51单片机的8位端口,内部都有一个对应的端口寄存器,命名为P0 \ P1 \P2 \3, 每个端口8位(
即视频中说的定义位,点亮一个灯的脚就是1个位);这些端口寄存器是可以“整体控制(专业术语:读写)”的,也可以单独对某位读写,点亮1个灯就是操作了其中的一位.
和汇编类似,对整体端口赋值就可以实现“写”操作:
P1=0xAA; //把十六进制0xaa写进P1端口,此时端口的状态就是1010 1010
而对于读,我们像数学那样,如果存在一个变量a,那么
a=P1; //P1的数据被读入变量a 中保存起来
当然,这里的a是需要预先定义说明的.这一点和数学定义类似
定义变量,其实就是定义数据类型,而数据类型,说白了就是表明 变量的大小范围(数学不也经常出题目求解方程,最后说明变量是属于自然数还是整数还是有理数集合吗?说白就是要确定范围的)
对于8位变量,可以使用单字节的“unsineg char " 做声明,因为单字节变量刚好可以表达2的8次方范围内的数值.完整写法即:
unsineg char a;
a=P1;
实际中原则上,只要存贮用的变量所容纳的大小能装得下 需保存的数值,那么定义是能使用的,例如
unsineg char a;
a=200;//正确,因为a的最大值就是255(从0算起,0-255 刚好256个单位)
而若此时写a=256;或 a=257; a=500 ..... 都是逻辑不正确的,有的编译器可能不会提醒你,但是写入单片机就会出现逻辑错误.
看看这个例子:
假设有一个变量x,编程 ,验证单片机判断数字的大小逻辑功能正确与否?
简易方法:假定x=20,我们让单片机和2比较,如果单片机认为x>2 就点亮一个灯,否则就不点灯,那么就可验证了。
#include <AT89X52.H>
#define LED P1_0 //验证结果指示灯
main()
{
unsineg char x=20; //数值20写入变量x
if(x>2)
{
LED=0; //成立则执行点灯
}
else
{
LED=1 ; //否则不执行,灭灯
}
while(1);
}
这里定义的变量如果写:
#include <AT89X52.H>
#define LED P1_0 //验证结果指示灯
main()
{
unsineg char x=256; //数值256写入变量x
if(x>2)
{
LED=0; //成立则执行点灯
}
else
{
LED=1 ; //否则不执行,灭灯
}
while(1);
}
因为 x=256 是不对的,因此尽管程序结构正确,但是最终的运算逻辑还是不对的(单片机不认为x>2,灯不亮).呵呵,所以要把握好数据类型的大小.
最后再说一次:单片机是读还是写操作,完全是有程序写入后自动切换的,不需要人工干预.
P1=0x??; //写
a=P1; //读
补充内容 (2014-5-21 09:08):
上文:unsineg char 确实笔误,应为:unsigned char, 现在帖子发了不能改过来了 |
评分
-
1
查看全部评分
-
|