您的当前位置:首页正文

单片机程序大全

2023-07-18 来源:钮旅网
独立按键

#include

#define uchar unsigned char #define uint unsigned int sbit P27=P2^7; sbit K5=P1^4; sbit fmq=P3^6; uchar num; unsigned

char

code

s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay1ms(uint i) {uchar j; while(i--)

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

void beep() //产生1KHZ频率声音的函数 { fmq=0; delay500us();

1

fmq=1;

delay500us(); }

void delay500us() {

unsigned char j;

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

void main() { uchar t; 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; }

2

while(!K5);//等待按键释放 } }

P0=s8[num]; } }

#include

#define uchar unsigned char //数据类型的宏定义 #define uint unsigned int //数据类型的宏定义 sbit P27=P2^7; unsigned

char

code

table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF}; //共阳数码管显示字型码数组 1011 1111 \"-\" void delay1ms(uint i) { uchar j; while(i--) {

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

3

} }

void display(unsigned char i) {

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

void main(void) {

unsigned char temp; display(16); //初始显示 \"-\" while(1) {

P1=0xff; //先向P1口写1;端口读状态 P1=0xf0; temp=P1; if(temp!=0xf0) {

delay1ms(15); if(temp!=0xf0) {

P1=0xfe;

4

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

5

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。

根据线反转法扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。 开机时,数码管显示“-”。*/

6

#include #include #define uchar unsigned char #define uint unsigned int sbit P27=P2^7; sbit fmq=P3^6; uchar key;

unsigned char code disp_code[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; unsigned char code key_code[]={

0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; void delay1ms(uint i) { uchar j; while(i--) {

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

7

void delay500us() {

unsigned char j;

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

void beep() //产生1KHZ频率声音的函数 { fmq=0; delay500us(); fmq=1;

delay500us(); }

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

键盘扫描子函数

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

uchar keyscan() {

uchar scan1,scan2,keycode,j; P1=0xf0;

8

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 输入状态

9

return (16);//\"-\" } main() {

uchar tt; 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); } } }

10

中断

#include

#define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num;

uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint z); void main() {

EA=1;//开总中断 EX0=1;//开外部中断0 //IT0=1; //TCON=0x01; wela=1;//11101010 P0=0xea;

11

wela=0; while(1) {

for(num=0;num<16;num++) { d1=1; dula=1; P0=table[num]; dula=0; delay(1000); } } }

void delay(uint z) {

uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void exter0() interrupt 0 { d1=0;

12

} 定时器

#include #include #define uint unsigned int #define uchar unsigned char uchar aa,num; sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void main() { num=0; aa=0;

//TMOD=0X00;//设定定时器0为工作方式0 TMOD=0X01;//设定定时器0为工作方式1 //TH0=(8192-5000)/32; //TL0=(8192-5000)%32;

13

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;

14

} } }

void timer0() interrupt 1 {

//TH0=(8192-5000)/32; //TL0=(8192-5000)%32; TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; }

中断控制LED

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

#include // 包含51单片机寄存器定义的头文件 sbit D0=P0^0; //将D0位定义为P0.0引脚 unsigned int i;

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

函数功能:主函数

**************************************************************/ void main(void)

15

{ 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的中断服务程序

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

void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数

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

16

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单片机寄存器定义的头文件 /******************************************* 函数功能:主函数

******************************************/ void main(void) {

EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 P0=0xff; //关闭所有P0口的LED灯 while(1); //无限循环, }

17

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

函数功能:外中断T0的中断服务程序

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

void it0(void) interrupt 0 using 0 //外中断0的中断编号为0

{ P0=~P0; //每产生一次中断请求,P0取反一次。} 串口查询

#include #include unsigned char tmp;

void send_char(unsigned char txd); main() {

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

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

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

18

//REN=1;

PCON =0x00; // 波特率不倍增 TR1 = 1; // 启动定时器1 while(1) {

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

RI = 0;

tmp = SBUF; // 暂存接收到的数据 P0 = tmp; // 数据传送到P0口 send_char(tmp); // 回传接收到的数据 } } }

void send_char(unsigned char txd) // 传送一个字符 {

SBUF = txd;

while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 }

19

串口通讯

#include

#define uchar unsigned char #define uint unsigned int uchar

idata

trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00}; sbit K1=P3^2; //对应开发板K1按键

/*-------------------------------------------------------------*/ //串口初始化

void UART_Init(void) {

SCON = 0x50; //串口工作方式为1 , 串行允许接收 //SM0=0; //SM1=1; //REN=1;

TMOD = 0x20; //定时器1 工作在方式2 //PCON = 0x80; //SMOD = 1; 波特率加倍

TH1 = 0xfd; //波特率 9600bps fosc=\"11\".0592MHz TL1 = 0xfd;

ES = 1; //开串口中断

20

TR1 = 1; //允许定时器1工作 EA = 1; //开总中断 }

void delay1ms(uint i) { uchar j; while(i--) {

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

/*-------------------------------------------------------------*/

//串口发送一个字节

void Uart_SendChar(unsigned char dat) {

SBUF = dat; //待发送的数据写入缓冲区 while(!TI); //等待发送完成 TI = 0; //清零发送标志位

21

}

/*-------------------------------------------------------------*/

//串口发送一个字符串 void Uart_SendString() { uchar i=0;

while(trdata[i]!=0x00) {

SBUF=trdata[i]; while(!TI); TI=0; i++; } }

/*-------------------------------------------------------------*/ //主函数 void main(void) {

UART_Init(); //初始化串口 while(1)

22

{ if(K1==0) {

delay1ms(20); if(K1==0) {

Uart_SendString(); //发送数据 while(!K1); //等待按键释放 } } } }

/*-------------------------------------------------------------*/

//串口接收中断函数

void INT_UartRcv(void) interrupt 4 {

unsigned char Rcv = 0;

if(RI) //查询接收标志位(有数据发送过来时置为1) {

RI = 0; //接收标志位清零 Rcv = SBUF; //存储缓冲区的数据

23

P0=SBUF;

Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示 } }

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

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

char

Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表 unsigned char x; sbit P34=P3^4;

void delay1ms(unsigned int i) {

unsigned char j; while(i--) {

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

void Display(unsigned char x)

24

{

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

/******************************************* 函数功能:主函数

******************************************/ void main(void) {

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

EA=1; //开总中断

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

25

IT0=1; //INT0为下负脉冲触发方式 TR0=1; //启动T0

TH0=TL0=256-1; //计数器T0高8位赋初值 255 while(1) //无限循环,不停地将TL0计数结果送P1口 {

//x=TL0; Display(x); } }

//INT0终端函数

void clear0() interrupt 0 { x=0;}

//T0 计数器中断

void Key_counter() interrupt 1 {

if(P34==0){ delay1ms(20); if(P34==0){

x=(x+1)%1000; //因为是3位数码管显示 所以要把计的数控制在1000以内(000~999) }

26

} }

外中断字符查询 #include #define uchar unsigned char #define uint unsigned int uchar

code

trdata[]={'R','I','C','H','M','C','U',0x0d,0x0a,0x00}; void delay1ms(uint i) { uchar j; while(i--) {

for(j=0;j<115;j++) //1ms基准延时程序 {;} } } main() { uchar i;

27

SCON= 0x40; //串口方式1不允许接收 //SM0=0; //SM1=1; //REN=0;

PCON=0x80; //SMOD=0 TMOD= 0x20; //定时器1定时方式2 TH1= 0xff; //11.0592M 57600波特率 TL1= 0xff;

TR1= 1; //启动定时器 while(1) { i=0;

while(trdata[i]!=0x00) {

SBUF=trdata[i]; while(!TI); TI=0; i++; }

delay1ms(1000); }

28

}

29

因篇幅问题不能全部显示,请点此查看更多更全内容