单片机初学日记9.16-9.22

准备

1.软件安装 
        编写软件 keilv5 
        烧录软件 stcisp 

2.新建工程:养成编程习惯

            从上到下 由主到次
            芯片AT89C52
            品字 第一列工程名 第二列 user主程序 driver底层
            魔术棒 hex文件创建
        

函数

3.  点灯 两种方式进行点亮

        对整体赋值

        例如 P2=0x5f //运用十六进制

        //0x5f 为0101 1111 D6和D8为点亮状态

        对单个赋值

        例如 P2_0=0  D8为点亮状态
         

//头语言区
#include <REGX52.H>

//主程序
void main()
{
	while(1)
	{	
			P1=0x5f;	//编写代码的地方
	}
}

4.延迟函数 Delay(50) //延迟50

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	i = 11;
	j = 190;
	do
	{
		while (--j);
		} while (--i);
		}
	}

5.流水灯

_crol_左移    _cror_右 #include<intrins.h> 
#include <REGX52.H>
#include <intrins.h>
 int Led =0x5f;
 void main()
{
	while(1)
	{	
			P2=Led;
			Led=_crol_(Led,1);
	}
}

流转时加速,达到一定界限会重置流转的时间

#include <REGX52.H>
#include <intrins.h>
//头文件
 int Led =0x5f;//初始灯光设置
 int time=500;
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	i = 11;
	j = 190;
	do
	{
		while (--j);
		} while (--i);
		}
	}
void main()
{
	while(1)
	{	
			P2=Led;
			Delay(time);
			Led=_crol_(Led,1);
			time=time-100;//流转越来越快
			if(time==0){time=500;}//达到一定限制,进行重置
	}
}

模块化编程

6.独立按键

unsigned char Key_Read()
{	
unsigned char temp =0;
if(P3_1==0)temp=1;
if(P3_0==0)temp=2;
if(P3_2==0)temp=3;
if(P3_3==0)temp=4;
return temp;
}
//优先读取按键返回值
Key_Val=Key_Read();//读取键码
Key_Down=Key_Val&(Key_Val^Key_Old);//检测上升沿
Key_Up=~Key_Val&(Key_Val^Key_Old);//检测下降沿
Key_Old=Key_Val;//扫描变量
//纯背这块 定义后在这么写

小项目

自动开启流转为1000 带有次数限制 流转20次暂停

s1流转变为100 s2流转变为20

s3灯光变为4个(初始为两个) s4次数重置

//主区域
#include <REGX52.H>
#include<intrins.h>

//按键读取函数
unsigned char Key_Read()
{	
unsigned char temp =0;
if(P3_1==0)temp=1;
if(P3_0==0)temp=2;
if(P3_2==0)temp=3;
if(P3_3==0)temp=4;
return temp;
}
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	i = 11;
	j = 190;
	do
	{
		while (--j);
		} while (--i);
		}
	}
//声明变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned int time =1000;
unsigned char Led=0x5f;
unsigned int count=0;

void main ()
{
	while(1){
						Key_Val=Key_Read();//读取键码
						Key_Down=Key_Val&(Key_Val^Key_Old);//检测上升沿
						Key_Up=~Key_Val&(Key_Val^Key_Old);//检测下降沿
						Key_Old=Key_Val;//扫描变量
						
						if(count<=10){
						P2=Led;
						Led=_cror_(Led,1);
						Delay(time);
						P2=Led;
						count++;}
				switch(Key_Down)
				{
				case 1:
				time=100;
				break;
				case 2:
				time=20;
				break;
				case 3:
				Led=0xC3;
				break;
				case 4:
				count=0;
				break;
				}
}	
}

//主区域
#include <REGX52.H>
#include<intrins.h>

//按键读取函数
unsigned char Key_Read()
{	
unsigned char temp =0;
if(P3_1==0)temp=1;
if(P3_0==0)temp=2;
if(P3_2==0)temp=3;
if(P3_3==0)temp=4;
return temp;
}
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	i = 11;
	j = 190;
	do
	{
		while (--j);
		} while (--i);
		}
	}
//声明变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned int time =1000;
unsigned char Led=0xfe;
unsigned int mode = 3;
unsigned int open =0;
unsigned char Led_34[4]={0x7e,0xbd,0xdb,0xe7};
unsigned int i ;

void main ()
{
	P2=Led;
	while(1){
						Key_Val=Key_Read();//读取键码
						Key_Down=Key_Val&(Key_Val^Key_Old);//检测上升沿
						Key_Up=~Key_Val&(Key_Val^Key_Old);//检测下降沿
						Key_Old=Key_Val;//扫描变量
						
						
				switch(Key_Down)
				{
				case 1:
				open=0;
				break;
				case 2:
				open=1;
				break;
				case 3:
				mode++;
				if(mode==5){mode=1;}
				break;
				case 4:
				mode--;
				if(mode==255){mode=3;}
				break;
				}
				if(open==0)
				{
					switch(mode)
					{
					case 1:
					P2=Led;
					Led=_crol_(Led,1);
					Delay(500);
					P2=Led;
					break;
					case 2:
					P2=Led;
					Led=_cror_(Led,1);
					Delay(500);
					P2=Led;
					break;
					case 3:
					P2=Led_34[i];
					i++;
					if(i==4){i=0;}
					Delay(500);
					
					break;
					case 4:
					P2=Led_34[i];
					if(i==0){i=4;}
					i--;
					Delay(500);
					break;
						}
}
}	
}

7.动态数码管

先点亮LED模块然后利用SMG点亮灯条构成一个完整的表达符号

138译码器 P22 P23 P24 分别为1 2 4  最高值为7 代表LED8 对其进行点亮

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	i = 11;
	j = 190;
	do
	{
		while (--j);
		} while (--i);
		}
	}
	
void main ()
{
while(1){
	P2_2=0;
	P2_2=1;
	P2_2=0;
	
	P0=0xfe;
	Delay(500);
	P0=0x00;
	Delay(500);
	
	}

}

进行简单的显示可以增加相应的流动效果

简单的定义简单明了

#include <REGX52.H>
#include "Delay.h"
unsigned char table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void Nixie(unsigned char Local,Num) //0-8λÖõĵÆ
{
	switch(Local)
	{
		case 1:
			P2_2=1; P2_3=1;P2_4=1;
		break;
		case 2:
			P2_2=0; P2_3=1;P2_4=1;
		break;
		case 3:
			P2_2=1; P2_3=0;P2_4=1;
		break;
		case 4:
			P2_2=0; P2_3=0;P2_4=1;
		break;
		case 5:
			P2_2=1; P2_3=1;P2_4=0;
		break;
		case 6:
			P2_2=0; P2_3=1;P2_4=0;
		break;
		case 7:
			P2_2=1; P2_3=0;P2_4=0;
		break;
		case 8:
			P2_2=0; P2_3=0;P2_4=0;
		break;
	//·ÖÅ䵯¿é
	}
	//µãÁÁµÆ¿é
	P0=table[Num];
	P0=0x00;
	
}

定时器

确定频率,一般为1毫秒 删除AUXR&=07f

作者:大一想学单片机

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机初学日记9.16-9.22

发表回复