h>#defineucharunsignedchar#defineuintunsignedintsbitP27=P2^7;sbitfmq=P3^6;
ucharkey;
unsignedcharcodedisp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};unsignedcharcodekey_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
voiddelay1ms(uinti)
{ucharj;while(i——){for(j=0;j<115;j++)//1ms基准延时程序{;}
voiddelay500us()
{unsignedcharj;
for(j=0;j<57;j++)//500us基准延时程序{;}
}
Voidbeep()//产生IKHZ频率声音的函数
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
[******************************************************
****
键盘扫描子函数
*******************************************************
***/
ucharkeyscan()
{
ucharscan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!
=0xf0)//
{
delay1ms(20);//scan1=P1;
if((scan1&0xf0)!
=0xf0)//
{
P1=0x0f;//线反转法的核心scan2=P1;
keycode=scan1|scan2;//for(j=0;j<=15;j++)
{
if(keycode==key_code[j])//
{
key=j;return(key);
}
}
}
判键是否按下
延时20ms二次判键是否按下
组合成键编码
查表得键值
}elseP1=0xff;//P1口写1输入状态
return(16);//"-"
}
main()
{
uchartt;
P0=0xbf;
数码管显示"-"
P27=0;//
P1=0xff;
while
(1)
{
P1=0xf0;
if((P1&0xf0)!
=0xf0){
keyscan();
P0=disp_code[key];for(tt=0;tt<200;tt++){beep();}
fmq=1;delay1ms(200);
}
}
中断
#include〈reg52.h〉
#defineuintunsignedint#defineucharunsignedcharsbitdula=P2^6;
sbitwela=P2^7;
sbitd1=P1^0;
ucharnum;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(uintz);
voidmain()
{
EA=1;//开总中断
EX0=1;//开外部中断0
//IT0=1;
//TCON=0x01;wela=1;//11101010
P0=0xea;
wela=0;
while
(1)
{
for(num=0;num<16;num++)
{d1=1;dula=1;
P0=table[num];dula=0;delay(1000);
}
}
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x〉0;x-—)for(y=110;y〉0;y--);
}
voidexter0()interrupt0
{
d1=0;
}
定时器
#include〈reg52。
h〉
#include〈intrins。
h>#defineuintunsignedint#defineucharunsignedcharucharaa,num;
sbitdula=P2^6;
sbitwela=P2^7;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidmain()
{
num=0;
aa=0;
//TMOD=0X00;//设定定时器0为工作方式0
TMOD=OXo1;/股定定时器0为工作方式1
//TH0=(8192—5000)/32;
//TL0=(8192-5000)%32;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
wela=1;
P0=0x24;
wela=0;
dula=1;
P0=0x3f;
dula=0;
while
(1)
{
if(aa==20)
{
aa=0;
num++;
if(num==10)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
voidtimer0()interrupt1
{
//TH0=(8192—5000)/32;
//TL0=(8192-5000)%32;
TH0=(65536—50000)/256;
TL0=(65536-50000)%256;
aa++;
}
中断控制LED
Zz用定时器To的中断控制1位LED闪烁
#include〈reg51。
h〉//包含51单片机寄存器定义的头文件
SbitD0=P0^0;ZZ将D0位定义为P0.0引脚
unsignedinti;
[******************************************************
********
函数功能:
主函数
*******************************************************
voidmain(void)
while
(1);//无限循环等待中断
}
/******************************************************
********
函数功能:
定时器T0的中断服务程序
*******************************************************
*******/
voidTimeo(void)interrupt1usingo//“interrupt”声明
函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示
使用第o组工作寄存器
i=i+1;
if(i==40){
D0=~D0;//按位取反操作,将P0.0引脚输出电平取反i=0;
}
TH0=(65536—50000)/256;//定时器T0的高8位重新赋初值
TL0=(65536—50000)%256;Zz定时器To的高8位重新赋初值
}
中断控制LED2
#include〈reg52。
h〉ZZ包含52单片机寄存器定义的头文件Z*******************************************
函数功能:
主函数******************************************Zvoidmain(void)
{
EA=1;ZZ
开放总中断
EXo=1;ZZ
允许使用外中断
ITo=1;ZZ
选择负跳变来触发外中断
Po=oxff;ZZ
关闭所有P0口的LED灯
while
(1);ZZ
无限循环,
****************************************************
********
函数功能:
外中断T0的中断服务程序
*******************************************************
*******/
voidit0(void)interrupt0using0//外中断0的中断编号
为0
{P0=~P0;//每产生一次中断请求,P0取反一次。
}串口查询
#includeh〉
#includeunsignedchartmp;
{
TMOD=0x20;用于产生波特率
TH1=TL1=0xFD;
SCON=0x50;相当于下面三句
//SM0=0;
voidsend_char(unsignedchartxd);main()
//定时器1工作于8位自动重载模式,
//波特率9600
//设定串行口工作方式1允许接收,
//SM1=1;
//REN=1;
PCON=0x00;//波特率不倍增
TR1=1;//启动定时器1
while
(1)
{
if(RI==1)
{
RI=0;
tmp=SBUF;
P0=tmp;send_char(tmp);
}
}
}
//是否有数据到来
//暂存接收到的数据
//数据传送到P0口
//回传接收到的数据
voidsend_char(unsignedchartxd)//传送一个字符{
//等特数据传送
//清除数据传送标志
SBUF=txd;
while(!
TI);TI=0;
}
串口通讯
#includeh>
#defineucharunsignedchar
#defineuintunsignedint
idata
uchar
trdata[]={'R',’I',’C','H',’M’,'C’,'U’,’R’,'Z’,'-’,'5','1','V’,'2’,’。
',’0',0x0d,0x0a,0x00};
sbitK1=P3^2;//对应开发板K1按键
/*
*/
//串口初始化
voidUART_Init(void)
{
SCON=0x50;//串口工作方式为1,串行允许接收//SM0=0;
//SM1=1;
//REN=1;
TMOD=0x20;//定时器1工作在方式2
//PCON=0x80;//SMOD=1;波特率加倍
TH1=0xfd;//波特率9600bpsfosc=”11”。
0592MHzTL1=0xfd;
ES=1;//开串口中断
TR1=1;//允许定时器1工作
EA=1;//开总中断
}
voiddelay1ms(uinti)
{
ucharj;
while(i--)
{
for(j=0;j<115;j++)//1ms基准延时程序
{}
}
}
/*
*/
//串口发送一个字节
voidUart_SendChar(unsignedchardat)
{
SBUF=dat;//待发送的数据写入缓冲区while(!
TI);//等待发送完成
TI=0;//清零发送标志位
/*
*/
//串口发送一个字符串
voidUart_SendString()
{uchar
i=0;
while(trdata[i]!
=0x00)
{
SBUF=trdata[i];
while(!
TI);
TI=0;
i++;
}
}
/*
*/
//主函数
voidmain(void)
{
UART_Init();//初始化串口
while
(1)
{
if(K1==0)
{delay1ms(20);
if(K1==0)
{
Uart_SendString();//发送数据while(!
K1);//等待按键释放
}
}
}
}
/*
*/
//串口接收中断函数
voidINT_UartRcv(void)interrupt4
{
unsignedcharRcv=0;
if(RI)//查询接收标志位(有数据发送过来时置为1)
{
RI=0;//接收标志位清零
Rcv=SBUF;//存储缓冲区的数据
P0=SBUF;
Uart_SendChar(Rcv);//让从计算机上传到单片机的数据回的计算机显示
}
}
Zz用LED数码管显示计数器对To的计数值
char
#include〈reg52.h〉//包含52单片机寄存器定义的头文件unsigned
Tab[]={oxco,oxf9,oxa4,oxbo,ox99,ox92,ox82,oxf8,ox8o,ox9o};ZZ段码表
unsignedcharx;
sbitP34=P3^4;
voiddelay1ms(unsignedinti)
{
unsignedcharj;
while(i——)
{
for(j=o;j〈115;j++)ZZ1ms基准延时程序
{;}}
}
voidDisplay(unsignedcharx)
P2=0xdf;//P2。
6
引脚输出低电平,
DS6点亮
P0=Tab[x/100];//
delay1ms(5);
P2=0xbf;//P2.6
P0=Tab[x%100/10];
delay1ms(5);
P2=0x7f;//P2.7
P0=Tab[x%10];//
delay1ms(5);
P2=0xff;
//
显示十位
引脚输出低电平,
显示十位
引脚输出低电平,
显示个位
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
TMOD=0x06;
//TMOD=00000110B,
模式2
EA=1;
//
开总中断
ET0=1;
//
EX0=1;
//
DS6点亮
DS7点亮
使用计数器T0的
允许定时器T0的中断
允许外中断INT0
IT0=1;//INT0为下负脉冲触发方式
TR0=1;//启动T0
TH0=TL0=256—1;//计数器T0高8位赋初值255while
(1)//无限循环,不停地将TL0计数结果送P1口{
//x=TL0;
Display(x);
}
}
//INT0终端函数
voidclear0()interrupt0
{x=0;}
//T0计数器中断
voidKey_counter()interrupt1
{
if(P34==0){
delay1ms(20);
if(P34==0){
x=(x+1)%1000;//因为是3位数码管显示所以要把计
的数控制在1000以内(000~999)
}
}外中断字符查询
#include
#defineucharunsignedchar
code
#defineuintunsignedintuchartrdata[]={'R’,’I’,'C',’H','M’,’C','U’,0x0d,0x0a,0x00};
voiddelay1ms(uinti)
{
ucharj;
while(i——)
{
for(j=0;j〈115;j++)//1ms基准延时程序{;}
}
}
main()
{
uchari;
SCON=0x40;
//
串口方式1不允许接收
//SM0=0;
//SM1=1;
//REN=0;
PCON=0x80;//SMOD=0
TMOD=0x20;//定时器1定时方式2
TH1=0xff;//11。
0592M57600波特率TL1=0xff;
TR1=1;//启动定时器
while
(1)
{
i=0;
while(trdata[i]!
=0x00)
{
SBUF=trdata[i];
while(!
TI);
TI=0;
i++;
}
delay1ms(1000);