51单片机C语言程序设计源代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2020-3-10-1-51单片机C语言教程例2.2.1编写程序,点亮第一个发光二极管(part2_1.cP27)#includereg52.h//52系列单片机头文件sbitled1=P1^0;//声明单片机P1口的第一位voidmain()//主函数{led1=0;/*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.cP39)#includereg52.h//52系列单片机头文件voidmain()//主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.cP42)#includereg52.h//52系列单片机头文件#defineuintunsignedint//宏定义sbitled1=P1^0;//声明单片机P1口的第一位2020-3-10-2-uinti,j;voidmain()//主函数{while(1)//大循环{led1=0;/*点亮第一个发光二极管*/for(i=1;i0;i--)//延时for(j=110;j0;j--);led1=1;/*关闭第一个发光二极管*/for(i=1000;i0;i--)//延时for(j=110;j0;j--);}}例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。(part2_4.cP48)#includereg52.h//52系列单片机头文件#defineuintunsignedint//宏定义sbitled1=P1^0;//声明单片机P1口的第一位voiddelay1s();//声明子函数2020-3-10-3-voidmain()//主函数{while(1)//大循环{led1=0;/*点亮第一个发光二极管*/delay1s();//调用延时子函数led1=1;/*关闭第一个发光二极管*/delay1s();//调用延时子函数}}voiddelay1s()//子函数体{uinti,j;for(i=500;i0;i--)for(j=110;j0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。(part2_5.cP49)#includereg52.h//52系列单片机头文件#defineuintunsignedint//宏定义sbitled1=P1^0;//声明单片机P1口的第一位2020-3-10-4-voiddelayms(uint);//声明子函数voidmain()//主函数{while(1)//大循环{led1=0;/*点亮第一个发光二极管*/delayms(200);//延时200毫秒led1=1;/*关闭第一个发光二极管*/delayms(800);//延时800毫秒}}voiddelayms(uintxms){uinti,j;for(i=xms;i0;i--)//i=xms即延时约xms毫秒for(j=110;j0;j--);}例2.8.3利用C51自带库_crol_(),以间隔500ms,实现流水灯程序(part2_6.cP53)#includereg52.h//52系列单片机头文件#includeintrins.h#defineuintunsignedint//宏定义2020-3-10-5-#defineucharunsignedcharvoiddelayms(uint);//声明子函数ucharaa;voidmain()//主函数{aa=0xfe;//赋初值11111110while(1)//大循环{P1=aa;delayms(500);//延时500毫秒aa=_crol_(aa,1);//将aa循环左移1位后再赋给aa}}voiddelayms(uintxms){uinti,j;for(i=xms;i0;i--)//i=xms即延时约xms毫秒for(j=110;j0;j--);}2020-3-10-6-例3.2.1编写程序使第一个数码管显示8(part2.1_.1cP59)#includereg52.h//52系列单片机头文件sbitdula=P2^6;//申明U1锁存器的锁存端sbitwela=P2^7;//申明U2锁存器的锁存端voidmain(){wela=1;//打开U2锁存器P0=0xFE;//送入位选信号wela=0;//关闭U2锁存器dula=1;//打开U1锁存器P0=0x7F;//送入段选信号dula=0;//关闭U2锁存器while(1);//程序停止到这里}例3.2.2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5ms,循环下去。(part2.1_2.cP61)#includereg52.h//52系列单片机头文件#defineucharunsignedchar#defineuintunsignedint2020-3-10-7-sbitdula=P2^6;//申明U1锁存器的锁存端sbitwela=P2^7;//申明U2锁存器的锁存端ucharnum;uncharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voidmain(){wela=1;//打开U2锁存端P0=0xco;//送入位选信号wela=0;//关闭U2锁存端while(1){for(num=0;num16;num++)//16个数循环显示{dula=1;//打开U1锁存端P0=table[num];//送入段选信号dula=0;//关闭U1锁存端delay(500);//延时0.5秒2020-3-10-8-}}}voiddelayms(uintxms){uinti,j;for(i=xms;i0;i--)//i=xms即延时约xms毫秒for(j=110;j0;j--);}例3.3.1第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它……一直到最后一个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.cP62)例3.5.2用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。(part2.1_5.cP75)2020-3-10-9-例4.1.1用数码管前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。(part2.2_1.cP82)#includereg52.h//52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitkey1=P3^4;sbitkey2=P3^5;sbitkey3=P3^6;sbitkey4=P3^7;sbitdula=P2^6;//申明U1锁存器的锁存端sbitwela=P2^7;//申明U2锁存器的锁存端ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);2020-3-10-10-ucharnumt0,num;voiddisplay(ucharnumdis)//显示子函数{ucharshi,ge;//分离两个分别要显示的数shi=numdis/10;ge=numdis%10;dula=1;P0=table[shi];//送十位段选数据dula=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时wela=1;//原来段选数据通过位选锁存器造成混乱P0=0xfe;//送位选数据wela=0;delayms(5);//延时dula=1;P0=table[ge];//送个位段选数据dula=0;P0=0xff;wela=1;P0=0xfd;2020-3-10-11-wela=0;delayms(5);}voiddelayms(uintxms){uinti,j;for(i=xms;i0;i--)//i=xms即延时约xms毫秒for(j=110;j0;j--);}voidinit()//初始化函数{TMOD=0x01;//设置定时器0为工作方式1(00000001)TH0=(65536-45872)/256;//装初值50ms一次中断TL0=(65536-45872)%256;EA=1;//开总中断ET0=1;//开定时器0中断}voidkeyscan(){if(key1==0){delayms(10);2020-3-10-12-if(key1==0){num++;if(num==60)//当到60时重新归0num=0;while(!key1);//等待按键释放}}if(key2==0){delayms(10);if(key2==0){if(num==0)//当到0时重新归60num=60;num--;while(!key2);}}if(key3==0){delayms(10);2020-3-10-13-if(key3==0){num=0;//清0while(!key3);}}if(key4==0){delayms(10);if(key4==0){while(!key4);TR0=~TR0;//启动或停止定时器0}}}voidmain(){init();//初始化函数while(1){keyscan();2020-3-10-14-display(num);}}voidT0_time()interrupt1{TH0=(65536-45872)/256;//重装初值TL0=(65536-45872)%256;numt0++;if(numt0==20)//如果到了20次,说明1秒时间到{numt0=0;//然后把num清0重新再计20次num++;if(num==60)num=0;}}例4.2.1实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0~F,六个数码管同时静态显示即可。(part2.2_2.cP87)#includereg52.h//52系列单片机头文件#defineucharunsignedchar2020-3-10-15-#defineuintunsignedintsbitdula=P2^6;//申明U1锁存器的锁存端sbitwela=P2^7;//申明U2锁存器的锁存端ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uintxms){uinti,j;for(i=xms;i0;i--)//i=xms即延时约xms毫秒for(j=110;j0;j--);}voiddisplay(ucharnum){P0=table[num];//显示函数只送段选数据dula=1;dula=0;}voidmatrixkeyscan(){2020-3-10-16-uchartemp,key;P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xee:key=0;break;case0xde:key=1;break;ca

1 / 280
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功