单片机入门文档格式.docx
《单片机入门文档格式.docx》由会员分享,可在线阅读,更多相关《单片机入门文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
在数码管上显示秒数
14)综合实验3——分秒表:
前两位显示分钟,后两位显示秒钟,中间小数点0.5S闪烁
15)综合实验4——方波信号发生器:
10~200Hz,步长10Hz,P23输出,数码管显示频率值,UP:
频率加,DN:
频率减。
16)综合实验5——简易跑表:
前两位数码管显示秒数,后两位显示百分秒;
按一下M键开始计时,再按一下停止;
DN键清零
17)综合实验6——可多段计数的跑表:
按一下M键开始计时,每再按一下记下当前计数值,最多记四段;
按一下UP键停止,再按一下UP键,第一个指示灯亮,并显示第一段计数值;
继续按UP键,下一个指示灯亮,并显示下一段计数值;
1.摘要:
HELLOWORLD:
把P23置低,点亮一个LED
#include"
reg52.h"
sbitP23=P2^3;
//定义LED指示灯的IO口
voidmain()
{
P23=0;
//P23口置低,点亮一个LED
while
(1);
}
2.摘要:
延时控制IO口P2.3实现LED灯的闪烁
inti;
//计时变量
while
(1)
{
for(i=0;
i<
30000;
i++);
//延时
P23=!
P23;
//指示灯IO口反转
}
3.摘要:
使用定时器0控制LED灯(P23口)1秒间隔的闪烁
#defineTHCO0xee//11.0592MHZ晶振
#defineTLCO0x0//定时5ms时间常数值
//LED指示灯IO口定义
TMOD=0x11;
//设置定时器0工作模式,16位计数模式
TH0=THCO;
TL0=TLCO;
TR0=1;
//启动定时器
ET0=1;
//使能定时器中断
EA=1;
//开总中断
//interruptN:
表示中断服务子程序:
//interrupt0:
表示外部中断0中断服务子程序
//interrupt1:
表示定时器0中断服务子程序
//interrupt2:
表示外部中断1中断服务子程序
//interrupt3:
表示定时器1中断服务子程序
//interrupt4:
表示串口中断服务子程序
voidtimer0()interrupt1//定时器中断服务子程序
staticunsignedcharcount=0;
//软计时变量定义
count++;
if(count>
=200)//1S时间到
count=0;
//LED灯反转
}
4.摘要:
使用定时器控制四个LED以流水灯形式闪烁
sbitP24=P2^4;
sbitP25=P2^5;
sbitP26=P2^6;
staticunsignedcharcount=0,Bit=0;
=50)//250ms更换LED灯亮
Bit++;
if(Bit>
=4)Bit=0;
P2=P2|0x78;
//关闭所有LED
switch(Bit)//打开需要点亮的灯
case0:
break;
case1:
P24=0;
case2:
P25=0;
case3:
P26=0;
5.摘要:
使用外部中断0(ENT按键,接P32口)控制LED亮灭
{
IT0=1;
//外部中断0连沿触发方式
EX0=1;
//使能外部中断0
EA=1;
//开部中断
P23=0;
//指示灯初始为亮
while
(1);
voidint0()interrupt0//外部中断0程序入口
P23=!
6.摘要:
四个按键控制四个LED灯对应亮灭
#defineTHCO0xee//5ms时间常数设置
#defineTLCO0x0
//四个指示灯IO口定义
sbitP20=P2^0;
//四个按键接口,0有效,即低电平,键按下
sbitP21=P2^1;
sbitP22=P2^2;
sbitP32=P3^2;
{
TMOD=0x11;
//定时器0初始化
TH0=THCO;
ET0=1;
P2=0x07;
//准双向口按键检测之前先置1,同时指示灯亮
voidtimer0()interrupt1
//静态变量,退出函数后,值保留
if(P20==0||P21==0||P22==0||P32==0)
count++;
if(count>
=30)//消抖处理
{
count=0;
if(P20==0)P23=!
//按键按下,指示灯反转
elseif(P21==0)P24=!
P24;
elseif(P22==0)P25=!
P25;
elseif(P32==0)P26=!
P26;
}
elsecount=0;
7.摘要:
使用延时方法,控制蜂鸣器发生
sbitvoice=P1^4;
//蜂鸣器控制IO口
unsignedinti;
for(i=0;
2000;
voice=!
voice;
//延时反转
8.摘要:
蜂鸣器两种频率输出,发生报警声
#defineTHCO0xee
//蜂鸣器IO口定义
unsignedcharff=10;
//频率设置,软计时,输出频率的周期为ff*5*2ms
P2=0x0f;
while
(1);
=200)//1S钟切换一次频率
if(ff==10)ff=20;
//5Hz
elseif(ff==20)ff=10;
//10Hz
if(count%ff==0)//周期到,IO口反转
{
9.摘要:
播放音乐:
两只老虎
#include<
reg52.h>
intrins.h>
#defineFREQ11059200
unsignedcharcodemusic_tab[]={//两只老虎,高4位为音乐节拍,低4位为音符
0x31,0x32,0x33,0x31,0x31,0x32,0x33,0x31,0x33,0x34,0x45,0x33,0x34,0x45,
0x25,0x16,0x25,0x14,0x33,0x31,0x25,0x16,0x25,0x14,0x33,0x31,
0x31,0x35,0x41,0x31,0x35,0x41,
0
};
unsignedcharcodemusic_l_tab[8]={0,1,2,3,4,6,8,16};
//节拍延时单位
unsignedcharcodemusic_freq_tab[16]={
0xff,0xea,//0休止符
255-FREQ/24/1049/256,//1do高字节//255-FREQ/24/x/256
255-FREQ/24/1049%256,//1do低字节//256-FREQ/24/x%256
255-FREQ/24/1178/256,256-FREQ/24/1178%256,//2re
255-FREQ/24/1322/256,256-FREQ/24/1322%256,//3mi
255-FREQ/24/1400/256,256-FREQ/24/1400%256,//4fa
255-FREQ/24/1572/256,256-FREQ/24/1572%256,//5suo
255-FREQ/24/1665/256,256-FREQ/24/1665%256,//6la
255-FREQ/24/1869/256,256-FREQ/24/1869%256,//7xi
unsignedchartemp_TH1;
unsignedchartemp_TL1;
sbitPIN_MSC=P1^4;
//音乐输出端口//
voidmusic_delay(unsignedcharx);
//音乐节拍延时
voidmusic_play(unsignedchar*msc);
//播放音乐子程序
//---------------------------------------------------------------------------//
voidmusic_int_t1(void)interrupt3using1//定时中断1//
PIN_MSC=~PIN_MSC;
TH1=temp_TH1;
TL1=temp_TL1;
voidmusic_delay(unsignedcharn)//延时125*n毫秒
unsignedchari=125,j;
do{
for(j=0;
j<
230;
j++)_nop_();
}while(--i);
}while(--n);
voidmusic_play(unsignedchar*msc)//音乐
unsignedcharmusic_long;
//节拍
unsignedcharmusic_data=0;
//音符数据
temp_TH1=0xff;
temp_TL1=0xea;
//关输出(输出超声波)
TR1=1;
//开T1定时器中断
//---------------------------------------------------------
while(*msc!
=0x00)
music_data=*msc&
0x07;
music_long=*msc>
>
4;
if(music_long!
=0)//是音符
temp_TH1=music_freq_tab[music_data*2];
temp_TL1=music_freq_tab[music_data*2+1];
music_delay(music_l_tab[music_long&
0x07]);
msc++;
TR1=0;
//播放结束
PIN_MSC=1;
//关输出
voidmain(void)//示例
TMOD=0x11;
//TMOD:
定时器1:
模式1:
16位;
定时器2:
16位
TR1=0;
ET1=1;
EA=1;
{
music_delay(10);
//延时
music_play(music_tab);
//播放音乐
10.摘要:
一个数码管上显示数字3
unsignedcharcodeDuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//共阴极数码管,0-9段码表
sbitP10=P1^0;
//第0位数码管
P10=0;
//开位码
P0=Duan[3];
//送段码
11.摘要:
四个数码管上分别显示1234
//共阴极数码管,0-9段码表
unsignedcharData_Buffer[4]={1,2,3,4};
//四个数码管显示数值,数组变量定义
//四个数码管的位码口定义
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
TMOD=0x01;
//定时器0初始化
TL0=TLCO;
TR0=1;
staticunsignedcharBit=0;
//静态变量,退出程序后,值保留
P1|=0x0f;
//先关位码
P0=Duan[Data_Buffer[Bit]];
//开段码
switch(Bit)//送位码
P10=0;
P11=0;
P12=0;
P13=0;
//动态扫描
12.摘要:
ENT键,按键计数,并将结果显示到数码管上
unsignedcharData_Buffer[4]={0,0,0,0};
unsignedintcount=0;
//从0值开始计数
//数码管位码定义
//定时器0用来扫描数码管显示
//外部中断0,边沿触发方式
while
(1);
voidint0()interrupt0
//有键按下,数值加1
9999)count=0;
Data_Buffer[0]=count/1000;
Data_Buffer[1]=count%1000/100;
Data_Buffer[2]=count%100/10;
Data_Buffer[3]=count%10;
//数码管扫描显示
switch(Bit)
}
13.摘要:
秒表:
从上电开始显示工作秒数
unsignedintSec=0;
bitflag=0;
//1S时间到标志
while
(1)
if(flag==1)
flag=0;
Data_Buffer[0]=Sec/1000;
Data_Buffer[1]=Sec%1000/100;
Data_Buffer[2]=Sec%100/10;
Data_Buffer[3]=Sec%10;
=200)//秒计时,定时器定时5ms,计200次为一秒
Sec++;
flag=1;
//更新数码管显示
if(Sec>
9999)Sec=0;
//秒数最大显示为9999,之后从头开始计时
ca