1目录目录.
1函数的使用和熟悉3实例3:用单片机控制第一个灯亮.
3实例4:用单片机控制一个灯闪烁:认识单片机的工作频率.
4实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能.
4实例6:使用P3口流水点亮8位LED.
5实例7:通过对P3口地址的操作流水点亮8位LED6实例8:用不同数据类型控制灯闪烁时间7实例9:用P0口、P1口分别显示加法和减法运算结果.
8实例10:用P0、P1口显示乘法运算结果8实例11:用P1、P0口显示除法运算结果9实例12:用自增运算控制P0口8位LED流水花样.
9实例13:用P0口显示逻辑"与"运算结果10实例14:用P0口显示条件运算结果10实例15:用P0口显示按位"异或"运算结果10实例16:用P0显示左移运算结果.
10实例17:"万能逻辑电路"实验.
11实例18:用右移运算流水点亮P1口8位LED.
11实例19:用if语句控制P0口8位LED的流水方向.
12实例20:用swtich语句的控制P0口8位LED的点亮状态.
12实例21:用for语句控制蜂鸣器鸣笛次数13实例22:用while语句控制LED15实例23:用do-while语句控制P0口8位LED流水点亮.
15实例24:用字符型数组控制P0口8位LED流水点亮16实例25:用P0口显示字符串常量.
17实例26:用P0口显示指针运算结果18实例27:用指针数组控制P0口8位LED流水点亮.
18实例28:用数组的指针控制P0口8位LED流水点亮19实例29:用P0、P1口显示整型函数返回值.
20实例30:用有参函数控制P0口8位LED流水速度.
20实例31:用数组作函数参数控制流水花样21实例32:用指针作函数参数控制P0口8位LED流水点亮.
22实例33:用函数型指针控制P1口灯花样.
23实例34:用指针数组作为函数的参数显示多个字符串24实例35:字符函数ctype.
h应用举例26实例36:内部函数intrins.
h应用举例26实例37:标准函数stdlib.
h应用举例26实例38:字符串函数string.
h应用举例27实例39:宏定义应用举例228实例40:宏定义应用举例2282实例41:宏定义应用举例328中断、定时器29实例42:用定时器T0查询方式P2口8位控制LED闪烁29实例43:用定时器T1查询方式控制单片机发出1KHz音频.
30实例44:将计数器T0计数的结果送P1口8位LED显示30实例45:用定时器T0的中断控制1位LED闪烁.
31实例46:用定时器T0的中断实现长时间定时32实例47:用定时器T1中断控制两个LED以不同周期闪烁32实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频33实例49:用定时器T0的中断实现"渴望"主题曲的播放.
34实例50-1:输出50个矩形脉冲37实例50-2:计数器T0统计外部脉冲数38实例51-2:定时器T0的模式2测量正脉冲宽度.
38实例52:用定时器T0控制输出高低宽度不同的矩形波.
39实例53:用外中断0的中断方式进行数据采集.
40实例54-1:输出负脉宽为200微秒的方波.
40实例54-2:测量负脉冲宽度.
41实例55:方式0控制流水灯循环点亮42实例56-1:数据发送程序.
43实例56-2:数据接收程序.
44实例57-1:数据发送程序.
45实例57-2:数据接收程序.
46实例58:单片机向PC发送数据.
47实例59:单片机接收PC发出的数据48数码管显示.
49实例60:用LED数码显示数字549实例61:用LED数码显示器循环显示数字0~949实例62:用数码管慢速动态扫描显示数字"1234"50实例63:用LED数码显示器伪静态显示数字1234.
51实例64:用数码管显示动态检测结果51实例65:数码秒表设计.
53实例66:数码时钟设计.
55实例67:用LED数码管显示计数器T0的计数值.
58实例68:静态显示数字"59"59键盘控制60实例69:无软件消抖的独立式键盘输入实验.
60实例70:软件消抖的独立式键盘输入实验60实例71:CPU控制的独立式键盘扫描实验.
61实例72:定时器中断控制的独立式键盘扫描实验64实例73:独立式键盘控制的4级变速流水灯67实例74:独立式键盘的按键功能扩展:"以一当四"69实例75:独立式键盘调时的数码时钟实验71实例76:独立式键盘控制步进电机实验.
75实例77:矩阵式键盘按键值的数码管显示实验.
783实例78:矩阵式键盘按键音.
81实例79:简易电子琴82实例80:矩阵式键盘实现的电子密码锁.
88液晶显示LCD91实例81:用LCD显示字符'A'91实例82:用LCD循环右移显示"WelcometoChina"95实例83:用LCD显示适时检测结果.
98实例84:液晶时钟设计.
102一些芯片的使用*****24c02DS18B20X5045ADC0832DAC0832DS1302红外遥控108实例85:将数据"0x0f"写入AT24C02再读出送P1口显示.
108实例86:将按键次数写入AT24C02,再读出并用1602LCD显示.
112实例87:对I2C总线上挂接多个AT24C02的读写操作119实例88:基于AT24C02的多机通信读取程序125实例88:基于AT24C02的多机通信写入程序129实例90:DS18B20温度检测及其液晶显示140实例91:将数据"0xaa"写入X5045再读出送P1口显示.
148实例92:将流水灯控制码写入X5045并读出送P1口显示.
152实例93:对SPI总线上挂接多个X5045的读写操作.
156实例94:基于ADC0832的数字电压表160实例95:用DAC0832产生锯齿波电压166实例96:用P1口显示红外遥控器的按键值166实例97:用红外遥控器控制继电器.
169实例98:基于DS1302的日历时钟171实例99:单片机数据发送程序.
180实例100:电机转速表设计181//模拟霍尔脉冲186函数的使用和熟悉实例3:用单片机控制第一个灯亮#include//包含51单片机寄存器定义的头文件voidmain(void){P1=0xfe;//P1=11111110B,即P1.
0输出低电平}4实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include//包含单片机寄存器的头文件函数功能:延时一段时间voiddelay(void)//两个void意思分别为无需返回值,没有参数传递{unsignedinti;//定义无符号整数,最大取值范围65535for(i=0;i//包含单片机寄存器的头文件函数功能:主函数(C语言规定必须有也只能有1个主函数)voidmain(void){while(1)//无限循环{P1=0xff;//P1=11111111B,熄灭LEDP0=P1;//将P1口状态送入P0口P2=P1;//将P1口状态送入P2口P3=P1;//将P1口状态送入P3口5}}实例6:使用P3口流水点亮8位LED#include//包含单片机寄存器的头文件函数功能:延时一段时间voiddelay(void){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作函数功能:延时一段时间voiddelay(void){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件函数功能:用整形数据延时一段时间voidint_delay(void)//延时一段较长的时间{unsignedintm;//定义无符号整形变量,双字节数据,值域为0~65535for(m=0;mvoidmain(void){unsignedcharm,n;m=43;//即十进制数2x16+11=43n=60;//即十进制数3x16+12=60P1=m+n;//P1=103=01100111B,结果P1.
3、P1.
4、P1.
7口的灯被点亮P0=n-m;//P0=17=00010001B,结果P0.
0、P0.
4的灯被熄灭}实例10:用P0、P1口显示乘法运算结果#include//包含单片机寄存器的头文件voidmain(void){unsignedcharm,n;unsignedints;m=64;n=71;s=m*n;//s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0//两边同除以256,可得17+192/256=H3*16+H2+(H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数9P1=s/256;//高8位送P1口,P1=17=11H=00010001B,P1.
0和P1.
4口灭,其余亮P0=s%256;//低8位送P0口,P3=192=c0H=11000000B,P3.
1,P3.
6,P3.
7口灭,其余亮}实例11:用P1、P0口显示除法运算结果#include//包含单片机寄存器的头文件voidmain(void){P1=36/5;//求整数P0=((36%5)*10)/5;//求小数while(1);//无限循环防止程序"跑飞"}实例12:用自增运算控制P0口8位LED流水花样#include//包含单片机寄存器的头文件函数功能:延时一段时间voiddelay(void){unsignedinti;for(i=0;i//包含单片机寄存器的头文件voidmain(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1);//设置无限循环,防止程序"跑飞"}实例14:用P0口显示条件运算结果#include//包含单片机寄存器的头文件voidmain(void){P0=(8>4)8:4;//将条件运算结果送P0口,P0=8=00001000Bwhile(1);//设置无限循环,防止程序"跑飞"}实例15:用P0口显示按位异或运算结果#include//包含单片机寄存器的头文件voidmain(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=00001000Bwhile(1);//设置无限循环,防止程序"跑飞"}实例16:用P0显示左移运算结果#include//包含单片机寄存器的头文件voidmain(void){P0=0x3b//包含单片机寄存器的头文件sbitF=P1^4;//将F位定义为P1.
4sbitX=P1^5;//将X位定义为P1.
5sbitY=P1^6;//将Y位定义为P1.
6sbitZ=P1^7;//将Z位定义为P1.
7voidmain(void){while(1){F=((~X)&Y)|Z;//将逻辑运算结果赋给F;}}实例18:用右移运算流水点亮P1口8位LED#include//包含单片机寄存器的头文件函数功能:延时一段时间voiddelay(void){unsignedintn;for(n=0;n>1;//每次循环P1的各二进位右移1位,高位补0delay();//调用延时函数}}}实例19:用if语句控制P0口8位LED的流水方向#include//包含单片机寄存器的头文件sbitS1=P1^4;//将S1位定义为P1.
4sbitS2=P1^5;//将S2位定义为P1.
5函数功能:主函数voidmain(void){while(1){if(S1==0)//如果按键S1按下P0=0x0f;//P0口高四位LED点亮if(S2==0)//如果按键S2按下P0=0xf0;//P0口低四位LED点亮}}实例20:用swtich语句的控制P0口8位LED的点亮状态#include//包含单片机寄存器的头文件sbitS1=P1^4;//将S1位定义为P1.
4函数功能:延时一段时间voiddelay(void){unsignedintn;for(n=0;n//包含单片机寄存器的头文件sbitsound=P3^7;//将sound位定义为P3.
714函数功能:延时形成1600Hz音频voiddelay1600(void){unsignedcharn;for(n=0;n//包含单片机寄存器的头文件函数功能:延时约60ms(3*100*200=60000μs)voiddelay60ms(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件函数功能:延时约60ms(3*100*200=60000μs)voiddelay60ms(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件函数功能:延时约60ms(3*100*200=60000μs)voiddelay60ms(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件函数功能:延时约150ms(3*200*250=150000μs=150msvoiddelay150ms(void){unsignedcharm,n;for(m=0;mvoidmain(void){unsignedchar*p1,*p2;//定义无符号字符型指针变量p1,p2unsignedchari,j;//定义无符号字符型数据i=25;//给i赋初值25j=15;p1=&i;//使指针变量指向i,对指针初始化p2=&j;//使指针变量指向j,对指针初始化P0=*p1+*p2;//*p1+*p2相当于i+j,所以P0=25+15=40=0x28//则P0=00101000B,结果P0.
3、P0.
5引脚LED熄灭,其余点亮while(1);//无限循环,防止程序"跑飞"}实例27:用指针数组控制P0口8位LED流水点亮#include函数功能:延时约150ms(3*200*250=150000μs=150msvoiddelay150ms(void){unsignedcharm,n;for(m=0;m函数功能:延时约150ms(3*200*250=150000μs=150msvoiddelay150ms(void){unsignedcharm,n;for(m=0;m函数功能:计算两个无符号整数的和unsignedintsum(inta,intb){unsignedints;s=a+b;return(s);}函数功能:主函数voidmain(void){unsignedz;z=sum(2008,2009);P1=z/256;//取得z的高8位P0=z%256;//取得z的低8位while(1);}实例30:用有参函数控制P0口8位LED流水速度#include函数功能:延时一段时间21voiddelay(unsignedcharx){unsignedcharm,n;for(m=0;m函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量24函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件unsignedcharcodestr1[]="TemperatureistestedbyDS18B20";//C语言中,字符串是作为字符数组来处理的unsignedcharcodestr2[]="Nowtemperatureis:";//所以,字符串的名字就是字符串的首地址unsignedcharcodestr3[]="TheSystermisdesignedbyZhangSan";unsignedcharcodestr4[]="Thedateis2008-9-30";25unsignedchar*p[]={str1,str2,str3,str4};//定义p[4]为指向4个字符串的字符型指针数组函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件#includevoidmain(void){while(1){P3=isalpha('_')0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0}}实例36:内部函数intrins.
h应用举例#include//包含51单片机寄存器定义的头文件#include//包含函数isalpha()声明的头文件函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件#include//包含函数isalpha()声明的头文件函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件#include//包含函数isalpha()声明的头文件voidmain(void){unsignedcharstr1[]="Now,Thetemperatureis:";unsignedcharstr2[]="Now,Thetemperatureis36Centgrade:";unsignedchari;i=strcmp(str1,str2);//比较两个字符串,并将结果存入iif(i==0)//str1=str2P3=0x00;elseif(istr2P3=0x0f;while(1);//防止程序"跑飞"}实例39:宏定义应用举例2#include//包含51单片机寄存器定义的头文件#defineF(a,b)(a)+(a)*(b)/256+(b)//带参数的宏定义,a和b为形参voidmain(void){unsignedchari,j,k;i=40;j=30;k=20;P3=F(i,j+k);//i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}实例40:宏定义应用举例2#include#includevoidmain(void){P3_0=0;//将P3.
0引脚置低电平,LED点亮P3_1=0;//将P3.
0引脚置低电平,LED点亮P3_2=0;//将P3.
0引脚置低电平,LED点亮P3_3=0;//将P3.
0引脚置低电平,LED点亮P3_4=1;//将P3.
4引脚置高电平,LED熄灭P3_5=1;//将P3.
5引脚置高电平,LED熄灭P3_6=1;//将P3.
7引脚置高电平,LED熄灭P3_7=1;//将P3.
7引脚置高电平,LED熄灭while(1);}实例41:宏定义应用举例329#include//包含51单片机寄存器定义的头文件#defineMAX100//将MAX宏定义为字符串100voidmain(void){#ifMAX>80//如果字符串100大于80P3=0xf0;//P3口低四位LED点亮#elseP3=0x0f;//否则,P3口高四位LED点亮#endif//结束本次编译}中断、定时器实例42:用定时器T0查询方式P2口8位控制LED闪烁#include//包含51单片机寄存器定义的头文件函数功能:主函数voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式1TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值}30}实例43:用定时器T1查询方式控制单片机发出1KHz音频#include//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.
7引脚函数功能:主函数voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x10;//使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound;//将P3.
7引脚输出电平取反TH1=(65536-921)/256;//定时器T0的高8位赋初值TL1=(65536-921)%256;//定时器T0的高8位赋初值}}实例44:将计数器T0计数的结果送P1口8位LED显示#include//包含51单片机寄存器定义的头文件sbitS=P3^4;//将S位定义为P3.
4引脚函数功能:主函数voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x02;//使用定时器T0的模式2TH0=256-156;//定时器T0的高8位赋初值31TL0=256-156;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待查询{while(TF0==0)//如果未计满就等待{if(S==0)//按键S按下接地,电平为0P1=TL0;//计数器TL0加1后送P1口显示}TF0=0;//计数器溢出后,将TF0清0}}实例45:用定时器T0的中断控制1位LED闪烁#include//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.
0引脚函数功能:主函数voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式2TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待中断;}函数功能:定时器T0的中断服务程序voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1;//按位取反操作,将P2.
0引脚输出电平取反TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值TL0=(65536-46083)%256;//定时器T0的高8位重新赋初值}32实例46:用定时器T0的中断实现长时间定时#include//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.
0引脚unsignedcharCountor;//设置全局变量,储存定时器T0中断次数函数功能:主函数voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式2TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0Countor=0;//从0开始累计中断次数while(1)//无限循环等待中断;}函数功能:定时器T0的中断服务程序voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++;//中断次数自加1if(Countor==20)//若累计满20次,即计时满1s{D1=~D1;//按位取反操作,将P2.
0引脚输出电平取反Countor=0;//将Countor清0,重新从0开始计数}TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值TL0=(65536-46083)%256;//定时器T0的高8位重新赋初值}实例47:用定时器T1中断控制两个LED以不同周期闪烁#include//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.
0引脚33sbitD2=P2^1;//将D2位定义为P2.
1引脚unsignedcharCountor1;//设置全局变量,储存定时器T1中断次数unsignedcharCountor2;//设置全局变量,储存定时器T1中断次数函数功能:主函数voidmain(void){EA=1;//开总中断ET1=1;//定时器T1中断允许TMOD=0x10;//使用定时器T1的模式1TH1=(65536-46083)/256;//定时器T1的高8位赋初值TL1=(65536-46083)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1Countor1=0;//从0开始累计中断次数Countor2=0;//从0开始累计中断次数while(1)//无限循环等待中断;}函数功能:定时器T1的中断服务程序voidTime1(void)interrupt3using0//"interrupt"声明函数为中断服务函数//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++;//Countor1自加1Countor2++;//Countor2自加1if(Countor1==2)//若累计满2次,即计时满100ms{D1=~D1;//按位取反操作,将P2.
0引脚输出电平取反Countor1=0;//将Countor1清0,重新从0开始计数}if(Countor2==8)//若累计满8次,即计时满400ms{D2=~D2;//按位取反操作,将P2.
1引脚输出电平取反Countor2=0;//将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256;//定时器T1的高8位重新赋初值TL1=(65536-46083)%256;//定时器T1的高8位重新赋初值}实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频34#include//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.
7引脚函数功能:主函数voidmain(void){EA=1;//开总中断ET1=1;//定时器T1中断允许TMOD=0x10;//TMOD=0001000B,使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1while(1)//无限循环等待中断;}函数功能:定时器T1的中断服务程序voidTime1(void)interrupt3using0//"interrupt"声明函数为中断服务函数{sound=~sound;TH1=(65536-921)/256;//定时器T1的高8位重新赋初值TL1=(65536-921)%256;//定时器T1的高8位重新赋初值}实例49:用定时器T0的中断实现渴望主题曲的播放#include//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.
7unsignedintC;//储存定时器的定时常数//以下是C调低音的音频宏定义#definel_dao262//将"l_dao"宏定义为低音"1"的频率262Hz#definel_re286//将"l_re"宏定义为低音"2"的频率286Hz#definel_mi311//将"l_mi"宏定义为低音"3"的频率311Hz#definel_fa349//将"l_fa"宏定义为低音"4"的频率349Hz#definel_sao392//将"l_sao"宏定义为低音"5"的频率392Hz#definel_la440//将"l_a"宏定义为低音"6"的频率440Hz#definel_xi494//将"l_xi"宏定义为低音"7"的频率494Hz//以下是C调中音的音频宏定义#definedao523//将"dao"宏定义为中音"1"的频率523Hz#definere587//将"re"宏定义为中音"2"的频率587Hz#definemi659//将"mi"宏定义为中音"3"的频率659Hz35#definefa698//将"fa"宏定义为中音"4"的频率698Hz#definesao784//将"sao"宏定义为中音"5"的频率784Hz#definela880//将"la"宏定义为中音"6"的频率880Hz#definexi987//将"xi"宏定义为中音"7"的频率523H//以下是C调高音的音频宏定义#defineh_dao1046//将"h_dao"宏定义为高音"1"的频率1046Hz#defineh_re1174//将"h_re"宏定义为高音"2"的频率1174Hz#defineh_mi1318//将"h_mi"宏定义为高音"3"的频率1318Hz#defineh_fa1396//将"h_fa"宏定义为高音"4"的频率1396Hz#defineh_sao1567//将"h_sao"宏定义为高音"5"的频率1567Hz#defineh_la1760//将"h_la"宏定义为高音"6"的频率1760Hz#defineh_xi1975//将"h_xi"宏定义为高音"7"的频率1975Hz函数功能:1个延时单位,延时200msvoiddelay(){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件sbitu=P1^4;//将u位定义为P1.
4函数功能:延时约30ms(3*100*100=30000μs=30mvoiddelay30ms(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件函数功能:主函数voidmain(void){TMOD=0x06;//TMOD=00000110B,使用计数器T0的模式2EA=1;//开总中断ET0=0;//不使用定时器T0的中断TR0=1;//启动T0TH0=0;//计数器T0高8位赋初值TL0=0;//计数器T0低8位赋初值while(1)//无限循环,不停地将TL0计数结果送P1口P1=TL0;}实例51‐2:定时器T0的模式2测量正脉冲宽度#include//包含51单片机寄存器定义的头文件sbitui=P3^2;//将ui位定义为P3.
0(INT0)引脚,表示输入电压函数功能:主函数voidmain(void){TMOD=0x0a;//TMOD=00001010B,使用定时器T0的模式2,GATE置1EA=1;//开总中断ET0=0;//不使用定时器T0的中断TR0=1;//启动T0TH0=0;//计数器T0高8位赋初值TL0=0;//计数器T0低8位赋初值while(1)//无限循环,不停地将TL0计数结果送P1口{while(ui==0)//INT0为低电平,T0不能启动;TL0=0;//INT0为高电平,启动T0计时,所以将TL0清039while(ui==1)//在INT0高电平期间,等待,计时;P1=TL0;//将计时结果送P1口显示}}实例52:用定时器T0控制输出高低宽度不同的矩形波#include//包含51单片机寄存器定义的头文件sbitu=P3^0;//将u位定义为P3.
0,从该引脚输出矩形脉冲unsignedcharCountor;//设置全局变量,储存负跳变累计数函数功能:延时约30ms(3*100*100=30000μs=30ms)voiddelay30ms(void){unsignedcharm,n;for(m=0;m//包含51单片机寄存器定义的头文件sbitS=P3^2;//将S位定义为P3.
2,函数功能:主函数voidmain(void){EA=1;//开放总中断EX0=1;//允许使用外中断IT0=1;//选择负跳变来触发外中断P1=0xff;while(1);//无限循环,防止程序跑飞}函数功能:外中断T0的中断服务程序voidint0(void)interrupt0using0//外中断0的中断编号为0{P1=~P1;//每产生一次中断请求,P1取反一次.
}实例54‐1:输出负脉宽为200微秒的方波#include//包含51单片机寄存器定义的头文件sbitu=P1^4;//将u位定义为P1.
4函数功能:主函数41voidmain(void){TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2EA=1;//开总中断ET0=1;//定时器T0中断允许TH0=256-200;//定时器T0的高8位赋初值TL0=256-200;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环,等待中断;}函数功能:定时器T0的中断服务程序voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数{u=~u;//将P1.
4引脚输出电平取反,产生方波}实例54‐2:测量负脉冲宽度#include//包含51单片机寄存器定义的头文件sbitu=P3^2;//将u位定义为P3.
2函数功能:主函数voidmain(void){TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2EA=1;//开放总中断EX0=1;//允许使用外中断IT0=1;//选择负跳变来触发外中断ET0=1;//允许定时器T0中断TH0=0;//定时器T0赋初值0TL0=0;//定时器T0赋初值0TR0=0;//先关闭T0while(1);//无限循环,不停检测输入负脉冲宽度}函数功能:外中断0的中断服务程序42voidint0(void)interrupt0using0//外中断0的中断编号为0{TR0=1;//外中断一到来,即启动T0计时TL0=0;//从0开始计时while(u==0)//低电平时,等待T0计时;P1=TL0;//将结果送P1口显示TR0=0;//关闭T0}实例55:方式0控制流水灯循环点亮#include//包含51单片机寄存器定义的头文件#include//包含函数_nop_()定义的头文件unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量sbitP17=P1^7;函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量函数功能:向PC发送一个字节数据voidSend(unsignedchardat){SBUF=dat;while(TI==0);TI=0;}函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件函数功能:接收一个字节数据unsignedcharReceive(void){unsignedchardat;while(RI==0)//只要接收中断标志位RI没有被置"1";//等待,直至接收完毕(RI=1)RI=0;//为了接收下一帧数据,需将RI清0dat=SBUF;//将接收缓冲器中的数据存于datreturndat;}函数功能:主函数voidmain(void){TMOD=0x20;//定时器T1工作于方式2SCON=0x50;//SCON=01010000B,串口工作方式1,允许接收(REN=1)45PCON=0x00;//PCON=00000000B,波特率9600TH1=0xfd;//根据规定给定时器T1赋初值TL1=0xfd;//根据规定给定时器T1赋初值TR1=1;//启动定时器T1REN=1;//允许接收while(1){P1=Receive();//将接收到的数据送P1口显示}}实例57‐1:数据发送程序#include//包含单片机寄存器的头文件sbitp=PSW^0;unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量函数功能:向PC发送一个字节数据voidSend(unsignedchardat){ACC=dat;TB8=p;SBUF=dat;while(TI==0);TI=0;}函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件sbitp=PSW^0;函数功能:接收一个字节数据unsignedcharReceive(void){unsignedchardat;while(RI==0)//只要接收中断标志位RI没有被置"1";//等待,直至接收完毕(RI=1)RI=0;//为了接收下一帧数据,需将RI清0ACC=SBUF;//将接收缓冲器中的数据存于datif(RB8==p){dat=ACC;returndat;}}函数功能:主函数47voidmain(void){TMOD=0x20;//定时器T1工作于方式2SCON=0xd0;//SCON=11010000B,串口工作方式1,允许接收(REN=1)PCON=0x00;//PCON=00000000B,波特率9600TH1=0xfd;//根据规定给定时器T1赋初值TL1=0xfd;//根据规定给定时器T1赋初值TR1=1;//启动定时器T1REN=1;//允许接收while(1){P1=Receive();//将接收到的数据送P1口显示}}实例58:单片机向PC发送数据#include//包含单片机寄存器的头文件unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量函数功能:向PC发送一个字节数据voidSend(unsignedchardat){SBUF=dat;while(TI==0);TI=0;}函数功能:延时约150msvoiddelay(void){unsignedcharm,n;for(m=0;m//包含单片机寄存器的头文件函数功能:接收一个字节数据unsignedcharReceive(void){unsignedchardat;while(RI==0)//只要接收中断标志位RI没有被置"1";//等待,直至接收完毕(RI=1)RI=0;//为了接收下一帧数据,需将RI清0dat=SBUF;//将接收缓冲器中的数据存于datreturndat;}函数功能:主函数voidmain(void){TMOD=0x20;//定时器T1工作于方式2SCON=0x50;//SCON=01010000B,串口工作方式1,允许接收(REN=1)PCON=0x00;//PCON=00000000B,波特率9600TH1=0xfd;//根据规定给定时器T1赋初值49TL1=0xfd;//根据规定给定时器T1赋初值TR1=1;//启动定时器T1REN=1;//允许接收while(1){P1=Receive();//将接收到的数据送P1口显示}}数码管显示实例60:用LED数码显示数字5#include//包含51单片机寄存器定义的头文件voidmain(void){P2=0xfe;//P2.
0引脚输出低电平,数码显示器接通电源准备点亮P0=0x92;//让P0口输出数字"5"的段码92H}实例61:用LED数码显示器循环显示数字0~9#include//包含51单片机寄存器定义的头文件函数功能:延时函数,延时一段时间voiddelay(void){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件voiddelay(void)//延时函数,延时一段时间{unsignedchari,j;for(i=0;i伪静态显示数字1234#include//包含51单片机寄存器定义的头文件voiddelay(void)//延时函数,延时约0.
6毫秒{unsignedchari;for(i=0;i//包含51单片机寄存器定义的头文件#include//包含随机函数rand()的定义文件unsignedchari;//记录中断次数unsignedintx;//随机检测的数据unsignedcharcodeTab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表52函数功能:快速动态扫描延时,延时约0.
9毫秒voiddelay(void){unsignedinti;for(i=0;i//包含51单片机寄存器定义的头文件unsignedcharcodeTab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表unsignedcharint_time;//记录中断次数unsignedcharsecond;//储存秒函数功能:快速动态扫描延时,延时约0.
6毫秒voiddelay(void){unsignedchari;54for(i=0;i//包含51单片机寄存器定义的头文件unsignedcharTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//controlshapeunsignedcharport[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsignedcharint_time;//中断次数计数变量unsignedcharsecond;//秒计数变量unsignedcharminute;//分钟计数变量unsignedcharhour;//小时计数变量voiddelay(void)//延时函数,延时约0.
6ms{unsignedcharj;for(j=0;j//包含51单片机寄存器定义的头文件sbitS=P3^2;//将S位定义为P3.
2引脚unsignedcharTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表unsignedcharx;函数功能:延时约0.
6msvoiddelay(void){unsignedcharj;for(j=0;j//包含51单片机寄存器定义的头文件函数功能:主函数60voidmain(void){P0=0x92;//将数字5的段码送P0口P1=0x90;//将数字9的段码送P1口while(1)//无限循环,防止程序跑飞;}键盘控制实例69:无软件消抖的独立式键盘输入实验#include//包含51单片机寄存器定义的头文件sbitS1=P1^4;//将S1位定义为P1.
4引脚sbitLED0=P3^0;//将LED0位定义为P3.
0引脚voidmain(void)//主函数{LED0=0;//P3.
0引脚输出低电平while(1){if(S1==0)//P1.
4引脚输出低电平,按键S1被按下LED0=!
LED0;//P3.
0引脚取反}}实例70:软件消抖的独立式键盘输入实验#include//包含51单片机寄存器定义的头文件sbitS1=P1^4;//将S1位定义为P1.
4引脚sbitLED0=P3^0;//将LED0位定义为P3.
0引脚函数功能:延时约30msvoiddelay(void){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件sbitS1=P1^4;//将S1位定义为P1.
4引脚sbitS2=P1^5;//将S2位定义为P1.
5引脚sbitS3=P1^6;//将S3位定义为P1.
6引脚sbitS4=P1^7;//将S4位定义为P1.
7引脚unsignedcharkeyval;//储存按键值函数功能:流水灯延时voidled_delay(void){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件sbitS1=P1^4;//将S1位定义为P1.
4引脚sbitS2=P1^5;//将S2位定义为P1.
5引脚sbitS3=P1^6;//将S3位定义为P1.
6引脚sbitS4=P1^7;//将S4位定义为P1.
7引脚unsignedcharkeyval;//储存按键值函数功能:流水灯延时voidled_delay(void){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件unsignedcharspeed;//储存流水灯的流动速度sbitS1=P1^4;//位定义S1为P1.
4sbitS2=P1^5;//位定义S2为P1.
5sbitS3=P1^6;//位定义S3为P1.
6sbitS4=P1^7;//位定义S4为P1.
7函数功能:延时20ms的子程序voiddelay20ms(void)//3*i*j+2*i=3*100*60+2*100=20000μs=20ms;{unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件70unsignedcharID;//储存流水灯的流动速度sbitS1=P1^4;//位定义S1为P1.
4函数功能:延时子程序voiddelay(void)//因为仅对一个按键扫描,所以延时时间较长约200ms{unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件unsignedcharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数字0~9的段码unsignedcharint_time;//中断次数计数变量unsignedcharsecond;//秒计数变量unsignedcharminute;//分钟计数变量unsignedcharhour;//小时计数变量sbitS1=P1^4;//将S1位定义为P1.
4sbitS2=P1^5;//将S2位定义为P1.
5sbitS3=P1^6;//将S3位定义为P1.
6sbitS4=P1^7;//将S4位定义为P1.
7函数功能:数码管扫描延时voiddelay(void){unsignedcharj;for(j=0;j//包含51单片机寄存器定义的头文件sbitS1=P1^4;//将S1位定义为P1.
4引脚sbitS2=P1^5;//将S2位定义为P1.
5引脚sbitS3=P1^6;//将S3位定义为P1.
6引脚unsignedcharkeyval;//储存按键值unsignedcharID;//储存功能标号函数功能:软件消抖延时(约50ms)voiddelay(void){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件sbitP14=P1^4;//将P14位定义为P1.
4引脚sbitP15=P1^5;//将P15位定义为P1.
5引脚sbitP16=P1^6;//将P16位定义为P1.
6引脚sbitP17=P1^7;//将P17位定义为P1.
7引脚unsignedcharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数字0~9的段码unsignedcharkeyval;//定义变量储存按键值函数功能:数码管动态扫描延时voidled_delay(void){unsignedcharj;for(j=0;j//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.
7函数功能:蜂鸣器发声延时约120msvoiddelay_sound(void){unsignedchari;for(i=0;i//包含51单片机寄存器定义的头文件sbitP14=P1^4;//将P14位定义为P1.
4引脚sbitP15=P1^5;//将P15位定义为P1.
5引脚sbitP16=P1^6;//将P16位定义为P1.
6引脚sbitP17=P1^7;//将P17位定义为P1.
7引脚unsignedcharkeyval;//定义变量储存按键值sbitsound=P3^7;//将sound位定义为P3.
7unsignedintC;//全局变量,储存定时器的定时常数unsignedintf;//全局变量,储存音阶的频率//以下是C调低音的音频宏定义#definel_dao262//将"l_dao"宏定义为低音"1"的频率262Hz83#definel_re286//将"l_re"宏定义为低音"2"的频率286Hz#definel_mi311//将"l_mi"宏定义为低音"3"的频率311Hz#definel_fa349//将"l_fa"宏定义为低音"4"的频率349Hz#definel_sao392//将"l_sao"宏定义为低音"5"的频率392Hz#definel_la440//将"l_a"宏定义为低音"6"的频率440Hz#definel_xi494//将"l_xi"宏定义为低音"7"的频率494Hz//以下是C调中音的音频宏定义#definedao523//将"dao"宏定义为中音"1"的频率523Hz#definere587//将"re"宏定义为中音"2"的频率587Hz#definemi659//将"mi"宏定义为中音"3"的频率659Hz#definefa698//将"fa"宏定义为中音"4"的频率698Hz#definesao784//将"sao"宏定义为中音"5"的频率784Hz#definela880//将"la"宏定义为中音"6"的频率880Hz#definexi987//将"xi"宏定义为中音"7"的频率53//以下是C调高音的音频宏定义#defineh_dao1046//将"h_dao"宏定义为高音"1"的频率1046Hz#defineh_re1174//将"h_re"宏定义为高音"2"的频率1174Hz#defineh_mi1318//将"h_mi"宏定义为高音"3"的频率1318Hz#defineh_fa1396//将"h_fa"宏定义为高音"4"的频率1396Hz#defineh_sao1567//将"h_sao"宏定义为高音"5"的频率1567Hz#defineh_la1760//将"h_la"宏定义为高音"6"的频率1760Hz#defineh_xi1975//将"h_xi"宏定义为高音"7"的频率1975Hz函数功能:软件延时子程序voiddelay20ms(void){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件sbitP14=P1^4;//将P14位定义为P1.
4引脚sbitP15=P1^5;//将P15位定义为P1.
5引脚sbitP16=P1^6;//将P16位定义为P1.
6引脚sbitP17=P1^7;//将P17位定义为P1.
7引脚sbitsound=P3^7;//将sound位定义为P3.
7unsignedcharkeyval;//储存按键值函数功能:延时输出音频voiddelay(void){unsignedchari;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚unsignedcharcodestring[]={"WelcometoChina"};函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含随机函数rand()的定义文件#include//包含_nop_()函数定义的头文件sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字unsignedcharcodestring[]={"TestResult"};//定义字符数组显示提示信息函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms()99{unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含随机函数rand()的定义文件#include//包含_nop_()函数定义的头文件sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字unsignedcharcodestring[]={"BeiJingTime"};//定义字符数组显示提示信息unsignedcharcount;//定义变量统计中断累计次数unsignedchars,m,h;//定义变量储存秒、分钟和小时函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件#include//包含_nop_()函数定义的头文件#defineOP_READ0xa1//器件地址以及读取操作,0xa1即为10100001B#defineOP_WRITE0xa0//器件地址以及写入操作,0xa1即为10100000BsbitSDA=P3^4;//将串行数据总线SDA位定义在为P3.
4引脚sbitSCL=P3^3;//将串行时钟总线SDA位定义在为P3.
3引脚函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚sbitS=P1^4;//将S位定义为P1.
4引脚#defineOP_READ0xa1//器件地址以及读取操作,0xa1即为10100001B#defineOP_WRITE0xa0//器件地址以及写入操作,0xa1即为10100000BsbitSDA=P3^4;//将串行数据总线SDA位定义在为P3.
4引脚sbitSCL=P3^3;//将串行时钟总线SDA位定义在为P3.
3引脚unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件#include//包含_nop_()函数定义的头文件#defineOP_READ10xa1//器件1地址以及读取操作,0xa1即为10100001B#defineOP_WRITE10xa0//器件1地址以及写入操作,0xa1即为10100000B#defineOP_READ20xaf//器件2地址以及读取操作,0xa1即为10101111B#defineOP_WRITE20xae//器件2地址以及写入操作,0xa1即为10101110BsbitSDA=P3^4;//将串行数据总线SDA位定义在为P3.
4引脚sbitSCL=P3^3;//将串行时钟总线SDA位定义在为P3.
3引脚120函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件#include//包含_nop_()函数定义的头文件#defineOP_READ0xa1//器件1地址以及读取操作,0xa1即为10100001B#defineOP_WRITE0xa0//器件1地址以及写入操作,0xa1即为10100000BsbitSDA=P3^4;//将串行数据总线SDA位定义在为P3.
4引脚sbitSCL=P3^3;//将串行时钟总线SDA位定义在为P3.
3引脚sbitflag=P3^0;函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件#include//包含_nop_()函数定义的头文件#defineOP_READ0xa1//器件1地址以及读取操作,0xa1即为10100001B#defineOP_WRITE0xa0//器件1地址以及写入操作,0xa1即为10100000BsbitSDA=P3^4;//将串行数据总线SDA位定义在为P3.
4引脚sbitSCL=P3^3;//将串行时钟总线SDA位定义在为P3.
3引脚sbitflag=P3^0;函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含51单片机寄存器定义的头文件#include//包含_nop_()函数定义的头文件#defineOP_READ0xa1//器件地址以及读取操作,0xa1即为10100001B133#defineOP_WRITE0xa0//器件地址以及写入操作,0xa1即为10100000BsbitSDA=P3^4;//将串行数据总线SDA位定义在为P3.
4引脚sbitSCL=P3^3;//将串行时钟总线SDA位定义在为P3.
3引脚sbitsound=P3^7;//将sound位定义为P3.
7,从该引脚输出音频unsignedintC;//储存定时器的定时常数//以下是C调低音的音频宏定义#definel_dao262//将"l_dao"宏定义为低音"1"的频率262Hz#definel_re286//将"l_re"宏定义为低音"2"的频率286Hz#definel_mi311//将"l_mi"宏定义为低音"3"的频率311Hz#definel_fa349//将"l_fa"宏定义为低音"4"的频率349Hz#definel_sao392//将"l_sao"宏定义为低音"5"的频率392Hz#definel_la440//将"l_a"宏定义为低音"6"的频率440Hz#definel_xi494//将"l_xi"宏定义为低音"7"的频率494Hz//以下是C调中音的音频宏定义#definedao523//将"dao"宏定义为中音"1"的频率523Hz#definere587//将"re"宏定义为中音"2"的频率587Hz#definemi659//将"mi"宏定义为中音"3"的频率659Hz#definefa698//将"fa"宏定义为中音"4"的频率698Hz#definesao784//将"sao"宏定义为中音"5"的频率784Hz#definela880//将"la"宏定义为中音"6"的频率880Hz#definexi987//将"xi"宏定义为中音"7"的频率523Hz//以下是C调高音的音频宏定义#defineh_dao1046//将"h_dao"宏定义为高音"1"的频率1046Hz#defineh_re1174//将"h_re"宏定义为高音"2"的频率1174Hz#defineh_mi1318//将"h_mi"宏定义为高音"3"的频率1318Hz#defineh_fa1396//将"h_fa"宏定义为高音"4"的频率1396Hz#defineh_sao1567//将"h_sao"宏定义为高音"5"的频率1567Hz#defineh_la1760//将"h_la"宏定义为高音"6"的频率1760Hz#defineh_xi1975//将"h_xi"宏定义为高音"7"的频率1975Hz函数功能:节拍的延时的基本单位,延时200msvoiddelay(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字unsignedcharcodeStr[]={"TestbyDS18B20"};//说明显示的是温度unsignedcharcodeError[]={"Error!
Check!
"};//说明没有检测到DS18B20unsignedcharcodeTemp[]={"Temp:"};//说明显示的是温度unsignedcharcodeCent[]={"Cent"};//温度单位以下是对液晶模块的操作程序sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i>=1;_nop_();//等待一个机器周期DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time>=1;//将dat中的各二进制位数据右移1位}for(time=0;time//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitSCK=P3^4;//将SCK位定义为P3.
4引脚149sbitSI=P3^5;//将SI位定义为P3.
5引脚sbitSO=P3^6;//将SO位定义为P3.
6引脚sbitCS=P3^7;//将SCK位定义为P3.
7引脚#defineWREN0x06//写使能锁存器允许#defineWRDI0x04//写使能锁存器禁止#defineWRSR0x01//写状态寄存器#defineREAD0x03//读出#defineWRITE0x02//写入函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitSCK=P3^4;//将SCK位定义为P3.
4引脚sbitSI=P3^5;//将SI位定义为P3.
5引脚sbitSO=P3^6;//将SO位定义为P3.
6引脚sbitCS=P3^7;//将SCK位定义为P3.
7引脚#defineWREN0x06//写使能锁存器允许#defineWRDI0x04//写使能锁存器禁止#defineWRSR0x01//写状态寄存器#defineREAD0x03//读出#defineWRITE0x02//写入unsignedcharlamp[]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x00,0x81,0xC3,0xE7,0xFF,0xFF,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB,0x7E,0xFF,0xAA};//流水灯控制码函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;153for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitSCK=P3^4;//将SCK位定义为P3.
4引脚sbitSI=P3^5;//将SI位定义为P3.
5引脚sbitSO=P3^6;//将SO位定义为P3.
6引脚sbitCS1=P3^7;//将CS定义为P3.
7引脚sbitCS2=P3^3;//将CS1位定义为P3.
7引脚#defineWREN0x06//写使能锁存器允许#defineWRDI0x04//写使能锁存器禁止#defineREAD0x03//读出#defineWRITE0x02//写入函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件sbitCS=P3^4;//将CS位定义为P3.
4引脚sbitCLK=P1^0;//将CLK位定义为P1.
0引脚sbitDIO=P1^1;//将DIO位定义为P1.
1引脚unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字unsignedcharcodeStr[]={"Volt="};//说明显示的是电压以下是对液晶模块的操作程序sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒161voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含对片外存储器地址进行操作的头文件sbitCS=P2^7;//将CS位定义为P2.
7引脚sbitWR12=P3^6;//将WR12位定义为P3.
6引脚voidmain(void){unsignedchari;CS=0;//输出低电平以选中DAC0832WR12=0;//输出低电平以选中DAC0832while(1){for(i=0;i//包含单片机寄存器的头文件sbitIR=P3^2;//将IR位定义为P3.
2引脚unsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码unsignedintLowTime,HighTime;//储存高、低电平的宽度函数功能:对4个字节的用户码和键数据码进行解码167说明:解码正确,返回1,否则返回0出口参数:datbitDeCode(void){unsignedchari,j;unsignedchartemp;//储存解码出的数据for(i=0;i>1;//temp中的各数据位右移一位,因为先读出的是高位数据TH0=0;//定时器清0TL0=0;//定时器清0TR0=1;//开启定时器T0while(IR==0)//如果是低电平就等待;//低电平计时TR0=0;//关闭定时器T0LowTime=TH0*256+TL0;//保存低电平宽度TH0=0;//定时器清0TL0=0;//定时器清0TR0=1;//开启定时器T0while(IR==1)//如果是高电平就等待;TR0=0;//关闭定时器T0HighTime=TH0*256+TL0;//保存高电平宽度if((LowTime640))return0;//如果低电平长度不在合理范围,则认为出错,停止解码if((HighTime>420)&&(HighTime1300)&&(HighTime7800)&&(LowTime3600)&&(HighTime//包含单片机寄存器的头文件sbitIR=P3^2;//将IR位定义为P3.
2引脚unsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码unsignedintLowTime,HighTime;//储存高、低电平的宽度sbitRelay=P1^3;//将Relay位定义为P1.
3引脚函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0出口参数:datbitDeCode(void){unsignedchari,j;unsignedchartemp;//储存解码出的数据for(i=0;i>1;//temp中的各数据位右移一位,因为先读出的是高位数据TH0=0;//定时器清0TL0=0;//定时器清0TR0=1;//开启定时器T0while(IR==0)//如果是低电平就等待;//低电平计时TR0=0;//关闭定时器T0LowTime=TH0*256+TL0;//保存低电平宽度170TH0=0;//定时器清0TL0=0;//定时器清0TR0=1;//开启定时器T0while(IR==1)//如果是高电平就等待;TR0=0;//关闭定时器T0HighTime=TH0*256+TL0;//保存高电平宽度if((LowTime640))return0;//如果低电平长度不在合理范围,则认为出错,停止解码if((HighTime>420)&&(HighTime1300)&&(HighTime7800)&&(LowTime3600)&&(HighTime//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件以下是DS1302芯片的操作程序172unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字sbitDATA=P1^1;//位定义1302芯片的接口,数据输出端定义在P1.
1引脚sbitRST=P1^2;//位定义1302芯片的接口,复位端口定义在P1.
1引脚sbitSCLK=P1^0;//位定义1302芯片的接口,时钟输出端口定义在P1.
1引脚函数功能:延时若干微秒入口参数:nvoiddelaynus(unsignedcharn){unsignedchari;for(i=0;i>=1;//将dat的各数据位右移1位,准备写入下一个数据位}}函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据voidWriteSet1302(unsignedcharCmd,unsignedchardat){RST=0;//禁止数据传递SCLK=0;//确保写数居前SCLK被拉低173RST=1;//启动数据传输delaynus(2);//稍微等待,使硬件做好准备Write1302(Cmd);//写入命令字Write1302(dat);//写数据SCLK=1;//将时钟电平置于已知状态RST=0;//禁止数据传递}函数功能:从1302读一个字节数据入口参数:xunsignedcharRead1302(void){unsignedchari,dat;delaynus(2);//稍微等待,使硬件做好准备for(i=0;i>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1)//如果读出的数据是1dat|=0x80;//将1取出,写在dat的最高位SCLK=1;//将SCLK置于高电平,为下降沿读出delaynus(2);//稍微等待SCLK=0;//拉低SCLK,形成脉冲下降沿delaynus(2);//稍微等待}returndat;//将读出的数据返回}函数功能:根据命令字,从1302读取一个字节数据入口参数:CmdunsignedcharReadSet1302(unsignedcharCmd){unsignedchardat;RST=0;//拉低RSTSCLK=0;//确保写数居前SCLK被拉低RST=1;//启动数据传输Write1302(Cmd);//写入命令字dat=Read1302();//读出数据SCLK=1;//将时钟电平置于已知状态RST=0;//禁止数据传递returndat;//将读出的数据返回}174函数功能:1302进行初始化设置voidInit_DS1302(void){WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)>4)*10+(ReadValue&0x0F);//将读出数据转化DisplaySecond(second);//显示秒ReadValue=ReadSet1302(0x83);//从分寄存器读minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化DisplayMinute(minute);//显示分ReadValue=ReadSet1302(0x85);//从分寄存器读hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化DisplayHour(hour);//显示小时ReadValue=ReadSet1302(0x87);//从分寄存器读day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化DisplayDay(day);//显示日ReadValue=ReadSet1302(0x89);//从分寄存器读month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化DisplayMonth(month);//显示月ReadValue=ReadSet1302(0x8d);//从分寄存器读year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化DisplayYear(year);//显示年}}实例99:单片机数据发送程序#include//包含单片机寄存器的头文件函数功能:向PC发送一个字节数据voidSend(unsignedchardat){SBUF=dat;while(TI==0);TI=0;}函数功能:延时1ms(3j+2)i=(3*33+2)*10=1010(微秒),可以认为是1毫秒181voiddelay1ms(){unsignedchari,j;for(i=0;i//包含单片机寄存器的头文件#include//包含_nop_()函数定义的头文件182sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.
0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.
1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.
2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.
7引脚unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字unsignedintv;//储存电机转速unsignedcharcount;//储存定时器T0中断次数bitflag;//计满1秒钟标志位函数功能:延时1ms(3j+2)*i=(3*33+2)*10=1010(微秒),可以认为是1毫秒voiddelay1ms(){unsignedchari,j;for(i=0;isbitcp=P3^2;//将cp位定义为P3.
2引脚,从此脚输出脉冲信号187函数功能:延时约600微秒voiddelay(){unsignedchari;for(i=0;i<200;i++);}函数功能:主函数voidmain(void){while(1){cp=1;//置高电平delay();//等待600微秒cp=0;//置低电平delay();//等待600微秒}}
CloudCone商家在前面的文章中也有多次介绍,他们家的VPS主机还是蛮有特点的,和我们熟悉的DO、Linode、VuLTR商家很相似可以采用小时时间计费,如果我们不满意且不需要可以删除机器,这样就不扣费,如果希望用的时候再开通。唯独比较吐槽的就是他们家的产品太过于单一,一来是只有云服务器,而且是机房就唯一的MC机房。CloudCone 这次四周年促销活动期间,商家有新增独立服务器业务。同样的C...
优惠码年付一次性5折优惠码:TYO-Lite-Open-Beta-1y-50OFF永久8折优惠码:TYO-Lite-Open-Beta-Recur-20OFF日本vpsCPU内存SSD流量带宽价格购买1核1.5G20 GB4 TB1Gbps$10.9/月购买2核2 G40 GB6 TB1Gbps$16.9/月购买2核4 G60 GB8 TB1Gbps$21.9/月购买4核4 G80 GB12 TB...
spinservers怎么样?spinservers大硬盘服务器。Spinservers刚刚在美国圣何塞机房补货120台独立服务器,CPU都是双E5系列,64-512GB DDR4内存,超大SSD或NVMe存储,数量有限,机器都是预部署好的,下单即可上架,无需人工干预,有需要的朋友抓紧下单哦。Spinservers是Majestic Hosting Solutions,LLC旗下站点,主营美国独立...
伪静态为你推荐
淘宝收费淘宝要收费吗?博客外链怎么用博客发外链?支付宝查询余额支付宝怎么查余额?!?!镜像文件是什么系统镜像是什么腾讯文章腾讯罗剑楠是何许人也?淘宝网页显示不正常淘宝网页不能正常显示创维云电视功能创维电视怎么用,我买了个创维云电视,现在不知道怎么用手机往电视上传照片,谁能解答以下,iphone6上市时间苹果6什么时候出?QzongQZONG怎么玩?防钓鱼游戏中的防钓鱼检查是什么?
老左 免费申请网页 zpanel 512av 英语简历模板word 云鼎网络 国外在线代理 193邮箱 网通服务器 万网空间 阿里云邮箱登陆地址 云服务是什么意思 重庆服务器 hdsky tracker服务器 一句话木马 ddos攻击软件 kosskeb79 lighttpdwindows 免费网络电视软件 更多