《AD1674(双极性输入—5V-+5V)和MAX7221程序及proteus仿真.doc》由会员分享,可在线阅读,更多相关《AD1674(双极性输入—5V-+5V)和MAX7221程序及proteus仿真.doc(6页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、AD1674(双极性输入5V+5V)和MAX7221程序及proteus仿真图形中P代表“+”原件清单#include#include#define uchar unsigned char #define uint unsigned int#define addo (10.0/4095.0)/转换进率,12位精度(212-1=4095),满量程为10V/*管脚定义*/sbit DIN = P25;sbit SCL = P26;sbit CS = P27;sbit STS = P20;sbit CS1 = P21;sbit A0 = P22;sbit CE = P23;sbit RC = P24
2、;static uchar disbuf8;/显示缓存/*微秒延时函数*/void delay_us(uchar n) uchar i;while(n-) for(i=0;i10;i+);/*毫秒延时函数*/void delay_ms(uint n)uchar i;while(n-) for(i=0;i100;i+);/*向MAX7221串行写一个字节的数据*/void WriteData(uchar dat)uchar i;for(i=0;ii)?1:0; SCL = 0; delay_us(2); SCL = 1; delay_us(2);/*向MAX7221中指定的地址写入数据*/voi
3、d MAX7221_Write(uchar addr,uchar dat)CS = 0;WriteData(addr);WriteData(dat);CS = 1;/*MAX7221的初始化*/void MAX7221_Initial(void)MAX7221_Write(0x0A,0x07);/LED亮度值设置为8/16MAX7221_Write(0x0B,0x07);/扫描显示器的个数为8个MAX7221_Write(0x0C,0x01);/正常操作模式(非掉电模式)MAX7221_Write(0x0F,0x00);/正常显示模式(非测试模式)MAX7221_Write(0x09,0xff
4、);/对07的8个数据进行B型BCD译码/*LED显示函数*/void display(void)uchar i;for(i=0;i8;i+) MAX7221_Write(i+1,disbufi);/*读取AD1674转换结果*/uint AD1674_Read(void) uint temp; uchar temp1,temp2; CS1 = 1; CE = 0; /初始化,关闭数据采集 CS1 = 0; A0 = 0; RC = 0; CE = 1; /CE=1,CS1=0,RC=0,A0=0启动12位温度转换 _nop_(); while(STS=1);/等待数据采集结束 CE = 0;
5、 /芯片使能关闭 RC = 1; A0 = 0; CE = 1; /CE=1,CS1=0,RC=1,12/8=1,A0=0允许高八位数据并行输出 _nop_(); temp1 = P0;/读取转换结果的高八位 CE = 0;/芯片使能关闭 RC = 1; A0 = 1; CE = 1;/CE=1,CS1=0,RC=1,12/8=0,A0=1允许低四位数据并行输出 _nop_(); temp2 = P0;/读取转换结果的低四位 CE = 0; CS1 = 1;/关闭AD1674数据采集 temp = (temp14; /返回转换结果,右移四位是因为temp2为P0口的高四位/*if(temp0x
6、000)&(temp0x800) temp=temp-0x800; disbuf0=14; return (temp);/*向缓冲器中写入要显示的数据*/void HEXTOBCD(uchar chn) uint temp; temp = (int)(AD1674_Read()*addo*10000);/转换为可显示的实际温度值 disbuf1 = temp/10000; disbuf2 = (temp%10000/1000)|0x80;/带小数点的位显示 disbuf3 = temp%1000/100; disbuf4 = temp%100/10; disbuf5 = temp%10; disbuf6 = 15;/空显示 disbuf7 = chn;/显示通道号/*主函数*/void main()MAX7221_Initial();while(1) HEXTOBCD(1);/采集第一通道的数据 display();/显示采集到的数据 delay_ms(10);