logo资料库

郭天祥51单片机书中所有代码.pdf

第1页 / 共129页
第2页 / 共129页
第3页 / 共129页
第4页 / 共129页
第5页 / 共129页
第6页 / 共129页
第7页 / 共129页
第8页 / 共129页
资料共129页,剩余部分请下载后查看
新概念 51 单片机 C 语言教程 ----入门、提高、开发、拓展全攻略 例 2.2.1 编写程序,点亮第一个发光二极管(part2_1.c P27 ) #include //52 系列单片机头文件 sbit led1=P1^0; //声明单片机 P1 口的第一位 //主函数 void main() { } led1=0; /*点亮第一个发光二极管*/ 例 2.2.2 编写程序,点亮 P1 口的若干二极管(part2_2.c P39 ) #include //52 系列单片机头文件 void main() //主函数 { P1=0xaa; //while(1); } 例 2.5.1 利用 for 语句延时特性,编写第一个发光二极管以间隔 1S 亮灭闪动的程序(part2_3.c P42) #include //52 系列单片机头文件 #define uint unsigned int //宏定义 sbit led1=P1^0; //声明单片机 P1 口的第一位 uint i,j; void main() //主函数 while(1) //大循环 { } led1=0; for(i=1;i>0;i--) for(j=110;j>0;j--); led1=1; for(i=1000;i>0;i--) /*点亮第一个发光二极管*/ //延时 /*关闭第一个发光二极管*/ //延时 for(j=110;j>0;j--); { } 例 2.6.1 编写程序使第一个发光二极管以间隔 500ms 亮灭闪动。(part2_4.c P48) #include #define uint unsigned int sbit led1=P1^0; void delay1s(); void main() //52 系列单片机头文件 //宏定义 //声明单片机 P1 口的第一位 //声明子函数 //主函数 - 1 -
//大循环 /*点亮第一个发光二极管*/ //调用延时子函数 /*关闭第一个发光二极管*/ //调用延时子函数 //子函数体 { } while(1) { led1=0; delay1s(); led1=1; delay1s(); } void delay1s() { } uint i,j; for(i=500;i>0;i--) for(j=110;j>0;j--); 例 2.7.1 编写程序使第一个二极管以亮 200ms、灭 800ms 的方式闪动。(part2_5.c P49) #include //52 系列单片机头文件 #define uint unsigned int sbit led1=P1^0; void delayms(uint); void main() while(1) led1=0; delayms(200); led1=1; delayms(800); { } { } void delayms(uint xms) //宏定义 //声明单片机 P1 口的第一位 //声明子函数 //主函数 //大循环 /*点亮第一个发光二极管*/ //延时 200 毫秒 /*关闭第一个发光二极管*/ //延时 800 毫秒 { uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒 for(j=110;j>0;j--); } 例 2.8.3 利用 C51 自带库_crol_(),以间隔 500ms,实现流水灯程序(part2_6.c P53) #include //52 系列单片机头文件 #include #define uint unsigned int #define uchar unsigned char void delayms(uint); uchar aa; void main() { aa=0xfe; //宏定义 //声明子函数 //主函数 //赋初值 11111110 - 2 -
while(1) //大循环 { P1=aa; delayms(500); //延时 500 毫秒 aa=_crol_(aa,1); //将 aa 循环左移 1 位后再赋给 aa } } void delayms(uint xms) uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒 for(j=110;j>0;j--); { } 例 3.2.1 编写程序使第一个数码管显示 8(part2.1_.1c P59) #include sbit dula=P2^6; //申明 U1 锁存器的锁存端 sbit wela=P2^7; //申明 U2 锁存器的锁存端 //52 系列单片机头文件 void main() { wela=1; //打开 U2 锁存器 P0=0xFE; //送入位选信号 wela=0; //关闭 U2 锁存器 dula=1; //打开 U1 锁存器 P0=0x7F; //送入段选信号 dula=0; //关闭 U2 锁存器 - 3 -
while(1); //程序停止到这里 } 例 3.2.2 让实验板上 6 个数码管同时点亮,依次显示 0 到 F,时间间隔为 0.5ms,循环下去。(part2.1_2.c P61) #include //52 系列单片机头文件 #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; //申明 U1 锁存器的锁存端 sbit wela=P2^7; //申明 U2 锁存器的锁存端 uchar num; unchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint); void main() { wela=1; //打开 U2 锁存端 P0=0xco; //送入位选信号 wela=0; //关闭 U2 锁存端 while(1) { for(num=0;num<16;num++) //16 个数循环显示 { } dula=1; //打开 U1 锁存端 P0=table[num]; //送入段选信号 dula=0; //关闭 U1 锁存端 delay(500); //延时 0.5 秒 } } void delayms(uint xms) { } uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒 for(j=110;j>0;j--); 例 3.3.1 第一个数码管显示 1,时间为 0.5s,然后关闭它,立即让第二个数码管显示 2,时间为 0.5s,在关闭它„„ 一直到最后一个数码管显示 6,时间同样为 0.5s ,关闭它之后再回来显示第一个数码管,一直循环下去。 (part2.1_3.c P62) 例 3.5.2 用定时器 0 的方式 1 实现第一个发光二极管以 200ms 间隔闪烁,用定时器 1 的方式 1 实现数码管前两位 59s 循环计时。(part2.1_5.c P75) - 4 -
例 4.1.1 用数码管前两位显示一个十进制数,变化范围为 00~59,开始时显示 00,每按下 S2 键一次,数值加 1; 每按下 S3 键一次,数值减 1;每按下 S4 键一次,数值归零;按下 S5 键一次,利用定时器功能使数值开始自动 每秒加 1,再次按下 S5 键,数值停止加 1,保持显示原数。(part2.2_1.c P82) #include //52 系列单片机头文件 #define uchar unsigned char #define uint unsigned int sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; sbit dula=P2^6; sbit wela=P2^7; //申明 U1 锁存器的锁存端 //申明 U2 锁存器的锁存端 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint); uchar numt0,num; void display(uchar numdis) //显示子函数 - 5 -
uchar shi,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; wela=0; delayms(5); } void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒 for(j=110;j>0;j--); } void init() //初始化函数 { } TMOD=0x01;//设置定时器 0 为工作方式 1(0000 0001) TH0=(65536-45872)/256;//装初值 50ms 一次中断 TL0=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开定时器 0 中断 void keyscan() { if(key1==0) { delayms(10); if(key1==0) { num++; if(num==60)//当到 60 时重新归 0 num=0; - 6 -
while(!key1);//等待按键释放 } } if(key2==0) { } delayms(10); if(key2==0) { } if(num==0)//当到 0 时重新归 60 num=60; num--; while(!key2); if(key3==0) { } delayms(10); if(key3==0) { } num=0; //清 0 while(!key3); if(key4==0) { } delayms(10); if(key4==0) { } while(!key4); TR0=~TR0;//启动或停止定时器 0 } void main() { } init();//初始化函数 while(1) { } keyscan(); display(num); void T0_time() interrupt 1 { TH0=(65536-45872)/256;//重装初值 TL0=(65536-45872)%256; numt0++; - 7 -
if(numt0==20) //如果到了 20 次,说明 1 秒时间到 { } numt0=0; //然后把 num 清 0 重新再计 20 次 num++; if(num==60) num=0; } 例 4.2.1 实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示 0~F,六个数码管同时静态显 示即可。(part2.2_2.c P87) #include //52 系列单片机头文件 #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; //申明 U1 锁存器的锁存端 //申明 U2 锁存器的锁存端 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint xms) { } uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒 for(j=110;j>0;j--); void display(uchar num) { } P0=table[num]; //显示函数只送段选数据 dula=1; dula=0; void matrixkeyscan() { uchar temp,key; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; - 8 -
分享到:
收藏