1、单片机程序大全 独立按键#include#define uchar unsigned char#define uint unsigned intsbit P27=P27;sbit K5=P14;sbit fmq=P36;uchar num;unsigned char code s816=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;j115;j+) /1ms基准延时程序 ;void be
2、ep() /产生1KHZ频率声音的函数 fmq=0; delay500us(); fmq=1; delay500us(); void delay500us()unsigned char j; for(j=0;j57;j+) /500us基准延时程序 ; void main() uchar t; P27=0; while(1) if(K5=0) delay1ms(15); if(K5=0) for(t=0;t100;t+) beep(); num=num+1; if(num=16) num=0; while(!K5);/等待按键释放 P0=s8num; #include#define uchar
3、 unsigned char /数据类型的宏定义#define uint unsigned int /数据类型的宏定义sbit P27=P27;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;j115;j+); /1ms基准延时程序 void display(unsigned c
4、har i) P27=0; /选通最有端的数码管显示P0=tablei; /显示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; temp=P1;switch(temp) case(0xee):display(0);break; case(0xde):display(1);break; case(0xbe):di
5、splay(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
6、);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.0P1.3,列线接P1.4P1.7。根据线反转法扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。开机时,数码管显示“”。*/#include #include #define uchar u
7、nsigned char#define uint unsigned intsbit P27=P27;sbit fmq=P36;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;v
8、oid delay1ms(uint i)uchar j; while(i-) for(j=0;j115;j+) /1ms基准延时程序 ; void delay500us()unsigned char j; for(j=0;j57;j+) /500us基准延时程序 ; void beep() /产生1KHZ频率声音的函数 fmq=0; delay500us(); fmq=1; delay500us(); /*键盘扫描子函数*/uchar keyscan() uchar scan1,scan2,keycode,j; P1=0xf0; scan1=P1; if(scan1&0xf0)!=0xf0)
9、/判键是否按下 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_codej) /查表得键值 key=j; return(key); else P1=0xff; /P1口写1 输入状态 return (16);/-main() uchar tt; P0 = 0xbf; P27 =0; /数码管显示- P1 = 0xff; while(1)
10、P1=0xf0; if(P1&0xf0)!=0xf0) keyscan(); P0=disp_codekey; for(tt=0;tt200;tt+) beep(); fmq=1; delay1ms(200); 中断#include#define uint unsigned int #define uchar unsigned char sbit dula=P26;sbit wela=P27;sbit d1=P10;uchar num;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x3
11、9,0x5e,0x79,0x71;void delay(uint z);void main() EA=1;/开总中断 EX0=1;/开外部中断0 /IT0=1; /TCON=0x01; wela=1;/11101010 P0=0xea; wela=0; while(1) for(num=0;num0;x-) for(y=110;y0;y-); void exter0() interrupt 0 d1=0; 定时器#include#include#define uint unsigned int#define uchar unsigned charuchar aa,num;sbit dula=P
12、26;sbit wela=P27;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; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;/开总中断 ET0=1;/开定时器0中
13、断 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=tablenum; dula=0; 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 / 包
14、含51单片机寄存器定义的头文件sbit D0=P00; /将D0位定义为P0.0引脚unsigned int i;/*函数功能:主函数*/void main(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的中断服务程序*/void Time0(void) interrupt
15、 1 using 0 /“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单片机寄存器定义的头文件/*函数功能:主函数*/ void main(void) EA=1; /开放总中断 EX0=1; /允许使用外中断 IT0=1; /选择负跳变来
16、触发外中断 P0=0xff; /关闭所有P0口的LED灯 while(1); /无限循环, /*函数功能:外中断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; /
17、设定串行口工作方式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); / 回传接收到的数据 void send_char(unsigned char txd)/ 传送一个字符 SBUF = txd; while(!TI); / 等特数据传送 TI = 0; / 清除数据传送标志串口通讯#include#
18、define uchar unsigned char#define uint unsigned intuchar idata trdata=R,I,C,H,M,C,U,R,Z,-,5,1,V,2,.,0,0x0d,0x0a,0x00;sbit K1=P32; /对应开发板K1按键/*-*/串口初始化void UART_Init(void)SCON = 0x50; /串口工作方式为1 , 串行允许接收/SM0=0;/SM1=1;/REN=1;TMOD = 0x20; /定时器1 工作在方式2/PCON = 0x80; /SMOD = 1; 波特率加倍TH1 = 0xfd; /波特率 9600bp
19、s fosc=11.0592MHzTL1 = 0xfd; ES = 1; /开串口中断 TR1 = 1; /允许定时器1工作 EA = 1; /开总中断void delay1ms(uint i)uchar j; while(i-) for(j=0;j115;j+) /1ms基准延时程序 ; /*-*/串口发送一个字节void Uart_SendChar(unsigned char dat)SBUF = dat; /待发送的数据写入缓冲区while(!TI); /等待发送完成TI = 0; /清零发送标志位/*-*/串口发送一个字符串void Uart_SendString() uchar i=
20、0; while(trdatai!=0x00) SBUF=trdatai; while(!TI); TI=0; i+; /*-*/主函数void main(void)UART_Init(); /初始化串口while(1) if(K1=0)delay1ms(20);if(K1=0)Uart_SendString(); /发送数据while(!K1); /等待按键释放 /*-*/串口接收中断函数void INT_UartRcv(void) interrupt 4unsigned char Rcv = 0;if(RI) /查询接收标志位(有数据发送过来时置为1)RI = 0; /接收标志位清零Rcv
21、 = SBUF; /存储缓冲区的数据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=P34;void delay1ms(unsigned int i)unsigned char j; while(i-) for(j=0;j115;j+) /1ms基准
22、延时程序 ; void Display(unsigned char x) P2=0xdf; /P2.6引脚输出低电平,DS6点亮 P0=Tabx/100; /显示十位 delay1ms(5); P2=0xbf; /P2.6引脚输出低电平,DS6点亮 P0=Tabx%100/10; /显示十位 delay1ms(5); P2=0x7f; /P2.7引脚输出低电平,DS7点亮 P0=Tabx%10; /显示个位 delay1ms(5); P2=0xff; /*函数功能:主函数*/ void main(void) TMOD=0x06; / TMOD=0000 0110B,使用计数器T0的模式2 EA
23、=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终端函数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以内(000999) 外中断字符查询#include #define uchar unsigned char#define uint unsigned intuchar code trdata=R,I,C,H,M,C,U,0x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1