完整的单片机AD采样程序.docx
- 文档编号:1974468
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:9
- 大小:38.79KB
完整的单片机AD采样程序.docx
《完整的单片机AD采样程序.docx》由会员分享,可在线阅读,更多相关《完整的单片机AD采样程序.docx(9页珍藏版)》请在冰豆网上搜索。
完整的单片机AD采样程序
完整的单片机AD采样程序
#include
#include
#include
/*-----------------------------------------------------*/
#defineuintunsignedint
#defineucharunsignedchar
#defineADCOMXBYTE[0x4000]/*AD574启动地址*/
#defineADHIXBYTE[0x4002]/*AD574高8位地址*/
#defineADLOXBYTE[0x4003]/*AD574低4位地址*/
ucharcodeslave_addr[4]={00,01,02,255};/*从机地址*/
/*-----------------------------------------------------*/
voidini_ad(void);/*初始化硬件函数*/
voidaverage_send(void);/*求均值与发送函数*/
voidcheck_addr(void);/*地址核对*/
/*-----------------------------------------------------*/
uint*data_ad_ori_pt;/*数据保存指针*/
uintdata_ad_ori[16];
/*-----------------------------------------------------*/
ucharbdatasample_s,test_s0,test_s1;/*test_s0,test_s1可以不用,是测试位*/
sbitsample_permit=sample_s^0;
sbitaverage_permit=sample_s^1;
sbitaddress_true=sample_s^2;
sbitempty_pin=sample_s^3;
sbitcmd_in_permit=sample_s^4;/*允许主机命令输入标志位*/
sbittest_bit1=sample_s^5;
/*P1.0、P1.1、P1.2在硬件上已经作AD输入线选择口*/
sbitP1_3=P1^3;/*作串口输出信号的使能口,P1_0=0时接通串口,输出信号*/
sbitP3_4=P3^4;/*测试位,可选*/
sbitWD=P1^7;/*看门狗*/
uchardataj,k,data_avr_no;
ucharkey_in,done_no;/*done_no为用到*/
uintsample_no,AD_finished_no;/*其实可以用uchar格式,记录采样次数和AD完成次数*/
main()
{
P1=0xf9;/*采样通道设置为1通道*/
WD=1;/*看门狗先为1,电平翻转为喂狗*/
test_s0=0;
test_s1=0;
data_ad_ori_pt=data_ad_ori;/*指针指向数组*/
sample_s=0;/*有点定义重复的意思?
*/
}
data_ad_ori[0]=0x00;/*这一步有些重复*/
j=0;
ini_ad();
do{
if(address_true==1)
{
address_true=0;
check_addr();
}
while(sample_permit==1)
{
if(average_permit==1){
average_send();
if(AD_finished_no==sample_no)
{
AD_finished_no=0;
sample_permit=0;
/*完成数据传送后,才恢复为恢复为多机模式,SM2=1*/
SM2=1;
}
data_ad_ori_pt=data_ad_ori;
average_permit=0;
}
else{
if(average_permit!
=1)
{//这里有问题?
ADCOM=0;
}
}
}
WD=!
WD;/*MAX813喂狗*/
}
while
(1);
}
voidinterserial(void)interrupt4using2/*串口0中断服务子程序*/
{
key_in=0;
if(RI)
{
key_in=SBUF;
RI=0;
if(SM2==1)
{/*SM2=1,必须有RB8=1串口才中断*/
/*SM2=1,为多机模式,接收主机地址*/
/*接收到的字节为地址*/
/*接收的地址与本机地址比较,判断是否一致*/
if(key_in==slave_addr[0])
{
/*确认地址完毕,设置SM2=0,进入单机模式*/
SM2=0;
address_true=1;
}
}
if((SM2==0)&&(RB8==0))
{/*SM2=0,RB8=1或RB8=0串口都中断*/
/*SM2=0,为单机模式,接收主机数据*/
/*接收到的字节为数据*/
/*接收主机指令完毕,必须在从机完成任务后,才恢复为多机模式,设置SM2=1*/
if(key_in==0xff)
{
SM2=1;
}
/*接收主机命令,使从机设置为多机模式*/
if(key_in==0xfe)
{/*接收主机命令,使从机开始采样*/
cmd_in_permit=1;
}
if((cmd_in_permit==1)&&(key_in==0xde))
{
/*接收主机命令,使从机开始采样*/
cmd_in_permit=0;
sample_permit=1;
}
}
}
WD=!
WD;/*MAX813喂狗*/
}
voidinterint0(void)interrupt0using1/*外部中断0服务子程序*/
{
uintad_hl,k0;
ad_hl=((uint)(ADHI<<4)+(ADLO>>4));
*data_ad_ori_pt=(ad_hl&0x0fff);
data_ad_ori_pt++;
for(k0=0;k0<=100;k0++)
{_nop_();}/*定义采样时间间隔?
?
微秒*/
data_avr_no++;
if(data_avr_no==11)
{
data_avr_no=0;
average_permit=1;
}
WD=!
WD;/*MAX813喂狗*/
}
voidaverage_send(void)
{
ucharj1,average_no,i;
uintad_hl,ad_h,ad_l,avg,sum;
uint*pt3;
average_no=10;/*需要平均的AD采样数据个数*/
sum=0;
for(j1=1;j1<=10;j1++)
{/*求和程序*/
ad_hl=*pt3;
sum=sum+ad_hl;
pt3++;
}/*求和程序*/
avg=sum/average_no;
ad_h=(uchar)(avg>>8);
ad_l=(uchar)(avg&0x00ff);
test_s0=ad_h;
test_s1=ad_l;
pt3=data_ad_ori;
P1_3=0;
for(i=0;i<=20;i++){_nop_();}
SBUF=ad_h;
do{}while(TI==0);TI=0;
SBUF=ad_l;
do{}while(TI==0);TI=0;
P1_3=1;
for(i=0;i<=20;i++){_nop_();}
AD_finished_no++;
WD=!
WD;/*MAX813喂狗*/
}
voidcheck_addr(void)
{
uchari=0;
P1_3=0;
for(i=0;i<=20;i++){_nop_();}
SBUF=slave_addr[0];/*发送地址核对成功,发送从机地址给主机*/
do{}while(TI==0);TI=0;
P1_3=1;
for(i=0;i<=20;i++){_nop_();}
WD=!
WD;/*MAX813喂狗*/
}
voidini_ad(void)
{
TMOD=0x21;/*T0设定为方式1,16位;T1设定为方式2,8位,常数自动装入*/
TH1=0xfd;/*TH1用于设置波特率,9.6kB/s*/
TL1=0xfd;/*TL1用于设置波特率,9.6kB/s*/
PCON=0x00;/*波特率不加倍*/
SCON=0xd0;/*SCON工作方式3,允许发送*/
SM2=1;/*多机通信,发送第9位1*/
/*初始化时,需设置从机的SM2=l,根据运行要求在程序子函数中设置SM2=0*/
IP=0x10;/*优先级别,串口为高优先级*/
EA=1;
EX0=1;/*允许INT0中断*/
ES=1;/*允许串口中断*/
IT0=1;/*INT0为边沿触发*/
TR1=1;/*TCON启动定时器1*/
WD=!
WD;/*MAX813喂狗*/
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 单片机 AD 采样 程序