keil基本步骤:
(1)新建一个工程:Project——New uVision Project
(2)选择型号:AT89C52
(3)新建.c文件:File——new——a.c
保存为:.c后缀
(4)添加.c文件:
(5)编写程序
以下是基本程序架构:很重要的笔记
A. 基本程序框架:(点亮小灯)
#include<reg52.h>
sbit LED=P1^0;
void main (void)
{
LED=0; // P1 = 0xfe;
while (1)
{
//空循环
}
}
B. for循环语句:(小灯循环点亮)
unsigned char i;
for(i=0;i<10;i++)
{;}
执行顺序:i=0; —— i<10; —— {}中的内容—— i++ ——。。。
C. 左移/右移(小灯逐个往左/右移动亮)
P1=0xfe; // P1=0x7f;
for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次
{
Delay(50000);
P1<<=1; //P1>>=1;
}
循环左移/右移:
for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次
{
Delay(50000);
P1<<=1; //P1>>=1;
P1=P1|0x01; //P1=P1|0x80;
//左移后,最右端自动赋值0,所以需要该语句赋值1
}
P1=0xfe; //P1=0x7f; //重新赋初始值
D. 数组的使用:
unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xff,0xff,0x00,0x00, 0x55,0x55,0xaa,0xaa};
for(i=0;i<16;i++)
{
P1=table[i];
Delay(3000);
}
E. PWM调光
sbit LED0=P1^0;
void main (void)
{
unsigned int CYCLE=600,PWM_LOW=0;
while(1)
{
LED0=1;
Delay(6000);
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}
LED0=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}
}
F. 共阳数码管显示(循环显示数字)
unsignedchar code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
P1=dofly_table[i];
{
P1=dofly_table[i];
Delay(60000);
}
G. 独立按键(按键控制数码管显示数字) switch选择语句
switch(P3) //P3口作为独立按键输入端
{
case0xfe:P1=dofly_table[1];break;
case 0xfd:P1=dofly_table[2];break;
default:break;
}
H. 数码管静态显示:位锁存与段锁存(8位数码管显示其中之一/二)
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
main()
{
while(1)
{
DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110 之一
// DataPort=0x7e; //取位码 第一位数码管选通,即二进制0111 1110 之二
LATCH2=1; //位锁存
LATCH2=0;
DataPort=0x4F; //取显示数据,段码 “3”共阴字符码
LATCH1=1; //段锁存
LATCH1=0;
}
}
I. 数码管动态显示:位锁存与段锁存
#define DataPort P0 //定义数据端