📄 ad10.c
字号:
#include <pic.h>
__CONFIG (XT&PROTECT&PWRTEN&BOREN&WDTEN);
#define N 5
#define uchar unsigned char
#define uint unsigned int
static volatile bit SDO_595 @ (unsigned)&PORTC*8+5; //串行数据输入
static volatile bit SCK_595 @ (unsigned)&PORTC*8+3; //移位时钟脉冲
static volatile bit LACK_595 @ (unsigned)&PORTB*8+5; //输出锁存器控制脉冲
uchar table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x84,0x8e,0xaa};
const uint C_table[]={
33,34,36,37,39,41,42,44,46,48,
50,52,54,56,59,61,63,66,68,71,
74,77,79,82,85,88,92,95,98,102,
105,109,113,117,120,124,129,133,137,141,
146,150,155,160,164,169,174,179,184,190,
192,200,206,211,217,223,228,234,240,246,
252,258,264,271,277,283,290,296,303,309,
316,323,329,336,343,349,356,363,370,377,
384,391,398,404,411,415,425,432,439,446,
453,460,467,474,480,487,494,501,507,514};
union adres
{
uint y1;
uchar adre[2];
}adresult;
//定义一个共用体,用于存放A/D转换的结果
uchar temp0=0;
uint filter_result;
void IO_initial(); //I/O初始化子程序
void adinitial(); //A/D转化初始化子程序
void WR_595(uchar Xs_result ); //写数据到74HC595函数
void Out_595(void); //更新74HC595输出数据函数
void delay(uint z);
void delay1(uint z);
uint get_ad();
uint filter(); //软件滤波采用中值滤波法
//主程序
main()
{
// ucahr i;
uchar i1,second=0,minute=0;
uchar Ge_sh;
uchar Sh_sh;
adinitial(); //A/D转换初始化
IO_initial(); //系统各I/O口初始化
// ei(); //总中断允许
while(1)
{
asm("clrwdt");
temp0=0;
filter_result=filter();
// filter_result=94;
for(i1=0;i1<100;i1++)
{
if(filter_result<=33)
{
temp0=0;
break;
}
else
{
if(filter_result>=C_table[i1+1])
temp0++;
else
break;
}
}
WR_595(table[15]);
WR_595(table[15]);
Ge_sh=temp0%10;
Sh_sh=temp0/10;
WR_595(table[Ge_sh]);
WR_595(table[Sh_sh]);
second++;
if(second==60)
{
second=0;
minute++;
}
delay1(490);
Ge_sh=second%10;
Sh_sh=second/10;
WR_595(table[Ge_sh]);
WR_595(table[Sh_sh]);
if(minute==60)
minute=0;
Ge_sh=minute%10;
Sh_sh=minute/10;
WR_595(table[Ge_sh]);
WR_595(table[Sh_sh]);
Out_595();
}
}
//I/O初始化子程序
void IO_initial()
{
TRISC=0X00; //C口为输出
TRISB5=0;
}
//A/D转化初始化子程序
void adinitial()
{
ADCON0=0x69; //选择A/D通道为AN5(RE0),打开A/D转换器
//在工作状态,且使A/D转换时钟为8tosc
ADCON1=0X80; //转换结果右移,及ADRESH寄存器的高6位为"0"
//且把RA5口设置为模拟量输入方式
// PIE1=0X00;
// ADIE=1; //A/D转换中断允许
// PEIE=1; //外围中断允许
TRISE0=1; //设置RA5为输入方式
}
/*中断服务程序
void interrupt adint(void)
{
ADIF=0; //清除中断标志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共
//用体的形式放入了变量y1中
ADGO=1; //启动下一次A/D转换
} */
//写数据到74HC595函数
void WR_595(uchar Xs_result )
{
uchar count1;
for(count1=0;count1<=7;count1++)
{
if((Xs_result&0x80)==0x80) //最高位为1,则向SDo_595发送1
SDO_595=1; //发出数据的最高位
else
SDO_595=0;
Xs_result<<=1; //右移位
SCK_595=0;
asm("nop");
asm("nop");
SCK_595=1; //产生上生
}
}
//更新74HC595输出数据函数
void Out_595(void)
{
LACK_595=0;
asm("nop");
asm("nop");
LACK_595=1; //上升沿锁存数据
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);
}
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint get_ad()
{
// delay(1); //采样时间延时
ADGO=1; //启动A/D转换
while(ADGO==1);
if(ADGO==0)
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共
return adresult.y1; //用体的形式放入了变量y1中
}
//软件滤波采用中值滤波法
uint filter()
{
uint value_buf[N];
uint count,i,j,temp;
for (count=0;count<N;count++)
{
delay(1);
value_buf[count] = get_ad();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -