单片机程序大全.docx

上传人:b****4 文档编号:4134447 上传时间:2023-05-06 格式:DOCX 页数:23 大小:54KB
下载 相关 举报
单片机程序大全.docx_第1页
第1页 / 共23页
单片机程序大全.docx_第2页
第2页 / 共23页
单片机程序大全.docx_第3页
第3页 / 共23页
单片机程序大全.docx_第4页
第4页 / 共23页
单片机程序大全.docx_第5页
第5页 / 共23页
单片机程序大全.docx_第6页
第6页 / 共23页
单片机程序大全.docx_第7页
第7页 / 共23页
单片机程序大全.docx_第8页
第8页 / 共23页
单片机程序大全.docx_第9页
第9页 / 共23页
单片机程序大全.docx_第10页
第10页 / 共23页
单片机程序大全.docx_第11页
第11页 / 共23页
单片机程序大全.docx_第12页
第12页 / 共23页
单片机程序大全.docx_第13页
第13页 / 共23页
单片机程序大全.docx_第14页
第14页 / 共23页
单片机程序大全.docx_第15页
第15页 / 共23页
单片机程序大全.docx_第16页
第16页 / 共23页
单片机程序大全.docx_第17页
第17页 / 共23页
单片机程序大全.docx_第18页
第18页 / 共23页
单片机程序大全.docx_第19页
第19页 / 共23页
单片机程序大全.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机程序大全.docx

《单片机程序大全.docx》由会员分享,可在线阅读,更多相关《单片机程序大全.docx(23页珍藏版)》请在冰点文库上搜索。

单片机程序大全.docx

单片机程序大全

独立按键

#include〈reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitP27=P2^7;

sbitK5=P1^4;

sbitfmq=P3^6;

ucharnum;

code

unsignedchar

s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

voiddelay1ms(uinti)

{ucharj;

while(i-—)

{for(j=0;j〈115;j++)//1ms基准延时程序

{;}

}

Voidbeep()Il产生IKHZ频率声音的函数

fmq=0;

delay500us();

fmq=1;

delay500us();

}

voiddelay500us()

unsignedcharj;

for(j=0;j〈57;j++)//500us基准延时程序{;}

voidmain()

{uchart;

P27=0;

while

(1){if(K5==0){

delay1ms(15);

if(K5==0){

for(t=0;t〈100;t++)

{beep();}num=num+1;

if(num==16){

num=0;

while(!

K5);//等待按键释放

}

P0=s8[num];

}

#include〈reg52。

h>

#defineucharunsignedchar//数据类型的宏定义#defineuintunsignedint//数据类型的宏定义

sbitP27=P2^7;

code

unsignedchar

table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};

//共阳数码管显示字型码数组10111111"—”

voiddelay1ms(uinti)

ucharj;

while(i-—)

{

for(j=0;j<115;j++);//1ms基准延时程序

}

voiddisplay(unsignedchari)

P27=0;//选通最有端的数码管显示P0=table[i];//显示i参数传来的字型码}

voidmain(void)

unsignedchartemp;

display(16);//初始显示"—”while

(1)

P1=0xff;//先向P1口写1;端口读状态

P1=0xf0;

temp=P1;

if(temp!

=0xf0)

{

delay1ms(15);

if(temp!

=0xf0)

{

P1=0xfe;

temp=P1;

switch(temp)

{

case(0xee):

display(0);break;

case(0xde):

display

(1);break;

case(0xbe):

display

(2);break;

case(0x7e):

display(3);break;

P1=0xfd;

temp=P1;

switch(temp)

case(0xed):

display(4);break;

case(0xdd):

display(5);break;

case(0xbd):

display(6);break;

case(0x7d):

display(7);break;

P1=0xfb;

temp=P1;switch(temp){

case(0xeb):

display(8);break;

case(0xdb):

display(9);break;

case(0xbb):

display(10);break;

case(0x7b):

display(11);break;

}

P1=0xf7;

temp=P1;

switch(temp)

{

case(0xe7):

display(12);break;

case(0xd7):

display(13);break;

case(0xb7):

display(14);break;

case(0x77):

display(15);break;

}

}

从而得到

/*行线接P1。

0—P1。

3,列线接P1。

4-P1。

7。

根据线反转法扫描键盘返回的键值编码查键值编码表,键值并送数码管显示。

开机时,数码管显示“-"。

*/

#include

h>#include

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取反一次。

}串口查询

#include

h〉

#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;

}

串口通讯

#include

h>

#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);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2