📄 haoshi.c
字号:
// 接受05 启动定时器0 定时2.5ms A/D转换一次并上传
#include <absacc.h>
#include <intrins.h>
#include <reg52.h>
#include <ctype.h> //包含头文件
# define uchar unsigned char //宏定义
sbit AD_EOC=P1^2;
sbit AD_CLK=P1^3;
sbit AD_DIN=P1^4;
sbit AD_DOUT=P1^5;
sbit AD_CS=P1^6;
sbit AD_EN=P2^1;
sbit WDI=P2^4;
sbit AD_HBEN=P2^5;
sbit LED=P0^0; //位定义
uchar data recedata ,flag=0x00;
uchar data AD_RESULTH,AD_RESULTL;
uchar data ending[2]; //定义数组和变量
uchar data AD_CONTROL;
void initial(void);
void ad_convert(void);
void delay(void); //函数声明
main() // 主程序
{
uchar data i,j;
initial();
WDI=!WDI;
ad_convert();
delay();
ad_convert();
delay();
ad_convert();
for (j=0;j<5;j++) //灯闪5次
{
for (i=0;i<150;i++)
{
delay();
}
LED=0;
for (i=0;i<150;i++)
{
delay();
}
LED=1;
}
LED=1;
do {}while (!flag) ; // 等待上位机发指令
TR0=1;
for(;;)
{
TH0=-(int)(2500*11.0592/12)/256;
TL0=(int)(-2500*11.0592/12)%256;
do {} while (!TF0) ; //定时器0查询方式
ad_convert();
ending[0]=AD_RESULTH;
ending[1]=AD_RESULTL;
//ending[0]=0x80;
// ending[1]=0x7F;
REN=0;
ES=0;
for(i=0;i<2;i++)
{
SBUF=ending[i];
while (TI==0)
{}
TI=0;
}
ES=1;
REN=1;
TF0=0;
}
}
serial() interrupt 4 using 3 //串行口中断服务子程序
{
if(RI==1)
{
recedata=SBUF;
if(recedata==0x05) //接收数据为0x05
{
RI=0;
flag=1;
}
if (recedata==0x04)
{
RI=0;
TR0=0;
}
}
}
//A/D转换子程序 对照时序 当前I/O周期移出的是上一次A/D结果 同时把当前转换控制字移入
void ad_convert(void) //A/D为12位 先输出高8位(同时输入控制字) 再输出低4位
{
uchar k; //此处必须定义
EA=0; //执行A/D转换子程序时CPU屏蔽所有中断
AD_EN=0;
AD_CS=0; //下降沿 片选信号使能 出来A/D转换结果最高位 I/O周期开始
WDI=!WDI;
_nop_();
_nop_();
_nop_();
_nop_();
AD_CONTROL=0x00; //AD_CONTR AD控制寄存器 赋值
AD_RESULTH=0x00; //变量清零
AD_RESULTL=0x00;
AD_CLK=0; //A/D时钟变低电平
//AD_CS=0;
for(k=0;k<8;k++) //由高到低移出A/D结果高8位 同时移入下次A/D转换控制字
{
if(AD_DOUT==1) AD_RESULTH=AD_RESULTH|0x01; //判断移出的一位是0还是1
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=AD_CONTROL<<1;
_nop_();
AD_CLK=1; //时钟上升沿 移入控制字的一位
_nop_();
_nop_();
AD_CLK=0; //下降沿 A/D结果的下一位出来
_nop_();
WDI=!WDI;
}
for(k=0;k<4;k++) //从高到低输出低4位
{ 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_();
_nop_();
AD_CLK=0; //下降沿
_nop_();
_nop_();
_nop_(); //I/O周期结束 转换周期开始
WDI=!WDI;
}
wait: _nop_();
if(AD_EOC==0) goto wait; //等待转换周期结束
AD_CS=1; //片选置高电平 不使能
EA=1; //CPU开中断
//label=label+1;
//AD_RESULT=(((unsigned int)(AD_RESULTH<<4)+((AD_RESULTL>>4)&0x0f)))&0x0fff;
//COUNT[label]=AD_RESULT;
}
void delay(void) //延时子程序
{
uchar a;
for (a=0;a<100;a++)
{
WDI=!WDI;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WDI=!WDI;
_nop_();
_nop_();
}
}
void initial(void) //初始化子程序
{
TMOD=0x21; // T/C0 方式1 定时 T/C1 方式2 定时(为波特率服务)
TH1=0xfd; //定时器1初值
TL1=0xfd;
PCON=0x00; //可不写 复位后内部特殊功能寄存器都清零
SCON=0xd0; //串行口工作方式1 至此波特率设成了9600(晶振选好后 四个要素影响波特率)
REN=1; //串行口允许接受
TH0=-(int)(2500*11.0592/12)/256;
TL0=(int)(-2500*11.0592/12)%256; //定时器0初值 定时2.5ms
EA=1; //CPU开中断
ES=1; //允许串行口中断
// IP=0x10;
TR1=1; //启动定时器1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -