📄 actual.c
字号:
// 探头转一周期间 INT0中断一次 判断个数上传数据并定起始位 INT1各个位置分别中断一次进行A/D转换 共24次
#include <absacc.h> //头文件
#include <intrins.h>
#include <reg52.h>
#include <ctype.h>
#define uchar unsigned char //宏定义
uchar data i=0,j=0,counter=0,flag=0;
uchar data AD_RESULTH=0x00,AD_RESULTL=0x00 ,AD_CONTROL=0x00; //定义变量
uchar data a[48]; //定义数组
sbit DIRECTION=P1^7; //正反转控制位
sbit AD_CS=P1^6; //A/D转换器片选
sbit AD_DOUT=P1^5; //A/D转换器三态输出端
sbit AD_DIN=P1^4; //A/D转换器控制字输入端
sbit AD_CLK=P1^3; //A/D转换器时钟
sbit AD_EOC=P1^2; //A/D转换器转换结束标志
sbit LED=P0^0; //程序运行指示灯 接上拉电阻
sbit WDI=P2^4;
void initial(void); //函数(子程序)声明
void delay(void);
void ad_convert(void);
void transmit(void);
main() //主函数
{
initial(); // 调用初始化子程序
ad_convert();
delay();
ad_convert(); //调用两次A/D转换子程序 为了舍去开始时不准确的A/D转换结果
for(i=0;i<5;i++) // 指示灯闪五次
{
for(j=0;j<100;j++)
{
delay();
}
LED=0;
for(j=0;j<100;j++)
{
delay();
}
LED=1;
}
if(DIRECTION==0) //反转
{
flag=0;
i=24;
}
else //正转
{
flag=1;
i=0;
}
for(;;) //主循环
{
}
}
void int0() interrupt 0 using 0 //外部中断INT0
{
if(counter==24) //够24次A/D转换 上传数据
transmit();
counter=0; //变量清零 重新计数
if(flag==0) //反转
i=24;
else
i=0;
for(i=0;i<48;i++) //数组清零
{
a[i]=0;
}
}
void int1() interrupt 2 using 2 // 外部中断INT1
{
ad_convert(); //调用A/D转换子程序
if(flag==0) //反转
{
a[2*i-2]=AD_RESULTH; //数组存放结果
a[2*i-1]=AD_RESULTL;
i=i-1; //下一个位置
}
else //正转
{
a[2*i]=AD_RESULTH; //数组存放结果
a[2*i+1]=AD_RESULTL;
i=i+1; //下一个位置
}
counter=counter+1; //A/D转换次数
}
void initial(void) //初始化子程序
{
TMOD=0x20; //晶振11.0592CLK 波特率设为9600kbps 定时器1 方式2
TH1=0xfd; //定时器初值
TL1=0xfd;
PCON=0x00; //波特率加倍位SMOD=0
SCON=0x40; //串口方式1 10位UART
EA=1; //CPU开中断
EX0=1; //外部中断0开中断
EX1=1; //外部中断1开中断
IT0=1; //外部中断0触发方式选择位 下降沿触发
IT1=1; //外部中断1触发方式选择位 下降沿触发
TR1=1; //启动定时器1
WDI=!WDI; //喂狗
}
void delay(void) //延时子程序
{
uchar a;
for (a=0;a<100;a++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WDI=!WDI;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WDI=!WDI;
}
}
void ad_convert(void) //A/D转换子程序 对照时序
{
uchar k;
WDI=!WDI;
EA=0; //CPU关中断
AD_RESULTH=0x00; //变量清零
AD_RESULTL=0x00;
AD_CONTROL=0x00; //控制字赋值
AD_CS=0; //片选下降沿 出来最高位 A/D转换周期开始
for(k=0;k<8;k++) //由高到底移出A/D转换结果高八位并移入控制字
{
if(AD_DOUT==1)
AD_RESULTH=AD_RESULTH|0x01;
else
AD_RESULTH=AD_RESULTH&0xfe;
if(k<7)
AD_RESULTH=AD_RESULTH<<1;
if(AD_CONTROL&0x80==0x80)
AD_DIN=1;
else
AD_DIN=0;
AD_CONTROL<<1;
_nop_();
AD_CLK=1; //脉冲上升沿 移入控制字的一位
_nop_();
_nop_();
_nop_();
AD_CLK=0; //脉冲下降沿 A/D转换结果下一位出来
_nop_();
WDI=!WDI;
}
for(k=0;k<4;k++) //移出A/D转换结果后四位
{
if(AD_DOUT==1)
AD_RESULTL=AD_RESULTL|0x08;
else
AD_RESULTL=AD_RESULTL&0xf7;
AD_RESULTL=AD_RESULTL<<1;
_nop_();
AD_CLK=1; //脉冲上升沿
_nop_();
_nop_();
_nop_();
AD_CLK=0; //脉冲下降沿
_nop_(); //进入转换周期
WDI=!WDI;
}
while (AD_EOC==0) //等待转换周期结束
{
}
AD_CS=1; //片选变高电平
EA=1; //CPU开中断
}
void transmit(void) //发送子程序
{
for(i=0;i<48;i++) //按1-24个位置顺序发送每周24个数据 48个字节
{
SBUF=a[i];
while(TI==0) //等待一次发送结束
{
}
TI=0; //中断请求标志位清零
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -