单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
数据采集器的设计
任务1 数据采集器的实现过程
试验要求:
1、 实验前,务必预习实验内容,深入了解相关知识,了解A/D转换器的基本概念,先分析相关程序画出相关电路图,然后模拟电路运转,最终得到实验结果; 2、 实验中,认真思考所做的每一步,弄懂其中的道理,填写好实
验过程; 3、
实验后,总结经验教训,写出实验体会和收获,为今后学习奠
定良好的基础。
实验目的:
1,了解A/D转换器的基本概念,认识ADC0808/0809的内部结构和其引脚
功能。
2,熟悉其与单片机的典型链接,数据采集器的设计过程 3,硬件电路和程序设计思想 4,在proteus完成相关模拟实验。 实验内容:
一、 在Proteus环境下,用ADC0808设计一个数据采集器,通过串行口
与上为相连机,如果 串行口收到了上位机的采集命令(0X41),就将8路模拟量转换为数字量,通过串行口以ASCII码的形式发送给上位机。
二、硬件电路,为调试方便,ADC0808的时钟信号CLKY由Proteus的虚拟
信号源提供,时钟信号设置为600KHZ;8路模拟量中INO接VCC,IN7接地,其他6路通过电位器分压获得。
三、数据采集器程序清单如下; #include <reg51.h>
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
#include <absacc.h>
#define uint unsigned int #define uchar unsigned char
uchar idata adbuf[8]; uint addr; uchar n;
//存放A/D转换结果
//指向IN0~IN7通道地址 //通道计数
void init_serial(void)
{ SCON=0x50; //0101,0000 8位数据位,无奇偶校验 TMOD=0x20;
//定时器T1工作于方式2
PCON=PCON&0x7f; //SMOD=0 TH1=-3; TL1=-3; TR1=1; }
void send(uchar dat) { SBUF=dat; while(TI==0); TI=0; }
void int0(void) interrupt 0 {
adbuf[n]=XBYTE[addr]; //读取并保存当前转换结果 addr++; n++; if(n<8)
XBYTE[addr]=0; else
//启动对下一通道的转换
//指向下一通道的地址
//计数器加1
//启动定时器T1
//装入时间常数,波特率为9600
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
EX0=0; }
void getadc(void) {n=0;
addr=0x7ff8; XBYTE[addr]=0; EX0=1;
//指向IN0通道的地址 //启动对当前通道的转换
//允许外部中断0中断
while(n<8); //等待8路模拟量转换完成 }
void main() {uchar i; init_serial(); IT0=1; EA=1; while(1)
{ while(RI==0); RI=0;
//等待接收完一个字符 //清除接收标志
//初始化串行口
//外部中断0下降沿触发 //开中断
i=SBUF; //读取收到的字符 if(i==0x41) { getadc();
//依次完成对8个通道模拟量的转换
for(i=0;i<8;i++)
{ send(adbuf[i]/100+0x30); adbuf[i]=adbuf[i]%100; send(adbuf[i]/10+0x30); send(adbuf[i]%10+0x30); send(0x20);
send(0x20);
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
} send(0x0d); send(0x0a); } } }
四、模拟电路图:
五、调试方法与步骤,在KEIL下建立项目,输入源程序,编译后调试方式
全速运行,在虚拟终端的窗口输入大写字“A”,此时8路模拟量转换结果会在一行中显示出来,以此为IN0,IN1, .INO和IN7为显示值为255和000,其他为由电位器RV1中心抽头位置确定,调节RV1,然后在虚拟终端的窗口中输入大写字母“A”,IN0~IN7随之变化,
实验过程中存在的问题及解决方法:
本次试验中,对于模拟量转换为数字量的方式不明确,在模拟试验中程
序的调整,数据采集等难以做到准确,通过查阅相关资料和老师的指导,最终使问题得以解决。
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
实验体会和收获:
通过本次试验,让我们了解了模拟量与数字量之间的转换关系,从总
学习了两种转换芯片和相关的C语言驱动程序,为今后的学习工作打下良好的基础。
任务2 数字电压表设计
试验要求:
1、 实验前,务必预习实验内容,深入了解相关知识,认识SPI总线,认识8位串行A/D转换器TLC549,先分析相关程序画出相关电路图,然后模拟电路运转,最终得到实验结果; 2、 实验中,认真思考所做的每一步,弄懂其中的道理,填写好实
验过程; 3、
实验后,总结经验教训,写出实验体会和收获,为今后学习奠
定良好的基础。
实验目的:
一、 二、 三、 四、 五、
实验内容:
1.利用TCL549 转换器设计一个简易数字电压表,用4位LED显示器将
被测电压显示出来,测量范围为0.000~5.000V*(电路连接:将试验仪器的JP2短接,ACS,ACLK,ADO分别与P10~P12相连);
2.硬件电路,将TLC549的CS,CLK,DO接到单片机的三条I/O口线,
了解SPI总线及总线结构系统的典型结构; 了解串行A/D转换器内部结构和引脚; 掌握TLC549的时序;
完成在proteus完成相关模拟实验。 数字电压表的设计;
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
REF+,REF一真接到Vcc,GND,模拟输入AIN接电位器的中心抽头,调节 电位器即可改变被测输电压入值。
3. 程序设计; #include <reg51.h> #define uchar unsigned char #define ulong unsigned long uchar code segtab[]=
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xff}; uchar dbuf[4]={0,0,0,0}; sbit AD_CS=P1^0; sbit AD_CLK=P1^1; sbit AD_DAT=P1^2; bdata uchar adin; sbit adin0=adin^0; void delay(void) { uchar i;
for(i=0;i<20;i++); }
uchar getad(void) // A/D转换程序 { uchar i;
AD_CS=0; //令CS为低选中TLC549 delay(); //延时
for(i=0;i<8;i++) //循环读取8位A/D转换结果 { AD_CLK=1; //令CLK引脚为低 adin=adin<<1;//先读取高位,后读低位 adin0=AD_DAT;//读取数据线的一位数据 AD_CLK=0; //令CLK恢复为高
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
}
return adin; }
void disp(void) { uchar i,n,bsel;
bsel=0xfe; //首先点亮最低位 for(n=0;n<4;n++)
{ P2=bsel; //位选口
P0=segtab[dbuf[n]];//将显示缓存的数据转换为字段码显示 if(n==3) P0=P0&0x7f; //点亮最高位的小数点 bsel=(bsel<<1)+1; //准备显示下一位 for(i=1;i<200;i++);//延时
P0=0xff; //熄灭所有字段 } }
void main() { ulong u; uchar i; while(1)
{ u=(ulong)getad ()*5000/255; //将转换结果换成电压值 for(i=0;i<3;i++) { dbuf[i]=u%10; u=u/10; } dbuf[3]=u; disp(); }
}
//显示电压值
//转换为4位BCD码送显示缓存
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
4.试验模拟电路图:
5,调试方法:在KEIL下建立项目,输入源程序,编译后进入调试全速运行,数码管
将以“X.XXX’”显示当前测量到的电压值,调节电位器,数码管上的电压值随即变化。
实验过程中存在的问题及解决方法:
在本次试验中protues模拟试验数字显示很难实现电压值的正常显
示,显示的内容为全部8.8.8.8非正常显示,但经过程序的调使得收集的数据信息得以显示。
实验体会和收获:
通过本次试验,了解有关芯片的功能更多的信息的数据采集和转换。 通过检测调试程序,使得原来快速显示的内容能够调整期显示时间,
最终显示的完成。
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
任务3 信号发生器的设计
试验要求:
1、 实验前,务必预习实验内容,深入了解相关知识,了解D/A转换器的基本概念,认识串行D/A转换器TLC5615,先分析相关程序画出相关电路图,然后模拟电路运转,最终得到实验结果; 2、 实验中,认真思考所做的每一步,弄懂其中的道理,填写好实
验过程; 3、
实验后,总结经验教训,写出实验体会和收获,为今后学习奠
定良好的基础。
实验目的:
1,了解D/A转换器的基本概念,认识串行D/Az转换器TLC5615及的内部
结构和其引脚功能。
2,熟悉其与单片机的典型链接,数据采集器的设计过程和时序 3,硬件电路和程序设计思想 4,在proteus完成相关模拟实验。 实验内容:
在Proteus环境下,用TLC5615设计一个锯齿波发生器,频率随意。 将TLC5615的SCLK,CS,DOUT分别与单片机p10,p11,p12,相连,基准电压接+5v。
、 为了显示锯齿波,可定义一个用于计数的字符变量N,其值由0开始加1后就将其输出,由TLC5615转换为相应的电压值,当N 为255时,再加1又变回0,这样就实现了一个周期的转换, 程序清单如下:
#include<reg51.h>
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
#include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit SCLK=P1^0; //时钟输入 sbit CS=P1^1;
//片选信号
sbit DIN=P1^2; //串行数据输入
void datout(uint dat) //向TLC5615输出16位数据 { uchar i; CS=1;
//初始化片选信号为高
SCLK=0; //初始化时钟为低 CS=0;
//选中TLC5615
for(i=0;i<16;i++)
{ dat=dat<<1; //将最高位移入进位位CY DIN=CY; //将数据送到DIN引脚 SCLK=1; //SCLK产生上升沿 SCLK=0; //SCLK恢复为低 }
CS=1; //片选信号恢复为高。 }
void main(void) { uchar i=0; while(1) { i=i++; datout(i<<2); } }
#include<reg51.h>
#include<intrins.h>
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
#define uchar unsigned char #define uint unsigned int sbit SCLK=P1^0; sbit CS=P1^1; sbit DIN=P1^2;
uchar code wavetab[60]={ //正弦波波表 0x80,0x8D,0x9A,0xA7,0xB4,0xBF,0xCB,0xD5, 0xDF,0xE7,0xEE,0xF4,0xF9,0xFD,0xFF,0xFF, 0xFF,0xFD,0xF9,0xF4,0xEE,0xE7,0xDF,0xD5, 0xCB,0xC0,0xB4,0xA7,0x9A,0x8D,0x80,0x72, 0x65,0x58,0x4C,0x40,0x34,0x2A,0x21,0x18, 0x11,0x0B,0x06,0x02,0x00,0x00,0x00,0x02, 0x06,0x0A,0x10,0x18,0x20,0x2A,0x34,0x3F, 0x4B,0x58,0x65,0x72};
void datout(uint dat) //向TLC5615输出16位数据 { uchar i; CS=1;
//初始化片选信号为高
SCLK=0; //初始化时钟为低 CS=0;
//选中TLC5615
for(i=0;i<16;i++)
{ dat=dat<<1; //将最高位移入进位位CY DIN=CY; //将数据送到DIN引脚 SCLK=1; //SCLK产生上升沿 SCLK=0; //SCLK恢复为低 }
CS=1; //片选信号恢复为高。 }
void main(void)
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
{ uint i=0; while(1)
for(i=0;i<60;i++) //从波表读取数字量输出 datout(wavetab[i]<<2); }
四.模拟电路图
五,设计思想;可以将一个周期分为n个点,求出与每个点输出的电压值D,并以表
格的形式储存在数组wavetab中,这样程序只要从波表中依次读取数据量d,输出到TLC5615,
实验过程中存在的问题及解决方法:
试验中遇到正玄波波表不知其如何产生,如何显示,经过查询
相关内容介绍得知其使用VB编程产生。
实验体会和收获:
许多时候发生的一些事情让我们明白一个道理,我们需要自
己尽可能的使自己的知识全面,学到的东西总一天他会用到,所以我 常常说自己是杂食主义者。
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
任务4 频率与周期的检测
试验要求:
1、
实验前,务必预习实验内容,深入了解相关知识,先分析相关程序画出相关电路图,然后模拟电路运转,最终得到实验结果;
2、 实验中,认真思考所做的每一步,弄懂其中的道理,填写好实验过程; 3、
实验后,总结经验教训,写出实验体会和收获,为今后学习奠定良好的基础。
实验目的:
一、 利用51,液晶显示器和74LS74完成周期测量; 二、 首先进行频率的测量; 三、 完成周期的测量;
四、 完成在proteus完成相关模拟实验。 五、 数字电压表的设计
实验内容:
一、
进行频率测量,将频率脉冲直接送到单片机的计数输入端,由
定时器计数器T0负责计时,定时器计数器T1负责对被测信号计数,一旦T0定时时间到,立刻终止T1的计数,此时T1的计数值便是单位时间内的脉冲个数。 二、
在Proteus环境下,设计的频率计电路,将定时器T0设置在定
时方式2,定时时间为250us,满4000次中断正好一秒,定时器T1的工作方式1,其初值为0.在启动定时器T0开始计时后,随即送到T1引脚的被测脉冲进行计数,当T0定时满1S时,立即停止T1的计数,关闭定时器T0,T1的计数值即为被测信号的频率。 三、
频率测量的程序和电路图:
#include <reg52.h>
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
#include <intrins.h> #define uchar unsigned char #define uint unsigned int extern void init_lcd(void);
extern void disp_str(uchar x,uchar y,uchar *p);
sbit FS=P3^5; //被测信号FS输入端 bit RDY=0;
//测量完成标志
uint msn; //定时中断计数
uint count(void) //测量fS的频率 { RDY=0;
TMOD=0X5a; //T0:定时方式2,T1:计数方式1; TH0=TL0=-250; //T0定时时间为250uS msn=4000; //4000次中断正好1S TH1=TL1=0X00;
//T1工作于计数方式,初值为0
ET0=1; //允许T0中断 EA=1; //开中断 while(FS==1); //等待被测信号变低 while(FS==0); //等待被测信号变高 TR0=1; //T0开始定时 TR1=1;
//T1开始计数
while(RDY==0); //等待1秒钟 TR1=0; TR0=0;
return(TH1*256+TL1); //返回计数值 }
//关闭T1、T0
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
void timer0(void) interrupt 1 using 1 { msn--;
if(msn==0)
//如果1S已到
RDY=1; //设置测量完成标志位 }
void main() { uint f;
uchar str[9]="f= Hz";
uchar i; init_lcd();
while(1) { f=count();
_nop_(); for(i=6;i>2;i--)
码
{ str[i]=f%10+0x30; f=f/10; } str[2]=f+0x30; for(i=2;i<6;i++)
{ if(str[i]!='0') break; str[i]=' '; }
disp_str(0,3,str);
} }
//液晶屏初始化
//测量频率
//测量结果转换为5位ASC
//用空格码替换高位的0
//显示测量结果
单片机的实训之后的总结(不要都搞成一样,老师发现就不好了)
四、
周期的测量和电路图
#include <reg51.h>
#define uchar unsigned char #define uint unsigned int extern void init_lcd(void);
extern void disp_str(uchar x,uchar y,uchar *p); sbit CLR=P1^0; uint Ts;
//触发器清0控制位
//存放测量结果
//测量就绪标志
bit RDY=0;
void control(void) { TMOD=0x09; T0定时启停
IT0=1; //下降沿触发INT0 EX0=1; TH0=0;
//允行外部中断0中断 //定时器器初值为0
//定时器T0工作于方式1,由TR0及INTO 控制