OK,guys,今天来学习最菜的第一个单片机。
这就是proteus的一个模拟图;(proteus使用和连线方法请自行百度)
下边来简述一下一些单片机的基础知识:
1.头文件#include<reg51.h>
还有一种写法是#include<at89x51.h> 而两者主要的区别是后者定义了更多的地址空间。
使用后者时编译器会优先进入当前工程所在文件夹开始搜索此文件夹,如果未搜索到该文件夹,编译器会继续回到软件
安装文件夹搜索此头文件,如果搜索不到,编译器将会报错;reg51.h在软件安装处存在,所以一般使用前者。
与此类似的还有其他的头文件 #include<intrins.h> #include<absacc.h> etc.
2. sfr sbit的用法
sfr=special function register(不翻译 自己百度-。-)
sbit=special bit(位)
作为c51扩充的关键字 前者其实是特殊功能寄存器(8位) 后者则是特殊功能寄存器(位)
与 int char double 不同的是 这个新的定义并不是定义变量,而是一种对寄存器的引用,或者给寄存器起一个
别名,eg:sfr P0=0x80 把单片机内部地址的0x80处的这个寄存器重新起名叫P0;以后我们在程序中操纵P0,就相当于直接对
单片机内部的0x80地址处的寄存器进行操作,同理则有 sbit CY=PSW^7;(来自郭天祥版《51单片机c语言教程》)
ps: 在μvision4中,可以通过鼠标右键打开上边的<reg51.h>的open documen来查看全部单片机内寄存器的定义。
2.延时函数
单片机常用的一种函数,简单的可以通过for和while语句实现(以后会出一些c语言的基础教程,关于一些基本的函数设置)
eg:
while(1) //0=假 1=真 因为1为常数,它永远无法等于0,所以会无限循环下去,除非设置break;
{
led1=0; // 点亮
for(i=1000;i>0;i--)
for(j=100;j>0;j--) //延时
led1=1; // 熄灭
for(i=1000;i>0;i--)
for(j=100;j>0;j--)// 延时
}
而在实际应用中,延时函数会不止一次的用到,所以可以定义一个不带参数的子函数(void),
当主函数用到这些语句的时候,就可以直接调用这个子函数
eg:
void delays() //后边 的delays可以随便起 不要与关键字重复
{
for(i=1000;i>0;i--)
for( j=100;j>0;j--)
}
下边就是流水灯在keil c中的程序
#include<reg51.h>
#include<intrins.h>
void delay(unsigned char a)
{
unsigned char i;
while (--a!=0) //定义a 先执行-- 【--优先级高于!= 可参考数学中x/和+-的顺序关系】
{
for(i=0;i<125;i++);
}}
void main() //主函数
{
unsigned char b,i;
while(1)
{
b=0xfe; // 0x 即表示十六进制 因为AT89C51为8位 所以0xfe即显示1111 1110 为一即不亮 为0即亮
for(i=0;i<8;i++) //
{
P1=_crol_(b,1); // 左移函数的使用 明天解释
b=P1;
delay(250); // 延时函数子函数的调用
}}}
这就是proteus的一个模拟图;(proteus使用和连线方法请自行百度)
下边来简述一下一些单片机的基础知识:
1.头文件#include<reg51.h>
还有一种写法是#include<at89x51.h> 而两者主要的区别是后者定义了更多的地址空间。
使用后者时编译器会优先进入当前工程所在文件夹开始搜索此文件夹,如果未搜索到该文件夹,编译器会继续回到软件
安装文件夹搜索此头文件,如果搜索不到,编译器将会报错;reg51.h在软件安装处存在,所以一般使用前者。
与此类似的还有其他的头文件 #include<intrins.h> #include<absacc.h> etc.
2. sfr sbit的用法
sfr=special function register(不翻译 自己百度-。-)
sbit=special bit(位)
作为c51扩充的关键字 前者其实是特殊功能寄存器(8位) 后者则是特殊功能寄存器(位)
与 int char double 不同的是 这个新的定义并不是定义变量,而是一种对寄存器的引用,或者给寄存器起一个
别名,eg:sfr P0=0x80 把单片机内部地址的0x80处的这个寄存器重新起名叫P0;以后我们在程序中操纵P0,就相当于直接对
单片机内部的0x80地址处的寄存器进行操作,同理则有 sbit CY=PSW^7;(来自郭天祥版《51单片机c语言教程》)
ps: 在μvision4中,可以通过鼠标右键打开上边的<reg51.h>的open documen来查看全部单片机内寄存器的定义。
2.延时函数
单片机常用的一种函数,简单的可以通过for和while语句实现(以后会出一些c语言的基础教程,关于一些基本的函数设置)
eg:
while(1) //0=假 1=真 因为1为常数,它永远无法等于0,所以会无限循环下去,除非设置break;
{
led1=0; // 点亮
for(i=1000;i>0;i--)
for(j=100;j>0;j--) //延时
led1=1; // 熄灭
for(i=1000;i>0;i--)
for(j=100;j>0;j--)// 延时
}
而在实际应用中,延时函数会不止一次的用到,所以可以定义一个不带参数的子函数(void),
当主函数用到这些语句的时候,就可以直接调用这个子函数
eg:
void delays() //后边 的delays可以随便起 不要与关键字重复
{
for(i=1000;i>0;i--)
for( j=100;j>0;j--)
}
下边就是流水灯在keil c中的程序
#include<reg51.h>
#include<intrins.h>
void delay(unsigned char a)
{
unsigned char i;
while (--a!=0) //定义a 先执行-- 【--优先级高于!= 可参考数学中x/和+-的顺序关系】
{
for(i=0;i<125;i++);
}}
void main() //主函数
{
unsigned char b,i;
while(1)
{
b=0xfe; // 0x 即表示十六进制 因为AT89C51为8位 所以0xfe即显示1111 1110 为一即不亮 为0即亮
for(i=0;i<8;i++) //
{
P1=_crol_(b,1); // 左移函数的使用 明天解释
b=P1;
delay(250); // 延时函数子函数的调用
}}}