51单片机实例.docx
- 文档编号:8938208
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:23
- 大小:18.84KB
51单片机实例.docx
《51单片机实例.docx》由会员分享,可在线阅读,更多相关《51单片机实例.docx(23页珍藏版)》请在冰豆网上搜索。
51单片机实例
1、点亮一个LED
#include
//头文件包含特殊功能寄存器的定义
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
//此方法使用1个字节对单个端口赋值
P0=0xfe;//P0口的最低位点亮,可以更改数值是其他的灯点亮
//0xAA是16进制,0x开头表示16进制数,
//AA换算成二进制是10101010
while
(1);//主循环
}
2、点亮多个LED
#include
//头文件包含特殊功能寄存器的定义
sbitLED0=P0^0;//用sbit关键字定义LED到P0.0端口,
sbitLED1=P0^1;//LED是自己任意定义且容易记忆的符号
sbitLED2=P0^2;
sbitLED3=P0^3;
sbitLED4=P0^4;
sbitLED5=P0^5;
sbitLED6=P0^6;
sbitLED7=P0^7;
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
//此方法使用bit位对单个端口赋值
LED0=0;//将P0.0口赋值0,对外输出低电平
LED1=1;
LED2=0;
LED3=1;
LED4=0;
LED5=1;
LED6=0;
LED7=1;
while
(1);//主循环
}
3、花样灯
#include
/*------------------------------------------------
花样表格
------------------------------------------------*/
unsignedcharcodeseg[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0xff,0xff,0x00,0x00,
0x55,0x55,0xaa,0xaa
};//rom允许情况可以无限添加
voidDelay(unsignedintt);//函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsignedchari;//定义一个无符号字符型
//局部变量i取值范围0~255
while
(1)
{
P0=0xFE;//第1个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P0<<=1;
}
P0=0x7F;//第8个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P0>>=1;
}
P0=0xFE;//第1个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P0<<=1;
P0|=0x01;
}
P0=0x7F;//第8个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P0>>=1;
P0|=0x80;
}
//下面通过查表方法获得花样参数
for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强
{
Delay(20000);
P0=seg[i];
}
}
}
/*------------------------------------------------
延时函数,含有输入参数unsignedintt,无返回值
unsignedint是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
voidDelay(unsignedintt)
{
while(--t);
}
4、数码管滚动显示HELLO
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardisplay[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xBF,0xBF,0x89,0x86,0xC7,0xC7,0xC0,0xBF,0xBF,
//--HELLO-
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
ucharshift,j=0;
/******************************************/
/*延时子程序*/
/******************************************/
voiddelayms(uintms)
{
uchart;
while(ms--)
{
for(t=0;t<120;t++);
}
}
/******************************************************/
/*显示函数*/
/******************************************************/
voiddisp(void)
{
uchari;
shift=0x01;
for(i=8;i>0;i--)
{
P0=display[i+j];
P1=shift;
shift=(shift<<1);
delayms
(1);
}
P1=0x00;
}
/******************************************************/
/*函数*/
/******************************************************/
voidmain()
{
uchark;
P0=0xff;
P1=0xff;
while
(1)
{
for(j=0;j<17;j++)
{
for(k=0;k<125;k++)
disp();
}
}
}
5、蜂鸣器发声
#include
sbitSPK=P3^5;//定义喇叭端口
/*------------------------------------------------
函数声明
------------------------------------------------*/
voidDelayUs2x(unsignedchart);//函数声明
voidDelayMs(unsignedchart);
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
while
(1)
{
DelayMs
(1);//发出大约500Hz的方波频率越大声音越尖,如果只需它发声,则只需SPK=0;即可
SPK=!
SPK;
}
}
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
6、矩阵键盘
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitbeep=P3^5;
unsignedcharconstdisplay[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
ucharkeyscan(void);//键盘扫描
voiddelay(uinti);//延时
/******************************************/
/*蜂鸣器发音子程序*/
/******************************************/
voidSpeak(void)
{
beep=!
beep;
delay(1000);
beep=1;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain()
{
ucharkey;
P1=0xff;//1数码管亮按相应的按键,会显示按键上的字符
beep=1;
while
(1)
{
key=keyscan();//调用键盘扫描,
switch(key)
{
case0xee:
P0=display[0];break;//0按下相应的键显示相对应的码值
case0xde:
P0=display[1];break;//1
case0xbe:
P0=display[2];break;//2
case0x7e:
P0=display[3];break;//3
case0xed:
P0=display[4];break;//4
case0xdd:
P0=display[5];break;//5
case0xbd:
P0=display[6];break;//6
case0x7d:
P0=display[7];break;//7
case0xeb:
P0=display[8];break;//8
case0xdb:
P0=display[9];break;//9
case0xbb:
P0=display[10];break;//a
case0x7b:
P0=display[11];break;//b
case0xe7:
P0=display[12];break;//c
case0xd7:
P0=display[13];break;//d
case0xb7:
P0=display[14];break;//e
case0x77:
P0=display[15];break;//f
}
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
{
ucharcord_h,cord_l;//行列值中间变量
P2=0x0f;//行线输出全为0
cord_h=P2&0x0f;//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
delay(100);//去抖
if(cord_h!
=0x0f)
{
cord_h=P2&0x0f;//读入列线值
P2=cord_h|0xf0;//输出当前列线值
cord_l=P2&0xf0;//读入行线值
return(cord_h+cord_l);//键盘最后组合码值
Speak();
}
}
return(0xff);//返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
voiddelay(uinti)//延时函数
{
while(i--);
}
7、串口通信
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharidatatrdata[]={'1','2','3','4','5','6','7','8',0x0d,0x0a,0x00};
ucharidatatrdata1[]={'Y','Z','2','0','0',0x0d,0x0a,0x00};
/******************************************/
/*主程序*/
/******************************************/
main()
{
uchari;
uintj;
SCON=0x40;//串口方式1
PCON=0;//SMOD=0
REN=1;//允许接收
TMOD=0x20;//定时器1定时方式2
TH1=0xf3;//12MHz2400波特率
TL1=0xf3;
TR1=1;//启动定时器
while
(1)
{
i=0;
while(trdata[i]!
=0x00)
{
SBUF=trdata[i];
while(TI==0);
TI=0;
i++;
}
for(j=0;j<50000;j++);
i=0;
while(trdata1[i]!
=0x00)
{
SBUF=trdata1[i];
while(TI==0);
TI=0;
i++;
}
for(j=0;j<50000;j++);
}
}
8、LCD1602液晶显示
#include
#defineuintunsignedint
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
voidinit();
voidwrite_com(uint);
voidwrite_dat(uint);
voiddelay(uintz);
uintnum;
chartable[]="yanyanzhong";
voidmain()
{
init();
for(num=0;num<13;num++)
{
write_dat(table[num]);
//delay(500);
}
while
(1);
}
voidinit()//初始化
{
write_com(0x38);//显示设置
write_com(0x0c);//光标不闪烁
write_com(0x06);//写入字符光标右移
write_com(0x01);//清屏
write_com(0x80);//设置数据指针
}
voidwrite_com(uinta)//写指令
{
RS=0;
RW=0;
P0=a;
delay(5);
E=1;
delay(5);
E=0;
}
voidwrite_dat(uintb)//写数据
{
RS=1;
RW=0;
P0=b;
delay(5);
E=1;
delay(5);
E=0;
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
9、LCD12864显示汉字
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitPSB=P2^3;
ucharcodetable[]={"^_^温度湿度加速度^_^"};
voidread();
voidwrite(uchar,bit);
voidwritestring(uchar,uchar,uchar*p);
voidinit();
voidmain()
{
init();
writestring(0,0,table);
writestring(3,3,"小豆豆儿");
while
(1);
}
voidread()//读忙函数
{
uchari=255;
P0=0xff;
RS=0;
RW=1;
E=1;
while((i--)&&(P0&0x80));//检测数据口高位,0为空闲
E=0;
}
voidwrite(uchardat,bitcommand)//写函数
{
read();
P0=dat;
RS=command;
RW=0;
E=1;
_nop_();
E=0;
}
voidinit()//初始化
{
PSB=1;//串并口选择,选并口
write(0x38,0);//8位点阵显示
_nop_();
_nop_();
write(0x01,0);
_nop_();
write(0x0c,0);//开显示关光标
}
voidwritestring(ucharx,uchary,uchar*p)//写字符串
{
if(x==1)
x=2;
elseif(x==2)
x=1;
write(0x80+8*x+y,0);
while(*p)
{
write(*p,1);
p++;
}
}
10、DS18B20测温度
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P3^4;
sbitledlk=P1^0;
sbitsmglk=P1^1;
sbitsmgbitlk=P1^2;
uinttemp;
voiddelay(uintms)
{
uinti,j;
for(j=0;j for(i=0;i<120;i++); } voiddelayus(uintus) { uinti,j; for(j=0;j for(i=0;i<12;i++); } voidshowsmg(ucharsmg,ucharvalue) { ucharcodetablesmg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x80}; smglk=1; P2=tablesmg[smg]; smglk=0; smgbitlk=1; P2=table[value]; smgbitlk=0; delay(3); } voiddsreset(void) { DS=0; delayus(10); DS=1; delayus(10); } bittmpreadbit(void) { uinti; bitdat; DS=0; DS=1; dat=DS; delayus (1); return(dat); } uchartmpread(void) { uchari,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } voidtmpwritebyte(uchardat) { uinti; ucharj; bittestb; for(j=1;j<=8;j++) { te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 实例