这一章,讲用程序操控单片机输出I/O口的电平凹凸,从而操控外围设备的实例。需求留意地,51单片机上电后,默许输出高电平。上一章的许多程序模块,可直接拿来运用。
2.1 简略的操控实例——蜂鸣器
假定蜂鸣器的引脚和单片机的P3.7口相连。现在要让蜂鸣器大约响500ms,然后封闭。
程序是:
#include
#define uint unsigned int
#define uchar unsigned char //宏界说
sbit beep=P3^7;
void delay() //延时500ms
{
uint x,y;
for(x=100;x>0;x–)
for(y=580;y>0;y–);
}
void main()
{
beep=0; //开蜂鸣器
delay();
beep=1; // 关蜂鸣器
while(1);
}
2.2 流水灯
流水灯由八个发光二极管组成,刚好是一个字节,发光二极管共阴极,它们的阳极与单片机的P0相连。可见,默许流水灯全亮。
例程1 发光二极管偶数灯和奇数灯替换亮500ms,偶数灯先亮。
#include
#define uint unsigned int
#define uchar unsigned char //宏界说
void delay() //延时500ms
{
uint x,y;
for(x=100;x>0;x–)
for(y=580;y>0;y–);
}
void main()
{
while(1)
{
P0=0x55;
delay();
P0=~P0; //~表明按位取反
delay();
}
}
例程2开端时,流水灯只要最底位D0亮,亮灯每隔500ms往高位活动,构成一个循环反复的进程。
#include
#include
#define uint unsigned int
#define uchar unsigned char //宏界说
void delay() //延时500ms
{
uint x,y;
for(x=100;x>0;x–)
for(y=580;y>0;y–);
}
void main()
{
uchar temp;
temp=0x01;
while(1)
{
P0=temp;
delay();
temp=_crol_(temp,1); //循环左移一位
}
}
例程3 距离300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两头往中心活动三次;再从中心往两头活动三次;8个悉数闪耀3次;封闭发光管,程序中止。
#include
#include
#define uint unsigned int
#define uchar unsigned char
void delay(uint);
void main()
{
uchar i,j,k,z,n,temp;
P0=0x00; //灯全平息
for(i=3;i>0;i–)
{
P0=0xaa;//a大小写都可以
delay(450);
P0=0x55;
delay(450);
}
temp=0x01;
for(j=24;j>0;j–)
{
P0=temp;
delay(450);
temp=_crol_(temp,1); //D0灯亮并上下循环三次
}
temp=0x01;
/*
for(i=3;i>0;i–)
{
for(j=8;j>0;j++)
{
P0=temp;
delay(450);
temp=_crol_(temp,1);//D0灯亮并上下循环
}
}
*/
P0=0x00;
for(k=3;k>0;k–)
{
P0=0xc3;
delay(450);
P0=0x3c;
delay(450);
}
for(z=3;z>0;z–)
{
P0=0x3c;
delay(450);
P0=0xc3;
delay(450);
}
for(n=3;n>0;n–)
{
P0=0xff;
delay(450);
P0=0x00;
delay(450);
}
P0=0x00;
for(n=6;n>0;n–)
{
P0=~P0; //~按位取反
delay(450);
}
while(1);
}
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x–)
for(y=z;y>0;y–);
}
2.3 数码管
在我的试验板上,单片机经过芯片CH451(参阅我写的CH451的运用总结)来操控数码管显现。CH451与八个数码管衔接的原理图如下所示:
例程1点亮0、2、4、6号数码管,让它们都显现1。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 /*数码管位0显现*/
#define CH451_DIG1 0x0900 /*数码管位1显现*/
#define CH451_DIG2 0x0a00 /*数码管位2显现*/
#define CH451_DIG3 0x0b00 /*数码管位3显现*/
#define CH451_DIG4 0x0c00 /*数码管位4显现*/
#define CH451_DIG5 0x0d00 /*数码管位5显现*/
#define CH451_DIG6 0x0e00 /*数码管位6显现*/
#define CH451_DIG7 0x0f00 /*数码管位7显现*/
sbit ch451_din = P1^0;
sbit ch451_clk = P1^1;
sbit ch451_load = P1^2;
/********************************************************************
函 数 名:ch451_init()
功 能:对ch451芯片进行初始化
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,挑选4线输入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
}
/********************************************************************
函 数 名:ch451_write()
功 能:把12位的指令或数据写入ch451
说 明:12位数据或指令的写入次序是低位
进口参数:command
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
ch451_load=0; /*指令开端*/
for(i=0;i<12;i++)
{ /*送入12位数据,低位在前*,&表按位与,如5&7=5,即:0101^0111=5*/
ch451_din=command&1;
ch451_clk=0;
ch451_clk=1;
command>>=1; /*上升沿有用*/
}
ch451_load=1; /*加载数据*/
}
void main()
{
ch451_init();
//体系参数设定,参照说明书
ch451_write(0x401);
//显现参数设定,
ch451_write(0x580);
//第0位显现1
ch451_write(CH451_DIG0|1);
//第2位显现1
ch451_write(CH451_DIG2|1);
//第4位显现1
ch451_write(CH451_DIG4|1);
//第6位显现1
ch451_write(CH451_DIG6|1);
}
例程2 数码管位0位和1一起显现0、1、2、3、4,且循环显现这些数值。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 /*数码管位0显现*/
#define CH451_DIG1 0x0900 /*数码管位1显现*/
#define CH451_DIG2 0x0a00 /*数码管位2显现*/
#define CH451_DIG3 0x0b00 /*数码管位3显现*/
#define CH451_DIG4 0x0c00 /*数码管位4显现*/
#define CH451_DIG5 0x0d00 /*数码管位5显现*/
#define CH451_DIG6 0x0e00 /*数码管位6显现*/
#define CH451_DIG7 0x0f00 /*数码管位7显现*/
uint table[5][2]={{CH451_DIG0|0,CH451_DIG1|0},{CH451_DIG0|1,CH451_DIG1|1},
{CH451_DIG0|2,CH451_DIG1|2},{CH451_DIG0|3,CH451_DIG1|3},{CH451_DIG0|4,CH451_DIG1|4}};
//界说二维数组
sbit ch451_din=P1^0;
sbit ch451_clk=P1^1;
sbit ch451_load=P1^2;
/********************************************************************
函 数 名:ch451_init()
功 能:对ch451芯片进行初始化
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,挑选4线输入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
}
/********************************************************************
函 数 名:ch451_write()
功 能:把12位的指令或数据写入ch451
说 明:12位数据或指令的写入次序是低位
进口参数:command
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
ch451_load=0; /*指令开端*/
for(i=0;i<12;i++)
{ /*送入12位数据,低位在前*,&表按位与,如5&7=5,即:0101^0111=5*/
ch451_din=command&1;
ch451_clk=0;
ch451_clk=1;
command>>=1; /*上升沿有用*/
}
ch451_load=1; /*加载数据*/
}
void delay() //延时函数
{
uint x,y;
for(x=100;x>0;x–)
for(y=580;y>0;y–);
}
void main()
{
uchar num,tt;
ch451_init();
//体系参数设定,参照说明书
ch451_write(0x401);
//显现参数设定,
ch451_write(0x580);
while(1)
{
for(num=0;num<5;num++)
{for(tt=0;tt<2;tt++)
ch451_write(table[num][tt]);
delay();
}
}
}