unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //8个数码管的“管选”码 unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0~9以及空格的显示字模 unsigned char dispbuf[8]={10,10,10,10,0,0,0,0}; //8个字节的显示缓冲区 unsigned char dispcount; unsigned char getdata; //存放AD转换结果的变量 unsigned int temp; //存放具体物理量值的变量 unsigned char i; sbit ST=P3^0; //启动下一次AD转换的控制信号,8051-->AD芯片 sbit OE=P3^1; //AD芯片输出使能控制信号, 8051-->AD芯片 sbit EOC=P3^2; //表示当前AD转换完成的状态信号,AD芯片--->8051 sbit CLK=P3^3; //AD芯片的时钟信号,8051-->AD芯片 void main(void) { ST=0; OE=0; ET0=1; ET1=1; EA=1; TMOD=0x12; //定时器0工作在16位方式,定时器1工作在8位自动重装载方式 TH0=216; //定时器0的定时常数=256-216=40, 如果使用12MHz晶体,就是40us定时 TL0=216; TH1=(65536-4000)/256; TL1=(65536-4000)%256; //类似,如果使用12MHz晶体,定时器1的定时值就是4000us(或者说4ms) TR1=1; TR0=1; ST=1; ST=0; while(1) //main()函数的主循环 { if(EOC==1) //如果当前AD转换结束 { OE=1; getdata=P0; OE=0; temp=getdata*235; //????*235是什么意思? temp=temp/128; //????这又是什么意思? //上面两行的意思应该是乘以一个系数:235/128以便归一化到某个具体的物理量上,比如测量温度, //AD转换的电压值和温度值之间有一个转换系数,通过这样的处理,显示的就是真实的温度值了 i=5; //******************************以下8行给显示缓冲区赋初始值**************************** dispbuf[0]=10; dispbuf[1]=10; dispbuf[2]=10; dispbuf[3]=10; dispbuf[4]=10; dispbuf[5]=0; dispbuf[6]=0; dispbuf[7]=0; //******************************以上8行给显示缓冲区赋初始值**************************** //*****以下从高位到低位取出各位的值到显示缓冲区(temp是字节量,也就是从百位到个位取)***** while(temp/10) //注意i从5开始 { dispbuf=temp%10; temp=temp/10; i++; } dispbuf=temp; //*****以上从高位到低位取出各位的值到显示缓冲区(temp是字节量,也就是从百位到个位取)***** ST=1; ST=0; //重新启动下一个AD转换过程 } } } void t0(void) interrupt 1 using 0 //这个中断每隔40us发生一次,每两次在P3.3上生成一个方波 { CLK=~CLK;//在P3.3引脚上产生方波,结合前面说到的40us定时,频率f=[1000000/(40+40)=25KHz }
//下面这个中断每隔4ms发生一次,每次通过P1把一个显示字模送出去,至于送出去的这个字模显示到哪 //个数码管上,这又是通过P2来选中一个数码管把这个字模显示出来的(第dispcount个被选中) //dispcount是循环变化的(从0变化到7),所以每隔4ms从0号数码管到7号数码管循环显示对应的数码. void t1(void) interrupt 3 using 0 { TH1=(65536-4000)/256; TL1=(65536-4000)%256; // P1=dispcode][dispbuf][dispcount]]; //这里你把放括号打错了!!! P1=dispcode[ dispbuf][dispcount] ]; //应该是这样的(加空格是为了你看得更清楚) P2=dispbitcode[dispcount]; //P1和P2的说明在最后 if(dispcount==7) //估计最后一个数码管的小数点显示了并且P1的最高位控制小数点的亮灭 { P1=P1 | 0x80; } dispcount++; if(dispcount==8) //dispcount在0~7之间递增循环变化,对应0~7号数码管 { dispcount=0; } } //进一步说明:假定dispbuf[0]~dispbuf[7]里内容是{10, 10, 10, 10, 10, 3, 1, 4 } // 对应的dispcount = 0 1 2 3 4 5 6 7 // 对应的P1 = 0x00,0x00,0x00,0x00,0x00,0x4f,0x06,0x66 //P1的某一位为1,数码管对应的笔画就点亮了 全灭 全灭 全灭 全灭 全灭 数码管上显示3,1,4 //的时候各有几个笔画点亮?0x4f,0x06,0x66里各有几个位为1?
//还是假定dispbuf[0]~dispbuf[7]里内容是{10, 10, 10, 10, 10, 3, 1, 4 } // 对应的dispcount = 0 1 2 3 4 5 6 7 // 对应的P2 = 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f // 11111110,11111101,11111011,11110111,11101111,11011111,10111111,01111111 //注意上一行中每个字节只有一位为0,对应位置上的数码关2被选中 //注释说明够详细了吧?再不明白我就只好跳楼了!不过你得先给我买一楼,五层的就够了
|