1、51c程序集51单片机基本应用全集 51单片机程序延时函数晶振频率12MHZ#include#include#define uint unsigned int#define uchar unsigned charVoid delay();/15usvoid delay(uint n) while(n-);void delay_nms(uint n) uint x,y; for(x=0;xn;x+) for(y=0;y120;y+);void main() _nop_();/1us delay(1);/25us delay(2);/34us delay(3);/43us delay(5);/61
2、us delay(10);/106us delay(50);/466us delay(100);/916us Delay(1000);/9019us delay_nms(1);/,991us delay_nms(10);/9,675us delay_nms(100);/97,515us while(1);1:/*- 名称:流水灯 内容:循环点亮P1口对应的8个LED灯,造成循环流水点亮的效果-*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint unsigned int/*- 延时子
3、程序-*/void delay(uint cnt) while(-cnt);/*- 主函数-*/main() P1=0xfe; /给初始化值 换算成二进制是1111 1110 while(1) delay(58000);/延时程序 P1=1; /左移一位 该语句等效于 P1=P11 P1|=0x01; /最后一位补1,该语句等效于 P1=P1|0x01 符号|表示或 if(P1=0x7f) /检测是否移到最左端?=表示检测符号2端的值是否相等 delay(58000); P1=0xfe; /重新赋值 2:#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#def
4、ine uchar unsigned char#define uint unsigned int/*- 延时子程序-*/void delay(uint cnt) while(-cnt);/*- 主函数-*/main() P1=0xff; /给初始化值 换算成二进制是1111 1110 while(1) delay(58000); P1=0xaa; delay(58000); P1=0x55; 3/*调用位移函数的流水灯程序*/#include#include #define uint unsigned int #define uchar unsigned char uchar temp,num
5、,num1;void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); void main() temp=0xfe; while(1) P1=temp; delay(100); temp=_crol_(temp,1);/重要的51库函数调用 delay(100); 4: /*- 名称:喇叭 内容:一般现象可以看到P1口LED闪烁,需要将该口通过杜邦线连接到喇叭信号输入端子,可以参考电路图或者说明书-*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit SPK=P15; /定义喇叭端口/*/
6、* 延时函数声明 */*/void delay(unsigned int cnt) while(-cnt);/*/* 主函数 */*/main()unsigned int i; while(1) for(i=0;i200;i+)/喇叭发声的时间循环,改变大小可以改变发声时间长短 delay(50); /参数决定发声的频率,估算值,可以自行更改参数并 SPK=!SPK; SPK=1; /喇叭停止工作,间歇的时间,可更改 delay(20000); 5:/*- 名称:音乐播放 修改:无 内容:-*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit spea
7、ker=P15; /定义音乐输出端口,需要连接到对应的喇叭,请参考电路图unsigned char timer0h,timer0l,time; /世上只有妈妈好数据表code unsigned char sszymmh= 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3,
8、3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0 ; / 音阶频率表 高八位code unsigned char FREQH= 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, /1,2,3,4,5,6,7,8,i 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, ; / 音阶频率表 低八位code unsigned char FREQL= 0x42,0xC1,0
9、x17,0xB6,0xD0,0xD1,0xB6, 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, /1,2,3,4,5,6,7,8,i 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, ;/*/* 延时函数 */*/void delay(unsigned char t) unsigned char t1; unsigned long t2; for(t1=0;t1t;t1+) for(t2=0;t28000;t2+) ; TR0=0; /*/* 定时器中断函数 */*/voi
10、d t0int() interrupt 1 TR0=0; speaker=!speaker; TH0=timer0h; TL0=timer0l; TR0=1; /*/* 音乐处理函数 */*/void song() TH0=timer0h; TL0=timer0l; TR0=1; delay(time); /*/* 主函数 */*/ void main(void) unsigned char k,i; TMOD=1; /置CT0定时工作方式1 EA=1; ET0=1;/IE=0x82 /CPU开中断,CT0开中断 while(1) i=0; while(i100) /音乐数组长度 ,唱完从头再
11、来 k=sszymmhi+7*sszymmhi+1-1; timer0h=FREQHk; timer0l=FREQLk; time=sszymmhi+2; i=i+3; song(); 6:步进电机的简单应用#include#define uint unsigned int#define uchar unsigned charuchar code ffw=0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9;void delayus(uint us) uint i,j; for(j=0;jus;j+) for(i=0;i12;i+); void main() ucha
12、r i; while(1) for(i=0;i8;i+) P1=ffwi; delayus(10); 7:独立按键控制继电器#includesbit jdq=P10;sbit key1=P30;sbit key2=P31;void delay(unsigned int a)while(a-);void main() jdq=0; while(1) if(key1=0) jdq=1; /delay(5000); if(key2=0) jdq=0; /delay(5000); 8:数码管的静动显示及简单独立按键的使用#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
13、unsigned char const EL=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; / 显示段码值01234567unsigned char code seg=0,1,2,3,4,5,6,7;/分别对应相应的数码管点亮,即位码sbit key1=P30;sbit key2=P31;sbit key3=P32;sbit key4=P33;/*- 延时子程序-*/void delay(unsigned int cnt) while(-cnt);void main() unsigned char i; i=0; P3=0XFF; whi
14、le(1) P0=0X06; P2=0; delay(100); P0=0X5b; P2=1; delay(100); P0=0X4f; P2=2; delay(100); P0=0X66; P2=3; delay(100); P0=0X6d; P2=4; delay(100); P0=0X7d; P2=5; delay(100); P0=0X07; P2=6; delay(100); P0=0X7f; P2=7; delay(100); if(key1=0) break; while(1) if(key1=0) delay(100); if(key1=0) P0=EL0; P2=0; if(
15、key2=0) delay(100); if(key2=0) P0=EL1; P2=0; if(key3=0) delay(100); if(key3=0) P0=EL2; P2=0; if(key4=0) delay(100); if(key4=0) P0=EL3; P2=0; 9:/*-矩阵键盘实验程序 通过反转法循环扫描矩阵键盘,并通过数码管显示数据-*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint unsigned intunsigned char const EL=0x
16、3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71;/0-F/*- 函数声明-*/ uchar keyscan(void);/键盘扫描void delay(uint i); /演示程序/*- 主函数-*/void main() uchar key; P2=0; /1数码管亮 按相应的按键,会显示按键上的字符 P0=0X00; while(1) key=keyscan(); /调用键盘扫描, switch(key) case 0xee:P0=EL0;break;/0按下相应的键显示相对应的码
17、值 case 0xde:P0=EL1;break;/1 按下相应的键显示相对应的码值 case 0xbe:P0=EL2;break;/2 case 0x7e:P0=EL3;break;/3 case 0xed:P0=EL4;break;/4 case 0xdd:P0=EL5;break;/5 case 0xbd:P0=EL6;break;/6 case 0x7d:P0=EL7;break;/7 case 0xeb:P0=EL8;break;/8 case 0xdb:P0=EL9;break;/9 case 0xbb:P0=EL10;break;/a case 0x7b:P0=EL11;brea
18、k;/b case 0xe7:P0=EL12;break;/c case 0xd7:P0=EL13;break;/d case 0xb7:P0=EL14;break;/e case 0x77:P0=EL15;break;/f /*- 键盘扫描程序-*/uchar keyscan(void) /键盘扫描函数,使用行列反转扫描法 uchar cord_h,cord_l;/行列值中间变量 P3=0x0f; /行线输出全为0 cord_h=P3&0x0f; /读入列线值 if(cord_h!=0x0f) /先检测有无按键按下 delay(100); /去抖 if(cord_h!=0x0f) cord_
19、h=P3&0x0f; /读入列线值 P3=cord_h|0xf0; /输出当前列线值/当时还是按住的实际P3=11101110。结合实际按键 cord_l=P3&0xf0; /读入行线值 return(cord_h+cord_l);/键盘最后组合码值 return(0xff); /返回该值/*- 延时程序-*/void delay(uint i) /延时函数while(i-);10:(1)/*外部中断0/1的简单应用*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit speaker=P00;#define uchar unsigned char#de
20、fine uint unsigned int/*- 延时子程序-*/void delay(uint cnt) while(-cnt);/*- 主函数-*/main() EA=1;/开总中断 /EX0=1;/开外部中断0 /IT0=1; EX0=1; TCON=0x01;/跳变出发设置/ EX1=1;TCON=0x05; P1=0xfe; /给初始化值 换算成二进制是1111 1110 while(1) delay(58000);/延时程序 P1=1; /左移一位 该语句等效于 P1=P11 P1|=0x01; /最后一位补1,该语句等效于 P1=P1|0x01 符号|表示或 if(P1=0x7f) /检测是否移到最左端?=表示检测符号2端的值是否相等 delay(58000); P1=0xfe; /重新赋值 void exter1() interrupt 1 uint i; while(1) for(i=0;i2000;i+) speaker=0; delay(20000); speaker=1; delay(20000); (2)外部中断0的简单配置应用#inc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1