您的位置:首页 > 编程语言 > C语言/C++

单片机入门学习笔记----第一课:简单的C语言语法+流水灯实验

2011-06-20 14:50 525 查看
第一课:流水灯实验11.20
1、C51常用数据类型:
无符号整型:unsigned int 占16位数 取值0-65535
无符号字符型: unsigned char 占8位数 取值0-255
2、C51常用头文件:
reg51.h reg52.h math.h ctype.h stdio.h stdlib.h absac.h intrins.h
reg51.h和reg52.h用来定义51和52单片机的特殊功能寄存器和位寄存器,头部内容大部分一样,52就比51多了几行定义T2寄存器的内容
math.h定义常用数学运算
3、C51的运算符:
算术运算符:
% 用来求余数 10%3=1
关系运算符:
!= 测量不等
&& 与
|| 或
! 非
位运算符:
& 按位与
| 按位或
^ 异或
~ 取反
>> 右移
<< 左移
4、所需器件
①排阻:103=10*10^3欧姆 150=15*10^0欧姆 最后一位表示数量级
②发光二极管::单向导通性,通过5毫安左右电流可发光,电流越大亮度越强,但要控制在3-20毫安之间,需在阳极串联一个电阻保证其通过的电流不要过大,又称“限流电阻”,发光时测得二极管两端电压为1.7V,称之为“导通压降”
③74h573锁存器:
OE反:输出使能端,低电平有效
1D-8D:数据输入端
1Q-8Q:数据输出端
LE:锁存允许端
H L:高低电平
X:任意电平
Z:高阻态





5、单片机C语言语句:
前置:声明书写
#include<> //包含头文件
#define A=B //宏定义
void XX() //声明子函数
int/char C,D; //定义常量
void main() //主函数
{}
①while循环语句
格式
while(表达式)
{
内部语句(可为空)
}
原则:若表达式不是0,即为真,那么执行语句,否则跳出执行后面的语句。
使用
While(1) //死循环,永远跳不出的执行
{
需要循环使用的语句
}
Eg:
#include<reg52.h>
void main()
{
P1=0xfe;
While(1);
}
②for循环,演示语句
格式
for(表达式1;表达式2;表达式3)
{
语句(可为空)
}
使用for延时:、
③带参数函数的写法和调用
首先要在void main()前声明
然后输入循环语句
void Delayms(unsigned int xms) 此写法方便修改延时时间
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;i--); //子循环
}
然后再需要延时的语句下一行键入
Delayms(1000) //延时1000ms=1s

从中间到两边流水灯
#include <reg52.h>
#define    uint unsigned int   //宏定义 简化 unsigned int
void delayms(uint);         //声明延时子函数 必须在主函数前声明,而且带参数的需要在括号中生命参数类型 在此处失败N次

void main()

{

while(1)

{

P1=0xe7;              //总线写法 十六进制e7即二进制的11100111

delayms(1000);         //延时1s

P1=0xdb;

delayms(1000);

P1=0xbd;

delayms(1000);

P1=0x7e;

delayms(1000);

P1=0xbd;

delayms(1000);

P1=0xdb;

delayms(1000);

}

}

void delayms(uint xms)           //延时子函数 1000ms=1s

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);     //i j千万别搞混了。。。。

}

每隔两个逐一点亮

#include <reg52.h>

#define    uint unsigned int   //宏定义 简化 unsigned int

void delayms(uint);         //声明子函数 必须声明 在此处失败N次

void main()

{

while(1)

{

P1=0xfc;

delayms(1000);

P1=0xf9;

delayms(1000);

P1=0xf3;

delayms(1000);

P1=0xe7;

delayms(1000);

P1=0xcf;

delayms(1000);

P1=0x9f;

delayms(1000);

P1=0x3f;

delayms(1000);

}

}

void delayms(uint xms)           //延时子函数 1000ms=1s

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

④不带参数函数的写法及调用
for(i=1000;i>0;i--) //延时1s
for(j=110;j>0;j--);
如果一些语句不止一次用到,而且内容相同,就可以把它写成一个不带参数的语句,档主函数需要时直接调用这个子函数,以下写法与上边的语句效果相同,使用前需在主函数前声明,
不带参数括号内为空 void delay1s()
void delay1s() //括号里面无任何数据或符号,即此函数为无参数符号
{
for(i=1000;i>0;i--) //延时1s
for(j=110;j>0;j--);
}
6、利用C51库函数实现流水灯
使用C51中自带头文件intrins.h中的_crol_和_cror_函数实现循环左移和循环右移,利用位运算符<<和>>实现左移和右移。
#include<reg52.h>

#include<intrins.h>

#define uint unsigned int           //宏定义 简化 unsigned int

#define uchar unsigned char         //宏定义

//试验多次sbit right=_crol_     是不可行的

void delayms(uint);                       //声明子函数 必须声明 在此处失败N次

uchar led;

void delayms(uint xms)             //延时子函数

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

void main()                                          //注意不带参数要加()

{

led=0x96;                          //赋值       10010110

while(1)                                            //死循环

{

P1=led;                          //将led赋值给P1总线

delayms(500);                                   //延时0.5秒

led=_crol_(led,1);                              //将led左移一位赋值给led

}

}


综合练习:

//利用位运算>> <<进行左右移位  和intrins.h中的_crol与_cror_函数进行循环左右移的综合练习
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
void delayms(uint xms)    //循环子函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
uchar led=0xfe;      //初始设置led为1111110 注意不要把此句写到while循环体里,否则就不会动了
while(led>0)		   //当led全部点亮时 跳出循环体 执行循环移动指令
{
P1=led;
delayms(1000);
led=led>>1;		   //位运算符控制流水灯左移右移
}
led=0xfe;            //重新定义led为11111110,不可以写到下一个while里
while(1)
{
P1=led;
delayms(1000);        //1s延时
led=_crol_(led,2);    //隔两位向左循环移动
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: