Keil及C语言常用程序.doc_第1页
Keil及C语言常用程序.doc_第2页
Keil及C语言常用程序.doc_第3页
Keil及C语言常用程序.doc_第4页
Keil及C语言常用程序.doc_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在个人的单片机开发板c语言程序及模块设计总结目录Keil 软件的使用2*LED 显示输出*8一. 闪烁灯9二.广告灯的左移右移10三. 按键识别14四.数码管动态显示15五.44 矩阵式键盘识别17六按键中断识别19七.定时器 T0 的应用-9.9 秒计时设计21八.利用定时器产生乐曲23九数摸转换 ADC0804 的应用26十摸数转换 DAC0832的应用32十一24CO8 的读写操作35十二PC 机与单片机通信(RS232 协议)39十三.DS18B20 测量温度系统41十四.128X64 液晶显示器的基本应用45十五.标准键盘 PS2与单片机通信47十六,128X64无字库液晶4X4键盘输入使用(密码锁)51十七、串口下载线57*LED 显示输出*很明显,要点亮使发光二极管,必须使单片机的I/O口P1.0输出低电平。于是我们的任务就是编程序使P1.0输出地电平。#include /*LED 显示输出 具体口输出*/sbit P1_0=P10; /*定义p1.0为p1_0 */sbit P1_1=P21; /*定义p2.1为p1_1 */sbit P1_2=P32;/*定义p3.2为p1_2 */sbit P1_3=P03;/*定义p0.3为p1_3 */main()P1_0=0;/*输出高电平 即:灯亮 */P1_1=0;P1_2=0;P1_3=0;#include /* LED 显示输出 整体输出*/main()P1=0;/*输出高电平 */P2=0;P3=0;P0=0;AT89S52单片机从简单到复杂程序演示。一. 闪烁灯实验任务在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。硬件电路与上面点亮小灯的连接完全相同。#include /*闪烁灯*/del() /*延时0.2秒*/unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);sbit P1_0=P10;main()while(1)/*永远为真,一直执行下去*/P1_0=0;del();P1_0=1;del();#include reg52.h /#define uchar unsigned char /#define uint unsigned int sbit P10=P10; void mDelay(unsigned int Delay) unsigned int i; for(;Delay0;Delay-) for(i=0;i124;i+) ; void main() for(;) P10=!P10; /取反 P1.0 mDelay(1000); /延时1秒。如果是2000那么是2秒 二.广告灯的左移右移实验任务做广告灯的左移右移,八个发光二极管分别接在单片机的P3.0P3.7接口上,输出“0”时,发光二极管亮,开始时P3.0P3.1P3.2P3.3P3.7P3.6P3.0亮,重复循环。(当然,四个输出口可以同时实现广告灯)硬件电路#include /*广告灯的左移右移*/unsigned char i;unsigned char temp;unsigned char a,b;delay()/延时程序unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);main()while(1)temp=0xfe;P3=P2=P0=P1=temp;/直接对1/0口p3赋值,使批p3.0输出低电平。delay();/延时for(i=1;i8;i+)/实现广告灯的从右到左移动a=temp(8-i);P3=P2=P0=P1=a|b;delay();for(i=1;ii;b=temp0;Delay-) for(i=0;i124;i+) ; void main() unsigned char OutData=0xfe; for(;) P1=OutData; OutData=_crol_(OutData,1); / 循环左移 mDelay(1000); / 1000延时1s #include /*广告灯的缩短*/unsigned char i;unsigned char temp;unsigned char a,b;delay()/延时程序unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);main()while(1)temp=0xfe;P1=temp;/直接对1/0口p3赋值,使批p3.0输出低电平。delay();/延时for(i=1;i8;i+)/实现广告灯的从右到左移动a=temp(8-i);P1=b;/P1=a|b;delay();for(i=1;ii;b=temp(8-i);P1=b;/P1=a|b;delay();三. 按键识别实验任务通过按下一次按键,使广告灯向左移动一位,直到最后一位,在向右移动。硬件电路(大家注意到这一个电路图与上一个实验的电路图只多了一个按键和一个5.1K的电阻。)实验原理从图中可以看出P2.1在按键没有按下时接的是高电平,按键按下时接的就是低电平了。所以我们只要判断P2.1的电平就可以知道按键是否被按下了。而在按键按下的过程中,由于抖动,将产生干扰,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。C语言源程序#include sbit BY1=P21; /定义按键的输入端unsigned char count; /按键计数,每按一下,count 加1unsigned char temp;unsigned char a,b;void delay10ms(void) /延时程序unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);key() /按键判断程序if(BY1=0) /判断是否按下键盘delay10ms(); /延时,软件去干扰if(BY1=0) /确认按键按下count+; /按键计数加1if(count=8) /计8次重新计数 count=0; /将count 清零while(BY1=0);/按键锁定,每按一次count 只加1.move( ) a=temp(8-count);P3=a|b;main()count=0;temp=0xfe;P3=0xff;P3=temp;while(1)key();move();四.数码管动态显示实验任务P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,动态显示“1234”字样;硬件电路注意:a接P0.0;b接P0.1;c接P0.3注意:4H接P2.4;3H接P2.5;2H接P2.6;1H接P2.7实验原理 七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED 数码管的 a-dp 七个发光二极管因以不同亮暗的组合就能形成不同的字形,这种组合称之为字形码。下面给出共阴极的字形码:TKVZ,0 1 2 3 4 5 6 7 8 9 a b c d e f 0 0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e 1 2 3 4 5 6 7 8 9 a b c d e f C语言源程序#include code unsigned char seg7code10= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /显示段码 数码管字跟:/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x40,/ 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 /0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e/ 1 2 3 4 5 6 7 8 9 a b c d e fDelay(unsigned int tc) /延时程序while( tc != 0 ) /如果tc 为0 则终止延时unsigned int i; /局部正整数变量 ifor(i=0; i100; i+); /执行100 次将耗时1毫秒tc-; /tc计数减一void Led(int date) /显示函数P2=P2&0x7f; /P2.7 输出低电平,选通千位数P0=seg7codedate/1000; /取出千位数,查表,输出。Delay(8); /延时P2=P2|0xf0; /销隐P2=P2&0xbf; /P2.6 输出低电平,选通百位数P0=seg7codedate%1000/100; /取出百位数,查表,输出。Delay(8); /延时P2=P2|0xf0; /销隐P2=P2&0xdf; /P2.5 输出低电平,选通十位数P0=seg7codedate%100/10; /取出十位数,查表,输出。Delay(8); /延时P2=P2|0xf0; /销隐P2=P2&0xef;P0=seg7codedate%10; /取出个位数,查表,输出。Delay(8);P2=P2|0xf0;main()int display_date=1234; /定义并赋值要显示的数据while(1)Led(display_date);/调用显示函数显示数据display_date五.44 矩阵式键盘识别实验任务用AT89S51的并行口P3接44矩阵键盘,以P3.0P3.3作输入线,以P3.4P3.7作输出线;在每一个数码管上显示每个按键的“0F”序号。硬件电路 实验原理每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。C语言源程序#include unsigned char code seg7code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e ;unsigned char k;void delay10ms(void) /延时程序unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);void Getch ( ) unsigned char X,Y,Z;P3=0xff;P3=0x0f; /先对P3 置数 行扫描if(P3!=0x0f) /判断是否有键按下delay10ms(); /延时,软件去干扰if(P3!=0x0f) /确认按键按下X = P3;X=P3; /保存行扫描时有键按下时状态P3=0xf0; /列扫描Y=P3; /保存列扫描时有键按下时状态Z=X|Y; /取出键值switch ( Z ) /判断键值(那一个键按下)case 0xee: k=0; break; /对键值赋值case 0xde: k=1; break;case 0xbe: k=2; break;case 0x7e: k=3; break;case 0xed: k=4; break;case 0xdd: k=5; break;case 0xbd: k=6; break;case 0x7d: k=7; break;case 0xeb: k=8; break;case 0xdb: k=9; break;case 0xbb: k=10;break;case 0x7b: k=11;break;case 0xe7: k=12;break;case 0xd7: k=13;break;case 0xb7: k=14;break;case 0x77: k=15;break; /请注意写程序时的格式规范,此处是为了节省纸张void main(void)while(1) P3=0xff;Getch();P0=seg7codek; /查表LED输出P2=0x0f; /输出相同的四位数据。六按键中断识别实验任务采用中断技术,每按一下按键,计数器加1,并用LED显示出来。硬件电路注意:我们只用4位数码管中的两位。注意:a接P0.0;b接P0.1;c接P0.3注意: 2H接P2.0; 1H接P2.1; 中断按键已经接好。C语言源程序#includeunsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char dispcount=0; /计数sbit gewei=P20; /个位选通定义sbit shiwei=P21; /十位选通定义void Delay(unsigned int tc) /延时程序 while( tc != 0 )unsigned int i;for(i=0; i=10) /显示两位数shiwei=0;P0=tabledispcount/10;Delay(8);shiwei=1;gewei=0;P0=tabledispcount%10;Delay(5);gewei=1;else /显示一位数shiwei=1; gewei=0;P0=tabledispcount;Delay(8);void main() TCON=0x01; /中断设置IE=0x81;while(1) /循环执行LED(); /只须调用显示函数七.定时器 T0 的应用-9.9 秒计时设计实验任务开始时,显示“00”,第 1 次按下 BY1 后就开始计时。第 2 次按 BY1 后,计时停止。 第3次按BY1后,计时归零。硬件电路C语言源程序#include /必须用这个子函数库unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char sec; /定义计数值,每过1/10 秒,sec 加一unsigned char keycnt=0;unsigned int tcnt; /键值判断sbit gewei=P20; /个位选通定义sbit shiwei=P21; /十位选通定义void Delay(unsigned int tc) /延时程序while( tc != 0 ) unsigned int i;for(i=0; i0;i-) /延时去干扰for(j=248;j0;j-);if(P3_0=0)keycnt+;switch(keycnt) /按下次数判断case 1: /第一次按下TH0=0x06; /对TH0 TL0 赋值,并使定时器/计数器工作在方式2与定时状态TL0=0x06;TR0=1; /开始定时break;case 2: /第二次按下TR0=0; /定时结束break;case 3: /第三次按下keycnt=0; /重新开始判断键值sec=0; /计数重新从零开始break;while(P3_0=0); /请注意写程序时的格式规范,此处是为了节省纸张void t0(void) interrupt 1 using 0 /定时中断服务函数tcnt+; /每过250ust tcnt 加一if(tcnt=400) /计满400 次(1/10 秒)时tcnt=0; /重新再计sec+;if(sec=100) /定时10 秒,在从零开始计时sec=0;void main(void)TMOD=0x02; /定时器工作在方式2ET0=1;/定时器/计数器中断允许EA=1;/总中断允许sec=0;while(1)KEY();LED();八.利用定时器产生乐曲实验任务利用单片机的I/O口演奏乐曲。硬件电路图实验原理 乐曲是按照一定的高低,长短和强弱关系组成的关系,在一首乐曲中,每一个音符与频率有关。所以我们只要把有关频率的占空比数据做成表格,在通过查表,在I/O口输出相关乐曲的方波,便产生了乐曲。C语言源程序#include reg52.h/这样用双引号也可以。unsigned char Count;sbit _Speak =P00 ; /讯响器控制脚unsigned char code SONG = /祝你平安0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,/路边的野华不要采0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,;void Time0_Init() TMOD = 0x01;IE = 0x82;TH0 = 0xD8;TL0 = 0xEF; /12MZ晶振,10msvoid Time0_Int() interrupt 1 TH0 = 0xD8;TL0 = 0xEF; Count+; /长度加1void Delay_xMs(unsigned int x) /1MS 延时子程序 unsigned int i,j;for( i =0;i x;i+ )for( j =0;j3;j+ );void Play_Song(unsigned char i) /:歌曲播放子程序i 为播放哪一段曲目 unsigned char Temp1,Temp2;unsigned int Addr;Count = 0; /中断计数器清0Addr = i * 217;while(1) Temp1 = SONGAddr+;if ( Temp1 = 0xFF ) /休止符TR0 = 0; Delay_xMs(100); else if ( Temp1 = 0x00 ) /歌曲结束符return;else Temp2 = SONGAddr+;TR0 = 1;while(1) _Speak = _Speak;Delay_xMs(Temp1);if ( Temp2 = Count )Count = 0;break; /请注意写程序时的格式规范,此处是为了节省空间void main() /主程序Time0_Init(); /定时器0 中断初始化while(1)Play_Song(0); /播放九模数转换 ADC0804 的应用实验任务从 ADC0804 的通道 IN+输入 05V 之间的模拟量,通过 ADC0804 转换成数字量在数码管上以十进制形成显示出来。硬件电路图注意:上图未显示全的是四个共阴极数码管。实验原理ADC0804 是 8 位全 MOS 中速 A/D 转换器、它是逐次逼近式 A/D 转换器,片内有三态数据输出锁存器,可以和单片机直接接口。单通道输入,转换时间大约为100us。ADC0804转换时序是:当CS0许可进行A/D转换。WR由低到高时,A/D开始转换,一次转换一共需要6673个时钟周期。CS与WR同时有效时启动A/D转换,转换结束产生 INTR 信号(低电平有效),可供查询或者中断信号。在 CS和RD的控制下可以读取数据结果。1、电路存在问题, 104电容太大,使模数转换时频率太小。2、小数点定义错误。C语言源程序#include code unsigned char seg7code10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /显示段码sbit int1=P33; /定义管脚功能sbit cs=P32;sbit wr=P36;sbit rd=P37;void Delay(unsigned int tc) /显示延时程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;unsigned char adc0804( void ) /读AD0804 子程序 unsigned char addata,i;rd=1;wr=1;int1=1; /读ADC0804 前准备P1=0xff; /P1全部置一准备cs=0;wr=0;wr=1; /启动ADC0804 开始测电压while(int1=1); /查询等待A/D转换完毕产生的INT(低电平有效)信号rd=0; /开始读转换后数据i=i; i=i; /无意义语句,用于延时等待ADC0804 读数完毕addata=P1;/读出的数据赋与addaterd=1;cs=1;/读数完毕return(addata);/ 返回最后读出的数据unsigned int datpro(void)/ADC0804 读出的数据处理 unsigned char x;unsigned int dianyah,dianyal; /用于存储读出数据的高字节和低字节unsigned int dianya=0; /存储最后处理完的结果 注意数据类型for(x=0;x4; /右移四位 取出高四位dianyal=dianya&0x0f; /屏蔽高四位 取出低四位dianya=dianyal*20+dianyah*320; /最后的结果是一个四位数,便于显示return(dianya);/返回最后处理结果void Led() unsigned int date;date=datpro(); /调用数据处理最后结果P2=P2&0xef;P0=seg7codedate/1000|0x80; /输出个位数和小数点Delay(8); P2=P2|0xf0; P2=P2&0xdf;P0=seg7codedate%1000/100; /输出小数点后第一位Delay(8); P2=P2|0xf0; P2=P2&0xbf;P0=seg7codedate%100/10; /输出小数点后第二位Delay(8); P2=P2|0xf0; P2=P2&0x7f;P0=seg7codedate%10; /输出小数点后第三位Delay(8); P2=P2|0xf0;main()while(1)Led( ); /只需调用显示函数1、0804的资料。 所谓A/D转换器就是模拟/数字转换器(Analog to Digital Converter 简称ADC)是将输入的模拟信号转换成为数字信号。 ADC0804的规格及引脚图 试验原理图: /CS:芯片选择信号。 VREF:辅助参考电压。 /WR:用来启动转换的控制当/WR自HI变为LO时,转换器被清除;当/WR回到HI时,转换正式启动; /RD:外部读取转换结果的控制脚输出信号。 DB0DB7:8位数字输出。 /INTR:中断请求信号输出,低电平动 AGND,DGND:模拟信号以及数字信号接地。 CLK IN,CLK R:时钟输入或接振荡元件(R,C),频率约限制在100KHz1460KHz(R,10K、C,(102146PF) VIN(+),VIN(-):差动模拟电压输入。输入单端正电压时,VIN(-)接地; VCC:电源供应以及作为电路的参考电压。 ADC0804电压输入与数字输出关系如表所示 十六进制 二进制码 与满刻度的比率 相对电应值VREF=2.560伏 高四位字节 低四位字节 高四位字节电压 低四位字节电压 F 1111 15/16 15/256 4.800 0.300 E 1110 14/16 14/256 4.480 0.280 D 1101 13/16 13/256 4.160 0.260 C 1100 12/16 12/256 3.840 0.240 B 1011 11/16 11/256 3.520 0.220 A 1010 10/16 10/256 3.200 0.200 9 1001 9/16 9/256 2.880 0.180 8 1000 8/16 8/256 2.560 0.160 7 0111 7/16 7/256 2.240 0.140 6 0110 6/16 6/256 1.920 0.120 5 0101 5/16 5/256 1.600 0.100 4 0100 4/16 4/256 1.280 0.080 3 0011 3/16 3/256 0.960 0.060 2 0010 2/16 2/256 0.640 0.040 1 0001 1/16 1/256 0.320 0.020 0 0000 0 0 2、ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。 (1)ADC0809的内部逻辑结构 由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。 (2) 引脚结构 IN0IN7:8条模拟量输入通道 ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 地址输入和控制线:4条 ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7数字量输出及控制线:11条 ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, VREF(),VREF()为参考电压输入。 2 ADC0809应用说明 (1) ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。 (2) 初始化时,使ST和OE信号全为低电平。 (3) 送要转换的哪一通道的地址到A,B,C端口上。 (4) 在ST端给出一个至少有100ns宽的正脉冲信号。 (5) 是否转换完毕,我们根据EOC信号来判断。 (6) 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。电路原理图:adc0809内部结构图:十数模转换 DAC0832的应用实验任务用两个按键通过单片机控制 DAC0832 的输出,使 OUT 端可以输出 05V 的幅值,频率为1KHZ的锯齿波和三角波两种波形。通上电源后;按下INT1则输出三角波,在按下INT0输出锯齿波。硬件电路图注意:D0对应P0.0;D1对应P0.1;D2对应P0.2按键可以直接使用INT0和INT1按键(程序中以扫描方式识别按键)。硬件电路图中的画框的部分,运放 LM324 的连接部分需要用户自己搭建,注意LM324使用的是正负12V的双电源供电。我们只使用LM324四个运放中的两个实验原理ADC0804是8位全MOS 中速D/A转换器,采用R2RT形电阻解码网络,转换结果为一对差动电流输出,转换时间大约为 1us。使用单电源+5V+15V 供电。参考电压为-10V+10V。在此我们直接选择+5V 作为参考电压。DAC0832 有三种工作方式:直通方式,单缓冲方式,双缓冲方式;在此我们选择直通的工作方式将XFER WR 1WR2 CS管脚全部接数字地。管脚8接参考电压,在此我们接的参考电压是+5V。那么经过第一级运放后,输出电压将是-5V0V,在经过第二级运放反相放大1倍以后将可以输出0V5V了。我们在控制P1口输出数据有规律的变化将可以产生三角波,锯齿波,梯型波等波形了。(注意+、-即自加自减的表达方式)C语言源程序#include unsigned char keycnt=0;unsigned char tcnt=0; /键值判断bit sjz=0; /产生三角波时用到的标志void delayl() /延时子程序 unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-); void KEY() /按键扫描程序if(P3_2=0)delayl(); /延时跳过按下时的抖动if(P3_2=0) keycnt=0; /定时器产生锯齿波标志TR0=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论