|

楼主 |
发表于 2011-7-13 18:02:55
|
显示全部楼层
本帖最后由 xjw01 于 2011-7-13 18:13 编辑
- /*************************************
- 6位半LTC2400驱动程序
- xjw01 于莆田 2011.7
- **************************************/
- //====================================
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #include <reg52.h>
- #include <math.h>
- void delay(uint loop) { uint i; for(i=0;i<loop;i++); } //延时函数
- //void delay2(uint k){ for(;k>0;k--) delay(10000); } //长延时,k=100大约对应1秒
- /**********
- 字形编码图
- 32
- -
- 64| | 128
- - 16
- 1| | 8
- _. 4
- 2
- **********/
- uchar code zk[20]={235,136,179,186,216,122,123,168,251,250}; //字库
- uchar disp[6]={168,251,250,186,179,136};
- sfr P1M1=0x91; //P1端口设置寄存器
- sfr P1M0=0x92; //P1端口设置寄存器
- sfr P0M1=0x93; //P0端口设置寄存器
- sfr P0M0=0x94; //P0端口设置寄存器
- sfr P2M1=0x95; //P2端口设置寄存器
- sfr P2M0=0x96; //P2端口设置寄存器
- sfr P3M1=0xB1; //P3端口设置寄存器
- sfr P3M0=0xB2; //P3端口设置寄存器
- sbit ds0=P2^2; //数码管扫描口
- sbit ds1=P2^3; //数码管扫描口
- sbit ds2=P2^4; //数码管扫描口
- sbit ds3=P2^5; //数码管扫描口
- sbit ds4=P2^6; //数码管扫描口
- sbit ds5=P2^7; //数码管扫描口
- //功能程序开始
- void cls(){ char i; for(i=0;i<6;i++) disp[i]=0; } //清屏
- void showDig(long f){ //显示数字
- uchar i;
- cls();
- for(i=0;i<6;i++) { disp[i]=zk[f%10], f/=10; if(!f) break; }
- }
- sbit P_SCK=P1^0; //时钟
- sbit P_SDO=P1^1; //数据
- sbit P_CS =P1^2; //片选
- sbit P_s6 =P3^5; //6位显示
- #define en 5 //平均次数
- ulong pv=0; //AD转换均值
- void get_adc(){
- char i,plo=0; //符号位
- ulong v=0; //AD转换结果
- if(P_SDO) return;
- v = 0, plo = 0;
- for(i=0;i<32;i++){
- P_SCK = 1; delay(1);
- v = (v<<1);
- if(P_SDO) { if(i==2) plo=1; else v++; }
- P_SCK = 0; delay(1);
- }
- if(!plo) v = 0x20000000 - v;
- v = 5000000.0*v/0x10000000;
- if(abs(v-pv/en)>50) pv = v*en;
- else pv = v + pv - pv/en;
- v = pv/en;
- if(P_s6) showDig(v/10);
- else showDig(v);
- if(!plo) disp[5] += 16;
- }
- void zd0(void) interrupt 0 {//int0中断(下降沿)
- }
- void timerInter(void) interrupt 1 {//T0中断
- }
- main(){
- uchar dispN=0; //显示扫描索引
- TCON=0, TMOD=0x09; //将T0置为16位内部计数,并由外部启动计数。
- IT0=1; //使int0下降沿中断有效。
- TH0=0, TL0=0;
- TR0=1; //T0启动计数
- EX0=1; //开int0外部中断
- ET0=1; //T0开中断
- EA=1; //开总中断
- PT0=1; //中断优先
- P2M0 = 0xFC; //P2.234567置为推勉输出
- //P1M0 = 0x05; //P1.02置为推勉输出
- //P1M1 = 0x02; //P1.1置为高阻抗
- //P3M0 = 0x0C; //P3.23置为推勉输出口
- delay(4000);
- P_CS=1; delay(1);
- P_SCK=0;delay(1);
- P_CS=0;
-
- while(1){
- //显示disp
- get_adc();
- dispN=(++dispN)%6; //扫描器移动
- ds0=ds1=ds2=ds3=ds4=ds5=0;
- if(dispN==0) ds0=1;
- if(dispN==1) ds1=1;
- if(dispN==2) ds2=1;
- if(dispN==3) ds3=1;
- if(dispN==4) ds4=1;
- if(dispN==5) ds5=1;
- P0=~disp[dispN]; //显示
- delay(4000);
- }//while end
- }
复制代码 |
评分
-
2
查看全部评分
-
|