51单片机学习
单片机源程序如下:
- #include"reg52.h"
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit PPM=P3^2; //也是外部中断0的io
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 TIME;
- u8 text[4];
- u8 digdisplay[3];
- u8 code smgduan[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码
- void delay(u16 time){
- while(time--);
- }
- void Display(){
- u8 i;
- for(i=0;i<3;i++){
- switch(i){
- case 0:LSA=0,LSB=0,LSC=0;break;
- case 1:LSA=1,LSB=0,LSC=0;break;
- case 2:LSA=0,LSB=1,LSC=0;break;
- }
- P0=digdisplay[i];
- delay(100);
- P0=0x00;
- }
- }
- void Irinit0(){
- IT0=1;//选择下降沿有效
- EX0=1; //开外部中断0
- EA=1; //开总中断
- PPM=1; //初始化
- }
- void main(){
- Irinit0();
- while(1){
- digdisplay[0]=smgduan[16];
- digdisplay[1]=smgduan[text[2]%16];//低四位
- digdisplay[2]=smgduan[text[2]/16];//高四位
- Display();
- }
- }
- void Ir_Read() interrupt 0
- {
- u16 i,j;
- u8 err;
- TIME=0;
- delay(700);
- if(PPM==0){
- err=1000;
- while(PPM==0&&err>0){
- delay(1);
- err--;
- }
- if(PPM==1){ // 如果等到9ms后的高电平,在等4.5ms高电平过去
- err=500;
- while(PPM==1&&err>0)
- delay(1);
- err--;
- }
- for(i=0;i<4;i++){ //需要接收四针数据,用户码,用户码,数据码,数据反码
- for(j=0;j<8;j++){
- err=60;
- while(PPM==0&&err>0){ //等待每一个字节前的0.56ms过去
- delay(1);
- err--;
- }
- TIME=0;
- err=100; //防止等待时间太长
- while(PPM==1&&err>0){
- delay(10);//0.1ms
- TIME++;
- err--;
- if(TIME>30){
- return;
- }
- }
- text[i]>>=1;
- if(TIME>=8){
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
c51复习.zip
(378.43 KB, 下载次数: 17)
|