单片机程序大全.docx

上传人:b****5 文档编号:6870021 上传时间:2023-01-11 格式:DOCX 页数:20 大小:19.92KB
下载 相关 举报
单片机程序大全.docx_第1页
第1页 / 共20页
单片机程序大全.docx_第2页
第2页 / 共20页
单片机程序大全.docx_第3页
第3页 / 共20页
单片机程序大全.docx_第4页
第4页 / 共20页
单片机程序大全.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机程序大全.docx

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

单片机程序大全.docx

单片机程序大全

独立按键

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitP27=P2^7;

sbitK5=P1^4;

sbitfmq=P3^6;

ucharnum;

unsignedcharcodes8[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()//产生1KHZ频率声音的函数

{

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

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

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

sbitP27=P2^7;

unsignedcharcodetable[]={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

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitP27=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()//产生1KHZ频率声音的函数

{

fmq=0;

delay500us();

fmq=1;

delay500us();

}

/**********************************************************

键盘扫描子函数

**********************************************************/

ucharkeyscan()

{

ucharscan1,scan2,keycode,j;

P1=0xf0;

scan1=P1;

if((scan1&0xf0)!

=0xf0)//判键是否按下

{

delay1ms(20);//延时20ms

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

}

}

}

}

else

P1=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

#defineuintunsignedint

#defineucharunsignedchar

sbitdula=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

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharaa,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=0X01;//设定定时器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

//用定时器T0的中断控制1位LED闪烁

#include//包含51单片机寄存器定义的头文件

sbitD0=P0^0;//将D0位定义为P0.0引脚

unsignedinti;

/**************************************************************

函数功能:

主函数

**************************************************************/

voidmain(void)

{

i=0;

EA=1;//开总中断

ET0=1;//定时器T0中断允许

TMOD=0x01;//使用定时器T0的模式1

TH0=(65536-50000)/256;//定时器T0的高8位赋初值

TL0=(65536-50000)%256;//定时器T0的高8位赋初值

TR0=1;//启动定时器T0

while

(1);//无限循环等待中断

}

/**************************************************************

函数功能:

定时器T0的中断服务程序

**************************************************************/

voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数

//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器

{

i=i+1;

if(i==40){

D0=~D0;//按位取反操作,将P0.0引脚输出电平取反

i=0;

}

TH0=(65536-50000)/256;//定时器T0的高8位重新赋初值

TL0=(65536-50000)%256;//定时器T0的高8位重新赋初值

}

中断控制LED2

#include//包含52单片机寄存器定义的头文件

/*******************************************

函数功能:

主函数

******************************************/

voidmain(void)

{

EA=1;//开放总中断

EX0=1;//允许使用外中断

IT0=1;//选择负跳变来触发外中断

P0=0xff;//关闭所有P0口的LED灯

while

(1);//无限循环,

}

/**************************************************************

函数功能:

外中断T0的中断服务程序

**************************************************************/

voidit0(void)interrupt0using0//外中断0的中断编号为0

{P0=~P0;//每产生一次中断请求,P0取反一次。

}

串口查询

#include

#include

unsignedchartmp;

voidsend_char(unsignedchartxd);

main()

{

TMOD=0x20;//定时器1工作于8位自动重载模式,用于产生波特率

TH1=TL1=0xFD;//波特率9600

SCON=0x50;//设定串行口工作方式1允许接收,相当于下面三句

//SM0=0;

//SM1=1;

//REN=1;

PCON=0x00;//波特率不倍增

TR1=1;//启动定时器1

while

(1)

{

if(RI==1)//是否有数据到来

{

RI=0;

tmp=SBUF;//暂存接收到的数据

P0=tmp;//数据传送到P0口

send_char(tmp);//回传接收到的数据

}

}

}

voidsend_char(unsignedchartxd)

//传送一个字符

{

SBUF=txd;

while(!

TI);//等特数据传送

TI=0;//清除数据传送标志

}

串口通讯

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharidatatrdata[]={'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".0592MHz

TL1=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);//让从计算机上传到单片机的数据,传回的计算机显示

}

}

//用LED数码管显示计数器对T0的计数值

#include//包含52单片机寄存器定义的头文件

unsignedcharTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表

unsignedcharx;

sbitP34=P3^4;

voiddelay1ms(unsignedinti)

{

unsignedcharj;

while(i--)

{

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

{;}

}

}

voidDisplay(unsignedcharx)

{

P2=0xdf;//P2.6引脚输出低电平,DS6点亮

P0=Tab[x/100];//显示十位

delay1ms(5);

P2=0xbf;//P2.6引脚输出低电平,DS6点亮

P0=Tab[x%100/10];//显示十位

delay1ms(5);

P2=0x7f;//P2.7引脚输出低电平,DS7点亮

P0=Tab[x%10];//显示个位

delay1ms(5);

P2=0xff;

}

/*******************************************

函数功能:

主函数

******************************************/

voidmain(void)

{

TMOD=0x06;//TMOD=00000110B,使用计数器T0的模式2

EA=1;//开总中断

ET0=1;//允许定时器T0的中断

EX0=1;//允许外中断INT0

IT0=1;//INT0为下负脉冲触发方式

TR0=1;//启动T0

TH0=TL0=256-1;//计数器T0高8位赋初值255

while

(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

#defineuintunsignedint

ucharcodetrdata[]={'R','I','C','H','M','C','U',0x

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

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1