📄 adc.c
字号:
#include <reg52.h>
#ifndef __STC12C5410AD_H__
#define __STC12C5410AD_H__
#include <STC12C5410AD.h>
bdata unsigned char flag;
sbit led_fleg =flag^0; //3秒切换显示标志
sbit J1 =P2^2;
sbit J2 =P2^3;
sbit KEY_1 =P3^4;
sbit KEY_2 =P3^5;
sbit SPEAKER =P2^4;
sbit LED_A =P1^5;
sbit LED_B =P1^6;
sbit LED_C =P2^0;
sbit LED_D =P1^1;
sbit LED_E =P1^2;
sbit LED_F =P1^4;
sbit LED_G =P1^7;
sbit LED_H =P1^3;
sbit LED_S0 =P2^6; //流水灯
sbit LED_S2 =P2^7; //左2,十位
sbit LED_S1 =P3^7; //左3,个位
sbit LED_S3 =P2^1; //左1,百位
sbit LED_S4 =P2^5; //左4,符号位
sbit INT_0 =P3^2;
sbit INT_1 =P3^3;
void warter();
char warter_led;
char l_bai;
char l_shi;
char l_ge;
char t_bai;
char t_shi;
char t_ge;
unsigned int disptimer;
char gPulseCount;
char scan;
char TimeSub;
unsigned int TimeAdd;
unsigned char temperaturn; //温度单元
unsigned char buff =0;
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x38,0xb9, //38=L,b9=度
0x39,0x5e,0x79,0x71
};
/*
unsigned char code T_table[]={
//0 1 2 3 4 5 6 7 8 9
367,362,358,353,348,344,339,335,330,326,
322,317,313,309,305,300,296,292,288,283,
279,275,271,267,262,258,254,250,246,241,
237,233,229,225,221,216,212,208,204,200,
196,192,188,184,180,176,173,169,166,163,
159,156,153,150,147,144,141,139,136,133,
130,127,125,122,119,117,114,112,109,107,
104,102,100, 98, 96, 94, 92, 90, 88, 86,
84, 82, 80, 79, 77, 75, 73, 71, 70, 68,
66, 64, 63, 61, 59, 58, 56, 54, 53, 51, //99
50,//100
0 //短路
}
*/
void Initialization()
{
// AUXR =0x10; //f=fosc/12
TMOD =0x21; //定时器0设为方式1定时器1设为方式2自动重装
TH1=TL1 =0xE8; //11.0592MHz时1200波特率
TH0 =(65536-1000)/256;
TL0 =(65536-1000)%256; //定时器0定时1ms
TR1 =1; //启动定时器1
TR0 =1; //启动定时器0
ET0 =1; //开定时器0中断
EA =1; //开总中断
// IE =0x07; //外部中断
// IP =0x05;
IT1 =1; //external interrupt falling edge take effect
IT0 =1; //下沿触发
ADC_CONTR =0xE0; //ADC intialization,只加上了ADC的电源,P1.0为AD口
}
/*************显示数送端口**************/
void send_port()
{
LED_A =!(buff>>0 & 0x01); //send data to IO port
LED_B =!(buff>>1 & 0x01);
LED_C =!(buff>>2 & 0x01);
LED_D =!(buff>>3 & 0x01);
LED_E =!(buff>>4 & 0x01);
LED_F =!(buff>>5 & 0x01);
LED_G =!(buff>>6 & 0x01);
LED_H =!(buff>>7 & 0x01);}
/*********************流水灯********************************/
void warter()
{
switch (warter_led)
{
case 0:
LED_F = 1; //流水灯高低次序
LED_C = 0;
LED_E = 0;
LED_D = 0;
LED_B = 1;
LED_A = 0;
LED_H = 0;
LED_G = 0;
break;
case 1:
LED_F = 0; //流水灯高低次序
LED_C = 0;
LED_E = 0;
LED_D = 1;
LED_B = 0;
LED_A = 0;
LED_H = 0;
LED_G = 1;
break;
case 2:
LED_F = 0; //流水灯高低次序
LED_C = 0;
LED_E = 1;
LED_D = 0;
LED_B = 0;
LED_A = 0;
LED_H = 1;
LED_G = 0;
break;
case 3:
LED_F = 0; //流水灯高低次序
LED_C = 1;
LED_E = 0;
LED_D = 0;
LED_B = 0;
LED_A = 1;
LED_H = 0;
LED_G = 0;
}
}
//*********************三秒显示切换************************************
void Disp()
{
char bai =0;
char shi =0;
char ge =0;
char fuha;
buff = 0;
if(disptimer>3000) //disptimer放在定时中断中递减
{
disptimer=0; //3秒显示切换定时值
led_fleg=led_fleg^1; //每执行一次,标志改变一次
}
else if(led_fleg==1)
{
bai = l_bai; //流量百位
shi = l_shi; //流量十位
ge = l_ge; //流量个位
fuha= 10;
}
else
{ //百位不显示,段码送全1
bai = t_bai;
shi = t_shi; //温度十位
ge = t_ge; //温度个位
fuha= 11;
}
//*********显示位选择**********
LED_S0 =1; //disable all bits
LED_S1 =1; //关显示
LED_S2 =1;
LED_S3 =1;
LED_S4 =1;
switch (scan) //
{
case 0: //s4显示设置脉冲计数
warter(); //led dynamic scan
LED_S0 =0;
break;
case 1:
buff=table[ge]; //
send_port(); //显示段送端口
LED_S1 =0;
break;
case 2:
if(bai||shi>0)
{
buff=table[shi]; //
send_port(); //显示段送端口
// LED_H = 1; //小数点显示
LED_S2 =0;
}
else
LED_S2 =1;
break;
case 3:
if(bai>0)
{
buff=table[bai]; //
send_port(); //显示段送端口
LED_S3 =0;
}
else
LED_S3 =1;
break;
case 4:
buff=table[fuha]; //改A字码为L(x038),B为C符号
send_port(); //显示段送端口
LED_S4 =0;
break;
}
scan++;
if(scan==5) scan=0;
}
/*************定时器1中断服务*********/
void Timer0Srv() interrupt 1 //定时器1ms定时中断
{
TH0 =(65536-1000)/256;
TL0 =(65536-1000)%256; //定时器0初装值定时1ms
TimeAdd++; //最大计数值:65535ms
TimeSub--; //最大计数值:256ms
disptimer++; //显示计时
// warter();
Disp(); //定时器中断时扫描显示一次
}
void AD_DATA() //InterruptSrv()interrupt 5 using 0
{
// int adc=0;
/* ADC_CONTR &=CLEAR_ADC_INTR; //zhouhua
ad =ADC_DATA;
ad <<=2;
ad |=(ADC_LOW2)&0x03;
gTemperature=LookupTemperatureTable(ad);
WORD readadc(void) //shenkaiyou
{ WORD adc_result;
adc_result=0;
ADC_DATA=0;
ADC_LOW2=0x00; //need further test
ADC_CONTR|=ADC_START;
while(!(ADC_CONTR&ADC_FLAG)) ;
ADC_CONTR&=~ADC_FLAG;//ADC_START;
adc_result|=ADC_DATA<<2;
//adc_result|=ADC_DATA;
//adc_result =adc_result<<2;
adc_result|=ADC_LOW2;
//adc_result&=0x3ff;//0615
return(adc_result);
}
查表值I等于温度值
for(i=0;i<102;i++) //108
*/
int adc;
char i;
if(ADC_CONTR&&0x10>0) //查询AD转换标志是否建立
{
adc =ADC_DATA;
adc <<=2;
adc |=(ADC_LOW2)&0x03; //&运算是只保留后2位,前六位置0,10位AD值
for(i=0;i<102;i++)
{
if(T_table[i]<adc) //AD值查表得到温度值
{
temperaturn=i;
break;
}
}
t_bai =adc/100;
t_shi =adc%100/10; //温度十位
t_ge =adc%10;
ADC_CONTR=0x88; //加ADC电源,清ADC-FLAG,重新开始AD转换
}
}
void main()
{
Initialization();
while(1)
{
J1 = 1;
J2 = 0;
l_bai = 1;
l_shi = 7;
l_ge = 4;
if(TimeAdd==500) //流水灯流动触发,0.5秒滚动一次
{
warter_led++;
TimeAdd=0;
}
if(warter_led==4) (warter_led=0);
AD_DATA();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -