单片机NTC热敏电阻仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
数据采集用的双通道的ADC0832模数转换芯片
单片机源程序如下:
- /******************************
- 20221221 prepare by zousongzhu
- ******************************/
- #include<reg52.h> // 包含51单片机寄存器定义的头文件;
- #include <intrins.h>
- #include <math.h>
- sbit P34=P3^4;
- sbit P35=P3^5;
- sbit P36=P3^6;
- sbit P37=P3^7;
- sbit CS = P1^0;//ADC0832 PIN1
- sbit Clk = P1^1;//ADC0832 PIN7
- sbit DATI = P1^2;//ADC0832 PIN5
- sbit DATO = P1^2;//ADC0832 PIN6
- unsigned int Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管显示0~9的段码表
- //unsigned int Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管显示0~9的段码表
- /*******************************共阴LED段码表*******************************/
- unsigned char code temptab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- /*******************************定义全局变量********************************/
- unsigned char dat = 0x00; //AD值
- unsigned char CH; //通道变量
- unsigned int sum=0;
- unsigned char sec_time,sec; //记录中断次数
- unsigned char second,min,hour,year,month,day; //储存秒
- //数组下标就是对应温度
- code unsigned char Temp_adc[]={
- 224,222,221,219,218,216,214,213,211,209,207,205,203,201,199,197,195,193,191,188,
- 186,184,181,179,177,174,172,169,167,164,162,159,157,154,151,149,146,144,141,138,
- 136,133,131,128,126,123,121,118,116,113,111,108,106,104,101, 99, 97, 95, 92, 90,
- 88, 86, 84, 82, 80, 78, 76, 74, 73, 71, 69, 67, 66, 64, 62, 61, 59, 58, 56, 55,
- 53, 52, 51, 49, 48, 47, 46, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32,};
- //查找相近值,并返回下标
- unsigned char Find_data(unsigned char *a,unsigned char x,unsigned char len)
- {
- unsigned char i,min,r=0;
-
- min=abs(*a-x);
- for(i=0;i<len;i++)
- {
- if(abs(a[i]-x)<min)
- {
- min=abs(a[i]-x);
- r=i;
- }
- }
-
- return r;
- }
- /****************************************************************************
- 函数功能:AD转换子程序
- 入口参数:CH
- 出口参数:dat
- ****************************************************************************/
- unsigned char adc0832(unsigned char CH)
- {
- unsigned char i,test,adval;
- unsigned char m;
- adval = 0x00;
- test = 0x00;
- Clk = 0; //初始化
- DATI = 1;
- _nop_();
- CS = 0;
- _nop_();
- Clk = 1;
- _nop_();
- if ( CH == 0 ) //通道选择
- {
- Clk = 0;
- DATI = 1; //通道0的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 0; //通道0的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- else
- {
- Clk = 0;
- DATI = 1; //通道1的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 1; //通道1的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- Clk = 0;
- DATI = 1;
- for( i = 0;i < 8;i++ ) //读取前8位的值
- {
- _nop_();
- adval <<= 1;
- Clk = 1;
- _nop_();
- Clk = 0;
- if (DATO)
- adval |= 0x01;
- else
- adval |= 0x00;
- }
- for (i = 0; i < 8; i++) //读取后8位的值
- {
- test >>= 1;
- if (DATO)
- test |= 0x80;
- else
- test |= 0x00;
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- }
- if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
- dat = test;
- nop_();
- CS = 1; //释放ADC0832
- DATO = 1;
- Clk = 1;
-
- return dat;
-
- }
- /***********************************************************************
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码与Proteus仿真下载:
51单片机 ADC0832 NTC 测温 双通道.7z
(64.39 KB, 下载次数: 127)
|