单片机交流
直播中

李明聪

7年用户 1137经验值
私信 关注
[问答]

请问基于C51单片机的流水灯实验该如何去实现?

基于C51单片机的流水灯实验该如何去实现?
如何去完成一种C51单片机的按键实验?

回帖(1)

李木木

2021-7-14 13:57:18
  前言
  本次实验所用单片机为C51单片机,CPU为AT89C52,使用的开发软件是Keil uVision4,将程序下载到单片机所使用的软件为stc-isp-15xx-v6.85H.exe。
  C51单片机流水灯实验的实现
  1、点击File-》New创建一个新文档。
  2、在文档中书写如下程序。
  (注:第一种流水灯程序代码如下)
  #include《reg52.h》 //定义led灯变量 ***it led0=P1^0; ***it led1=P1^1; ***it led2=P1^2; ***it led3=P1^3; ***it led4=P1^4; ***it led5=P1^5; ***it led6=P1^6; ***it led7=P1^7; //延时函数延迟一秒 void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } int main() { while(1) { led0=0; Delay1000ms(); led1=0; Delay1000ms(); led2=0; Delay1000ms(); led3=0; Delay1000ms(); led4=0; Delay1000ms(); led5=0; Delay1000ms(); led6=0; Delay1000ms(); led7=0; Delay1000ms(); P1=0xFF; Delay1000ms() } return 0; } (注:第二种流水灯程序实现代码如下)
  #include《reg52.h》 //定义led灯变量 ***it led0=P1^0; ***it led1=P1^1; ***it led2=P1^2; ***it led3=P1^3; ***it led4=P1^4; ***it led5=P1^5; ***it led6=P1^6; ***it led7=P1^7; //延时函数,延迟一秒 void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } int main() { while(1) { P1=0x7F; Delay1000ms(); P1=0xBF; Delay1000ms(); P1=0xDF; Delay1000ms(); P1=0xEF; Delay1000ms(); P1=0xF7; Delay1000ms(); P1=0xFB; Delay1000ms(); P1=0xFD; Delay1000ms(); P1=0xFE; Delay1000ms(); } return 0; } 3、在如图所示界面点击下载编程,然后按下单片机上的蓝色按钮即可成功下载到,观察单片机上LED实现即可。
  C51单片机按键实验的实现
  1、点击File-》New创建一个新文档。
  2、在文档中书写如下程序。
  #include《reg52.h》 //定义LED灯变量 ***it led0=P1^0; ***it led1=P1^1; ***it led2=P1^2; ***it led3=P1^3; //定义按键变量 ***it key1=P3^3; ***it key2=P3^4; ***it key3=P3^6; ***it key4=P3^7; int main() { while(1) { if(key1==0) { if(led0==1) { led0=0; } else { led0=1; } } if(key2==0) { if(led1==1) { led1=0; } else { led1=1; } } if(key3==0) { if(led2==1) { led2=0; } else { led2=1; } } if(key4==0) { if(led3==1) { led3=0; } else { led3=1; } } } return 0; } 3、在如图所示界面点击下载编程,然后按下单片机上的蓝色按钮即可成功下载到,按下按钮,观察单片机上按键和LED实现即可。
  3.1–第3步中遇到的问题
  问题一:按下按钮出现接触不良的情况。
  问题原因:按键抖动。
  解决办法:软件消抖。
  (注:消抖使用代码如下)
  #include《reg52.h》 //定义LED灯变量 ***it led0=P1^0; ***it led1=P1^1; ***it led2=P1^2; ***it led3=P1^3; //定义按键变量 ***it key1=P3^3; ***it key2=P3^4; ***it key3=P3^6; ***it key4=P3^7; //定义无符号字符变量 unsigned char k1,k2,k3,k4,k5,k6,k7,k8; //延时函数延时5毫秒 void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 9; j = 244; do { while (--j); } while (--i); } int main() { while(1) { k1=key1; Delay5ms(); k2=key1; if(k1!=k2) //确保状态未变 { continue; } if(key1==0) { if(led0==1) { led0=0; } else { led0=1; } } while(key1==0); //确保状态改变 k3=key2; Delay5ms(); k4=key2; if(k3!=k4) { continue; } if(key2==0) { if(led1==1) { led1=0; } else { led1=1; } } while(key2==0); k5=key3; Delay5ms(); k6=key3; if(k5!=k6) { continue; } if(key3==0) { if(led2==1) { led2=0; } else { led2=1; } } while(key3==0); k7=key4; Delay5ms(); k8=key4; if(k7!=k8) { continue; } if(key4==0) { if(led3==1) { led3=0; } else { led3=1; } } while(key4==0); } return 0; } C51单片机蜂鸣器实验的实现
  1、点击File-》New创建一个新文档。
  2、在文档中书写如下程序。
  #include《reg52.h》 //按键变量定义 ***it key1=P3^3; //蜂鸣器变量定义 ***it FM=P0^7 ; //延时函数延时5毫秒 void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 9; j = 244; do { while (--j); } while (--i); } unsigned char k1,k2; int main() { while(1) { //蜂鸣器实验 k1=key1; Delay5ms(); k2=key1; if(k1!=k2) { continue; } if(key1==0) { if(FM==1) { FM=0; } else { FM=1; } } while(key1==0); } return 0; } 3、在如图所示界面点击下载编程,然后按下单片机上的蓝色按钮即可成功下载到,按下按钮,观察单片机上按键和蜂鸣器实现即可。
  C51单片机综合实验的实现
  1、点击File-》New创建一个新文档。
  2、在文档中书写如下程序。
  #include《reg52.h》 ***it led0=P1^0; ***it led1=P1^1; ***it led2=P1^2; ***it led3=P1^3; ***it led4=P1^4; ***it led5=P1^5; ***it led6=P1^6; ***it led7=P1^7; ***it key1=P3^3; ***it key2=P3^4; ***it key3=P3^6; ***it key4=P3^7; ***it FM=P0^7 ; unsigned char k1,k2,k3,k4,k5,k6,k7,k8; void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 9; j = 244; do { while (--j); } while (--i); } int main() { while(1) { //综合实验 k1=key1; Delay5ms(); k2=key1; if(k1!=k2) { continue; } if(key1==0) { if(FM==1) { FM=0; } else { FM=1; } } while(key1==0); k3=key2; Delay5ms(); k4=key2; if(k3!=k4) { continue; } if(key2==0) { P1=0x7F; Delay1000ms(); P1=0xBF; Delay1000ms(); P1=0xDF; Delay1000ms(); P1=0xEF; Delay1000ms(); P1=0xF7; Delay1000ms(); P1=0xFB; Delay1000ms(); P1=0xFD; Delay1000ms(); P1=0xFE; Delay1000ms(); } while(key2==0); k5=key3; Delay5ms(); k6=key3; if(k5!=k6) { continue; } if(key3==0) { led0=0; Delay1000ms(); led1=0; Delay1000ms(); led2=0; Delay1000ms(); led3=0; Delay1000ms(); led4=0; Delay1000ms(); led5=0; Delay1000ms(); led6=0; Delay1000ms(); led7=0; Delay1000ms(); P1=0xFF; Delay1000ms(); } while(key3==0); k7=key4; Delay5ms(); k8=key4; if(k7!=k8) { continue; } if(key4==0) { if(led3==1) { led3=0; } else { led3=1; } } while(key4==0); } return 0; } 3、在如图所示界面点击下载编程,然后按下单片机上的蓝色按钮即可成功下载到,按下按钮,观察单片机上LED和按键以及蜂鸣器实现即可。
  轮询和中断的讲解
  1、轮询和中断的工作形式。
  2、C51单片机的中断源。
  3、C51单片机的中断要考虑的问题一。
  4、C51单片机的中断要考虑的问题二。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分