📄 ad.c
字号:
#include "reg51.h"
#include"intrins.h"
sbit data595=P0^2; /*74hc595的数据输入脚*/
sbit clk595=P0^0; /*74hc595的时钟输入脚*/
sbit str595=P0^1; /*74hc595的时钟状态脚*/
sbit Q0=P0^4; /*数码管片选脚Q0*/
sbit Q1=P0^5; /*数码管片选脚Q1*/
sbit Q2=P0^6; /*数码管片选脚Q2*/
sbit Q3=P0^7; /*数码管片选脚Q3*/
sbit cs=P2^0; /*ADC0832片选脚*/
sbit clk=P2^1; /*ADC0832时钟输入脚*/
sbit data_o=P2^2; /*ADC0832数据输入脚*/
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_() /*定义空操作指令*/
#define XMS 5500 /*定时中断间隔11.0592MHz*/
uchar disppoint,tx_dat;
uint buf[]={0,0,0,0};
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*显示段表0~9*/
void senddata(uchar date_) /*发送数据*/
{
uchar m,i;
str595=0;
for(i=0;i<8;i++)
{
clk595=0;
m=date_;
m&=0x80; /*保留M的最高位*/
data595=(bit)m; /*在每个clk周期,同时送出1bit串行数据*/
date_<<=1; /*将date_向左移动一位*/
clk595=1; /*0-->1,clk为上升沿*/
}
str595=1; /*数据送完,锁存到输出端进行显示*/
str595=0;
}
void timer0(void) interrupt 1 using 0 /*定时器显示中断程序*/
{
EA=0; /*关中断*/
TH0=-(XMS/256); /*定时器赋值*/
TL0=-(XMS%256);
disppoint&=3; /*显示位赋值*/
if(disppoint==2){tx_dat=seg[buf[disppoint]];tx_dat&=~0x80;senddata(tx_dat);}/*第三个数码显示小数点*/
else senddata(seg[buf[disppoint]]);
switch(disppoint) /*显示片选处理*/
{
case 2:Q3=0;Q2=1;Q1=1;Q0=1;break;
case 3:Q2=0;Q3=1;Q1=1;Q0=1;break;
case 0:Q1=0;Q3=1;Q2=1;Q0=1;break;
case 1:Q0=0;Q3=1;Q2=1;Q1=1;break;
}
disppoint++;
EA=1; /*开中断*/
}
/***********************************************************/
void BCD(uchar ad_)
{
uint temp;
uchar i;
temp=(uint)(((unsigned long)((unsigned long)ad_*500))/256); /*将AD结果转换成BCD码*/
for(i=0;i<3;i++)
{
buf[i]=temp%10;
temp=temp/10;
}
}
/**************************************************************/
uchar read_adc(void) /*读取AD值*/
{
uchar i,ch=0;
cs=0;
clk=1;
nop;
nop;
clk=0;
nop;
nop;
for(;data_o==1;) /*等待AD转换结束*/
{
clk=1;
nop;
nop;
clk=0;
nop;
nop;
}
for(i=0; i<8; i++)
{
clk=1;
nop;
nop;
clk=0;
nop;
nop;
ch=(ch<<1)|data_o; /*读取串行数据*/
}
cs=1;
return(ch);
}
/***********************************************************************/
void main(void)
{
uint ad=0;
uchar j,tmp;
uchar ad_temp[10]={0};
P0=0xff; /*P0初始化*/
TMOD=0x01; /*定时器工作方式*/
TH0=-(XMS/256); /*定时器赋值*/
TL0=-(XMS%256);
TR0=1; /*允许T0工作*/
ET0=1; /*允许T0中断*/
EA=1; /*允许全局中断*/
while(1)
{
while(tmp!=read_adc())
{
tmp=read_adc();
for(j=0;j<10;j++)ad_temp[j]=read_adc(); /*读取10次AD值*/
for(j=0;j<10;j++)ad=ad+ad_temp[j]; /*AD值累加*/
tmp=(uchar)(ad/10); /*计算平均值*/
BCD(tmp); /*BCD转换*/
ad=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -