📄 mian.c
字号:
#include"AT89S8252.h"
#define TRUE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
#define LCDCOM_R XBYTE[0x7f01] /*液晶口地址定义*/
#define LCDCOM_W XBYTE[0x7f00]
#define LCDDATA_R XBYTE[0x7f03]
#define LCDDATA_W XBYTE[0x7f02]
sbit BF=ACC^7; /*液晶忙标志位*/
/*输入/输出引脚定义*/
sbit LED =P1^6;
sbit MODEM =P1^7;
sbit DIN7705=P3^4; /*数据输入输出为同一端口*/
sbit DOUT7705=P3^4;
sbit CLK7705=P3^5;
sbit AD7705_DRDY=P1^5;
/*全局变量定义*/
uchar ADH_1;
uchar ADL_1;
uchar ADH_2;
uchar ADL_2;
uchar k_stat;
uchar mod_buff_head;
uchar mod_buff_tail;
uchar mod_buff[16];
uchar bdata flag;
sbit ch_flag=flag^0;
sbit tx_f=flag^1;
sbit state=flag^3;
/*发送命令,命令为ASC码形式,待发送命令串数据存放在str缓冲区中*/
void mod_comd(uchar *str)
{
uchar i,k;
do
{
if(*str!=0x00) /*字符串结束符*/
{
SBUF=*str;
state=FALSE;
while(state==FALSE);
str++;
}
else break; /*字符串发送完成结束循环*/
}while(1);
SBUF=0x0d; /*发送回车符,命令必须以回车符结尾*/
state=FALSE;
for(i=0;i<250;i++)
for(k=0;k<16;k++);
}
/*发送数据函数,发送的数据存在缓冲区p中,字符数为n*/
void mod_data(uchar *p,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
SBUF=*p;
state=FALSE;
while(state==FALSE);
p++;
}
state=FALSE;
}
/*检测四个开关输入量,检测后的状态存入变量k_stat中,以供显示和发送*/
void test_kio(void)
{
P1=P1|0x0f;
k_stat=P1;
k_stat&=0x0f;
}
/*主函数*/
void main (void)
{
uchar i,j,k;
MODEM=1; /*关MODEM电源开关*/
for(i=0;i<20;i++)
for(j=0;j<150;j++) /*总共延迟时间20*150*150=450000*0.2=90ms*/
for(k=0;k<150;k++);
MODEM=0;
WMCON|=PS0_; /*看门狗周期2048ms*/
WMCON|=PS1_;
WMCON|=PS2_;
WMCON|=WDTEN_; /*使能片内看门狗*/
ES=0; /*关串口中断以免干扰初始化*/
WMCON|=WDTRST_; /*喂狗*/
tx_f=0; /*清中断标志位,未发生中断*/
init();
for(i=0;i<50;i++)
{
for(j=0;j<150;j++)
for(k=0;k<150;k++);
WMCON|=WDTRST_; /*喂狗*/
}
init_lcd();
test_kio(); /*A/D转换结果默认为零*/
ADH_1=0;
ADL_1=0;
ADH_2=0;
ADL_2=0;
ES=1;
modem_init(); /*MODEM初始化*/
for(i=0;i<50;i++)
for(j=0;j<250;j++);
tx_f=0; /*清通信标志(接收中断标志位)*/
/*缓冲区尾指针必须清零,以便从头存放接收的数据*/
mod_buff_tail=0;
for(i=0;i<16;i++)
mod_buff[i]=0;
while(!tx_f) /*接收中断发生,表示有振铃信号*/
{
WMCON|=WDTRST_; /*喂狗*/
ch_flag=0;
AD7705_init(ch_flag); /*通道0初始化*/
readfromda7705(ch_flag);/*读取通道结果*/
delay();
ch_flag=1;
AD7705_init(ch_flag); /*通道1初始化*/
readfromda7705(ch_flag);/*读取通道结果*/
test_kio(); /*刷新显示*/
LED=!LED; /*工作灯闪亮*/
}
tx();
while(1);
}
/*串行中断函数*/
void SCON_int (void ) interrupt 4 using 2
{
if(RI==1) /*如果可以接收*/
{
RI=0; /*清除接收标志*/
tx_f=1; /*可以开始通信*/
mod_buff[mod_buff_tail]=SBUF;
mod_buff_tail=(mod_buff_tail+1)%0x10; /*为什么%0x10???*/
}
if(TI==1)
{
TI=0;
state=TRUE; /*发送完成则志位完成标志*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -