
51单片的1 AD采集电位器电压并显示代码值
电路原理图如下:
单片机源程序如下:
代码:
- //摘要:
- //四位数码管显示采集的电位器AD(代码值)
- //Designed by Cache.Lee
- #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,0x41);
- v=IRcvByte(PCF8591);
- Data_Buffer[0]=0;
- 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); //发送器件地址
- if(ack==0)return(0);
- SendByte(c); //发送数据
- if(ack==0)return(0);
- Stop_I2c(); //结束总线
- return(1);
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料51hei提供下载: