第二部分 與外圍設備的接口實例
2.1 簡單的控制實例——蜂鳴器
本文引用地址:http://butianyuan.cn/article/201611/315470.htm假設蜂鳴器的引腳和單片機的P3.7口相連。現(xiàn)在要讓蜂鳴器大約響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 流水燈
流水燈由八個發(fā)光二極管組成,剛好是一個字節(jié),發(fā)光二極管共陰極,它們的陽極與單片機的P0相連??梢?,默認流水燈全亮。
例程1 發(fā)光二極管偶數(shù)燈和奇數(shù)燈交替亮500ms,偶數(shù)燈先亮。
#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往高位流動,形成一個循環(huán)反復的過程。
#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); //循環(huán)左移一位
}
}
例程3 間隔300ms先奇數(shù)亮再偶數(shù)亮,循環(huán)三次;一個燈上下循環(huán)三次;兩個分別從兩邊往中間流動三次;再從中間往兩邊流動三次;8個全部閃爍3次;關閉發(fā)光管,程序停止。
#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燈亮并上下循環(huán)三次
}
temp=0x01;
/*
for(i=3;i>0;i--)
{
for(j=8;j>0;j++)
{
P0=temp;
delay(450);
temp=_crol_(temp,1);//D0燈亮并上下循環(huán)
}
}
*/
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 數(shù)碼管
在我的實驗板上,單片機通過芯片CH451(參考我寫的CH451的使用總結)來控制數(shù)碼管顯示。CH451與八個數(shù)碼管連接的原理圖如下所示:
例程1點亮0、2、4、6號數(shù)碼管,讓它們都顯示1。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 /*數(shù)碼管位0顯示*/
#define CH451_DIG1 0x0900 /*數(shù)碼管位1顯示*/
#define CH451_DIG2 0x0a00 /*數(shù)碼管位2顯示*/
#define CH451_DIG3 0x0b00 /*數(shù)碼管位3顯示*/
#define CH451_DIG4 0x0c00 /*數(shù)碼管位4顯示*/
#define CH451_DIG5 0x0d00 /*數(shù)碼管位5顯示*/
#define CH451_DIG6 0x0e00 /*數(shù)碼管位6顯示*/
#define CH451_DIG7 0x0f00 /*數(shù)碼管位7顯示*/
sbit ch451_din = P1^0;
sbit ch451_clk = P1^1;
sbit ch451_load = P1^2;
/********************************************************************
函 數(shù) 名:ch451_init()
功 能:對ch451芯片進行初始化
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,選擇4線輸入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
}
/********************************************************************
函 數(shù) 名:ch451_write()
功 能:把12位的指令或數(shù)據(jù)寫入ch451
說 明:12位數(shù)據(jù)或指令的寫入順序是低位
入口參數(shù):command
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
ch451_load=0; /*命令開始*/
for(i=0;i<12;i++)
{ /*送入12位數(shù)據(jù),低位在前*,&表按位與,如5&7=5,即:0101^0111=5*/
ch451_din=command&1;
ch451_clk=0;
ch451_clk=1;
command>>=1; /*上升沿有效*/
}
ch451_load=1; /*加載數(shù)據(jù)*/
}
void main()
{
ch451_init();
//系統(tǒng)參數(shù)設定,參照說明書
ch451_write(0x401);
//顯示參數(shù)設定,
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 數(shù)碼管位0位和1同時顯示0、1、2、3、4,且循環(huán)顯示這些數(shù)值。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 /*數(shù)碼管位0顯示*/
#define CH451_DIG1 0x0900 /*數(shù)碼管位1顯示*/
#define CH451_DIG2 0x0a00 /*數(shù)碼管位2顯示*/
#define CH451_DIG3 0x0b00 /*數(shù)碼管位3顯示*/
#define CH451_DIG4 0x0c00 /*數(shù)碼管位4顯示*/
#define CH451_DIG5 0x0d00 /*數(shù)碼管位5顯示*/
#define CH451_DIG6 0x0e00 /*數(shù)碼管位6顯示*/
#define CH451_DIG7 0x0f00 /*數(shù)碼管位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}};
//定義二維數(shù)組
sbit ch451_din=P1^0;
sbit ch451_clk=P1^1;
sbit ch451_load=P1^2;
/********************************************************************
函 數(shù) 名:ch451_init()
功 能:對ch451芯片進行初始化
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,選擇4線輸入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
}
/********************************************************************
函 數(shù) 名:ch451_write()
功 能:把12位的指令或數(shù)據(jù)寫入ch451
說 明:12位數(shù)據(jù)或指令的寫入順序是低位
入口參數(shù):command
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
ch451_load=0; /*命令開始*/
for(i=0;i<12;i++)
{ /*送入12位數(shù)據(jù),低位在前*,&表按位與,如5&7=5,即:0101^0111=5*/
ch451_din=command&1;
ch451_clk=0;
ch451_clk=1;
command>>=1; /*上升沿有效*/
}
ch451_load=1; /*加載數(shù)據(jù)*/
}
void delay() //延時函數(shù)
{
uint x,y;
for(x=100;x>0;x--)
for(y=580;y>0;y--);
}
void main()
{
uchar num,tt;
ch451_init();
//系統(tǒng)參數(shù)設定,參照說明書
ch451_write(0x401);
//顯示參數(shù)設定,
ch451_write(0x580);
while(1)
{
for(num=0;num<5;num++)
{for(tt=0;tt<2;tt++)
ch451_write(table[num][tt]);
delay();
}
}
}
評論