1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| //摘要: //四位数码管显示采集的电位器AD(代码值) //Designed by Cache.Lee 2013.11.15
#include "STC12C5A60S2.h" #include <I2C.H>
#define uchar unsigned char #define uint unsigned int
#define PCF8591 0x90 //PCF8591 地址
#define THCO 0xf8 //11.0592MHZ晶振 #define TLCO 0xcb //定时2ms时间常数值
unsigned char Data_Buffer[4]={1,2,3,4}; uchar code Duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
sbit P24=P2^4; //四个数码管的位码口定义 sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7;
bit flag=0;
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val); bit ISendByte(unsigned char sla,unsigned char c); unsigned char IRcvByte(unsigned char sla); /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void main(void) //主程序 { unsigned int v; unsigned char AD_CHANNEL=1; unsigned int D[5]={0,0,0,0,255};
TMOD=0x11; //设置定时器0工作模式,16位计数模式 TH0=THCO; TL0=TLCO; TR0=1; //启动定时器 ET0=1; //使能定时器中断 EA=1; //开总中断 while(1) { if(flag==1) {flag=0; ISendByte(PCF8591,0x01); v=IRcvByte(PCF8591);
Data_Buffer[0]=0;//高位显示0,因为8位ADC最大值:255,第四位用不上 Data_Buffer[1]=v/100%10; Data_Buffer[2]=v/10%10; Data_Buffer[3]=v%10; } } }
void timer0() interrupt 1 //定时器中断服务子程序 { static unsigned int count=0;//软计时变量定义 static unsigned char Bit=0; //静态变量,退出程序后,值保留
TH0=THCO; TL0=TLCO;
Bit++; if(Bit>=4)Bit=0; P2|=0xf0; //先关位码 P0=Duan[Data_Buffer[Bit]]; //开段码 switch(Bit) //送位码 { case 0: P24=0;break; case 1: P25=0;break; case 2: P26=0;break; case 3: P27=0;break; }
count++; if(count>=250) //半S时间到 { count=0; flag=1; } }
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* DAC 变换, 转化函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) { Start\_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); //发送控制字节 if(ack==0)return(0); SendByte(Val); //发送DAC的数值 if(ack==0)return(0); Stop\_I2c(); //结束总线 return(1); }
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* ADC发送字节[命令]数据函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ bit ISendByte(unsigned char sla,unsigned char c) { Start\_I2c(); //启动总线 SendByte(sla+1); //发送器件地址+1 if(ack==0)return(0); SendByte(c); //发送数据 if(ack==0)return(0); Stop\_I2c(); //结束总线 return(1); }
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* ADC读字节数据函数 8位AD.DA转换器 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ unsigned char IRcvByte(unsigned char sla) { unsigned char c;
Start\_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 if(ack==0)return(0); c=RcvByte(); //读取数据0
Ack\_I2c(1); //发送非就答位 Stop\_I2c(); //结束总线 return(c); }
|