51C语言源代码

上传人:沈*** 文档编号:84830129 上传时间:2022-05-04 格式:DOC 页数:44 大小:434.50KB
返回 下载 相关 举报
51C语言源代码_第1页
第1页 / 共44页
51C语言源代码_第2页
第2页 / 共44页
51C语言源代码_第3页
第3页 / 共44页
点击查看更多>>
资源描述
51C 语言源代码闪烁灯实验要求点亮与单片机P1.0口相连的发光二极管,延时0.2S,然后熄灭,延时0. 2S,再点亮,如此循环下去。实验目的初步了解单片机10口输出高低电平的作用,延时函数的时间估算。硬件电路源代码#includei?eg31. h j | j j |j 4 | j j |j 4 | j j |j 4 | j j |j 4 | j j |j 4 | j j |j 4 | j j |j 4 j 上面这行是一个文件包含处理。所谓文件包含是指一个文件将另外一个文 件的内容全部包含进来这里的程序虽然只写了一行,但C编译器在处理的时候却要 处理儿十或儿百行, 这里包含reg51.h的目的在于本程序要使用Pl这个符号, 而P1是在regdl.h这个头文件中定义的。大家可以在编译器日录下面用记事本打开 这个文件看看。、 、 、 、 、 、 / *VBWVIW W waw VIW VIW VIW VBWVIW W waw VIW VIW VIW VBWVIW W waw VIW VIW VIW VBWVIW W waw VIW VIW VIW VBWVIW W waw VIW VIW VIW VBWVIW W waw VIW VIW VIW VBWVIW W waw VIW VIWvTwfr IPl_0二P0;定义10口这步的目的是让编译器知道Pl_0代表的就是单片机的P1. 0口void delay02s (void)/延时0.2秒子程序unsigned char i, j, k;/定义3个无符号字符型变量。for(i=20;i0;i)三个FOR循环用来延时,这里为for(j=20;j0;j)/什么是0. 2S大家可以用WAVEfor(k=248;k0;k-);高断点仿真一下,就可知道大概 是0.2S Tovoid main (void)/每一个C语言程序有且只有一个主函数,while(l)/循环条件永远为真,以下程序一直执行下去。Pl_0二0; / I/O口P1.0输出低电平,小灯被点亮。delay02s();/延时经过0. 2秒。Pl_0二1; / I/O口P1.0输出高电平,小灯熄灭。delay02s ():/延时经过0. 2秒。流水灯实验要求单片机P1口相连的8个发光二极管中的一个循环移位点亮,同时蜂鸣器发出 滴滴的响声。蜂鸣器用一PP三极管驱动,集电极(C极)通过蜂鸣器线圈接5V电源,基极(B极)是控制端,发射极(E极)接地,当三极管C, B极PN结正偏时,P?(结导通,即B极为低电平时,三极管导通,蜂鸣器响。再不明口去看模电书。实验的掌握循环移位的丄作原理,学会使用封装好的函数库,延时函数的时间估算。源代码/flow light and beepinclude itinclude /后面要用到它里面的_crol_(k, 1)函数/这个函数的意思是把一个字符变量k循环左移1位,关于它的说明/请查看 安装KEIL LI录下的E: ProgramFilesKeilC51HLP文件夹/里面的collib,这个文件里面有各种用C语言 封装好的函数库,我/们在以后使用其中某些函数时可以直接使用而自己不必再写。硬件电路DITJnm7;l Q2S 12竺丄反应unsigned char a, b, k, j;/定义四个字符变量sbit beep二P23; /定义蜂 鸣器的接口void delaylOms ()/延时字程序,大约延时10msfor(a=100;a0;a)for (b=225;b0;b);void main()k二Oxfe;/先给k一个初值11111110等待移位while (1)delaylOms ();beep二0;/打开蜂鸣器delaylOms () ;/让它响10msbeep=l;关闭蜂鸣器j=_crol_(k, 1) ;/把k循环左移一位k二j;把移完的值再送给kPl二j;/同时把值送到Pl口点亮发光二极管单键识别实验要求每按一次独立键盘的S2键,与P1口相连的一个发光二极管往下移动一位。注意:关于按键去抖动的解释,我们在手动按键的时候,山于机械抖动或是其 它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放, 按键两片金属膜接触的时间大约为50ms左右,如果我们再首次检测到键被按下后 延时10ms左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键 被按下,则可确认。以上为按键识别去抖动的原理。实验LI的独立按键的识别。源代码itinclude sbit BY1二P34;/定义按键的输入端S2键unsigned charcount;/按键i十数,每按一T, count力口1 unsigned char temp; unsigned char a,b; void delaylOms (void)/延时程序unsigned char i, j:for(i=20;i0;i)for(j=248;j0;j); key()/按键判断程序if(BYl=O)/判断是否按下键盘,当单片机上电时所有10口为高电平,S2键一端接地另一端接P3.4,所以当键被按下时P3. 4口直接接地,此时检测P3. 4肯定为低电平。delaylOmsO ;/延时,软件去干扰if(BYl=O)/确认按键按下count卄;/按键计数加1if (count=8)计8次重新计数count二0;/将count清零while(BY1-0);等待按键释放,如果键未释放则一直在此等待。move()广告灯向下移动移动函数a=tempcount;/这三句为一个循环移位,相当于前面提到的b=temp (8-count) ;/ _crol_()函数Plpb;main()count二0;/初始化参数设置temp=0 xfe;Pl二Oxff;Pl二temp;wh订e(l)永远循环,扫描判断按键是否按下key();/调用按键识别函数move() ;/调用广告灯移动函数利用定时器和蜂鸣器唱歌实验要求用单片机的P2. 3口输出不同占空比的方波来控制与它相连的蜂鸣器,当方波 的占空比不同时蜂鸣器发出的音调就不同,山此根据歌曲的音调编程实现让蜂鸣器唱歌。占空比:一个周期中,高电平的长度比上总周期的长度的值再乘上100%o标准方波的占空比为50%.实验目的学会利用单片机的定时器,掌握蜂鸣器的发声操作。硬件电路源代码itinclude reg51 h unsigned char Count; sbit _Speak=P2 3; /蜂鸣器 控制脚unsigned char code SONG =/祝你平安0 x26, 0 x20, 0 x20, 0 x20, 0 x20, 0 x20, 0 x26, 0 x10, 0 x20, 0 x10, 0 x20, 0 x80,0 x26, 0 x20, 0 x30, 0 x20, 0 x30, 0 x20, 0 x39, 0 x10, 0 x30, 0 x10, 0 x30, 0 x80,0 x26, 0 x20, 0 x20, 0 x20, 0 x20, 0 x20, Oxlc, 0 x20, 0 x20, 0 x80, 0 x2b, 0 x20,0 x26, 0 x20, 0 x20, 0 x20, 0 x2b, 0 x10, 0 x26, 0 x10, 0 x2b, 0 x80, 0 x26, 0 x20,0 x30, 0 x20, 0 x30, 0 x20, 0 x39, 0 x10, 0 x26, 0 x10, 0 x26, 0 x60, 0 x40, 0 x10,0 x39, 0 x10, 0 x26, 0 x20, 0 x30, 0 x20, 0 x30, 0 x20, 0 x39, 0 x10, 0 x26, 0 x10,0 x26, 0 x80, 0 x26, 0 x20, 0 x2b, 0 x10, 0 x2b, 0 x10, 0 x2b, 0 x20, 0 x30, 0 x10,0 x39, 0 x10, 0 x26, 0 x10, 0 x2b, 0 x10, 0 x2b, 0 x20, 0 x2b, 0 x40, 0 x40, 0 x20,0 x20, 0 x10, 0 x20, 0 x10, 0 x2b, 0 x10, 0 x26, 0 x30, 0 x30, 0 x80, 0 x18, 0 x20,0 x18, 0 x20, 0 x26, 0 x20, 0 x20, 0 x20, 0 x20, 0 x40, 0 x26, 0 x20, 0 x2b, 0 x20,0 x30, 0 x20, 0 x30, 0 x20, Oxlc, 0 x20, 0 x20, 0 x20, 0 x20, 0 x80, Oxlc, 0 x20,Oxlc, 0 x20, Oxlc, 0 x20, 0 x30, 0 x20, 0 x30, 0 x60, 0 x39, 0 x10, 0 x30,0 x10, 0 x20, 0 x20, 0 x2b, 0 x10, 0 x26, 0 x10, 0 x2b, 0 x10, 0 x26, 0 x10, 0 x26,0 x10, 0 x2b, 0 x10, 0 x2b, 0 x80, 0 x18, 0 x20, 0 x18, 0 x20, 0 x26, 0 x20, 0 x20,0 x20, 0 x20, 0 x60, 0 x26, 0 x10, 0 x2b, 0 x20, 0 x30, 0 x20, 0 x30, 0 x20, Oxlc,0 x20, 0 x20, 0 x20, 0 x20, 0 x80, 0 x26, 0 x20, 0 x30, 0 x10, 0 x30, 0 x10, 0 x30,0 x20, 0 x39, 0 x20, 0 x26, 0 x10, 0 x2b, 0 x10, 0 x2b, 0 x20, 0 x2b, 0 x40, 0 x40,0 x10, 0 x40, 0 x10, 0 x20, 0 x10,0 x20, 0 x10, 0 x2b, 0 x10, 0 x26, 0 x30, 0 x30, 0 x80, 0 x00,/路边的野华不要采0 x30, OxlC, 0 x10, 0 x20, 0 x40, OxlC, 0 x10, 0 x18, 0 x10, 0 x20, 0 x10, OxlC, 0 x10, 0 x18,0 x40, OxlC, 0 x20, 0 x20, 0 x20, OxlC, 0 x20, 0 x18, 0 x20, 0 x20,0 x80, OxFF, 0 x20, 0 x30,OxlC, 0 x10,0 x18, 0 x20, 0 x15,0 x20, OxlC,0 x20,0 x20, 0 x20, 0 x26, 0 x40,0 x20, 0 x20,0 x2B, 0 x20, 0 x26,0 x20, 0 x20,0 x20,0 x30, 0 x80, OxFF, 0 x20,0 x20, OxlC,0 x10, 0 x18, 0 x10,0 x20, 0 x20,0 x26,0 x20, 0 x2B, 0 x20, 0 x30,0 x20, 0 x2B, 0 x40, 0 x20, 0 x20, OxlC, 0 x10, 0 x18, 0 x10, 0 x20, 0 x20, 0 x26,0 x20, 0 x2B, 0 x20, 0 x30,0 x20, 0 x2B,0 x40, 0 x20, 0 x30,OxlC, 0 x10,0 x18,0 x20, 0 x15, 0 x20, OxlC,0 x20, 0 x20,0 x20, 0 x26, 0 x40,0 x20, 0 x20,0 x2B,0 x20, 0 x26, 0 x20, 0 x20,0 x20, 0 x30,0 x80, 0 x20, 0 x30,OxlC, 0 x10,0 x20,0 x10, OxlC, 0 x10, 0 x20,0 x20, 0 x26,0 x20, 0 x2B, 0 x20,0 x30, 0 x20,0 x2B,0 x40, 0 x20, 0 x15, OxlF,0 x05, 0 x20, 0 x10, OxlC, 0 x10, 0 x20, 0 x20, 0 x26, 0 x20, 0 x2B, 0 x20, 0 x30,0 x20, 0 x2B, 0 x40, 0 x20,0 x30, OxlC,0 x10, 0 x18, 0 x20,0 x15, 0 x20,OxlC,0 x20, 0 x20, 0 x20, 0 x26,0 x40, 0 x20,0 x20, 0 x2B, 0 x20,0 x26, 0 x20,0 x20,0 x20, 0 x30, 0 x30, 0 x20,0 x30, OxlC,0 x10, 0 x18, 0 x40,OxlC, 0 x20,0 x20,0 x20, 0 x26, 0 x40, 0 x13,0 x60, 0 x18,0 x20, 0 x15, 0 x40,0 x13, 0 x40,0 x18, 0 x80, 0 x00,;void TimeO_Init ()/定时器0初始化函数TMOD = 0 x01;工作模式选择IE = 0 x82;中断设置THO = 0 xD8;装初值TLO = OxEF; /12MZ晶振,10msvoid TimeO_Int () interrupt 1/定时器0中断子函数THO = 0 xD8;TLO = OxEF;Count+;/长度加1/*-功能:IMS延时子程序void Delay_xMs(unsigned int x) unsigned int i, j;for( i =0;i x;i卄)for( j =0;j3;j+ );/*-功能:歌曲播放子程序i为播放哪一段曲LIvoid Play_Song(unsigned char i) unsigned char Tempi, Temp2; unsigned int Addr;Count = 0;/中断计数器清0Addr二i * 217;while (1)Tempi = SONGAddr+;if ( Tempi = OxFF )/休止符TRO = 0;Delay_xMs(100);else if ( Tempi = 0 x00 )/歌曲结束符return;elseTemp2 = SONGAddr+;TRO = 1;while(1)_Speak = Speak;Delay_xMs (Tempi);if ( Temp2 = Count )Count二0;break;/*-功能:主程序- */ void main()TimeO_Init() ;/定时器0中断初始化while (1)Play_Song(0) ;/播放DS18B20温度测量显示实验实验要求用单片机控制实验板上的DS18B20数字温度传感器,读取当前环境温度,精度 达0.1度,温度范围0-99度,并用数码管的前三位显示出来。同时实验板上的单 片机还能把温度值通过串口线发送到计算机,在计算机上安装该H录下的.exe文 件后,打开应用程序可看到温度值。注意:DS18B20数字温度传感器是DALLAS公司生产的l,Wire,即单总线器 件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简 单,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点(1)、只 要求一个I/O口即可实现通信。(2)、在DS18B20中的每个器件上都有独一无二的 序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4)、测量温度范 围在,55到,125摄氏度之间。(5)、数字温度计的分辨率用户可以从9位到12位 选择。(6)、内部有温度上、下限告警设置。DS18B20详细引脚功能描述1、GND地信号;2、DQ数据输入出引脚。开漏单总 线接口引脚。当被用在寄生电源下,也可以向器件提供电源;3、VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。DS18B20的使用方法。由于DS18B20采用的是l,Wire总线协议方式,即在一根数据线实现数据的双向传输, 而对AT89S52单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来 完成对DS18B20芯片的访问。山于DS18B20是在一根I/O线上读写数据, 因此, 对 读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传 输的正确性和完整性。该协议定义了儿种信号的时序:初始化时序、读时序、写时 序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数 据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行 写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。实验口的学习单总线器件的读写方法,数值合成,数字类型变化等。硬件电路vccH源代码安装LI录下的EXE文件,通过串口线连接计算机与实验板,打开/软件后可在软件界面上显示当前温度值。#include #define uchar unsigned char#define uint unsigned intsbit DS=P22; /define interface定义DS18B20接口uint temp; / variable of temperature uchar flagl: / sign of the result positiveor negativesbit dula二P26;sbit wela=P27;unsigned char code tabler = 0 x3f, 0 x06, 0 x5b, 0 x4f, 0 x66, 0 x6d, 0 x7d,0 x07, 0 x7f, 0 x6f, 0 x77, 0 x7c, 0 x39, 0 x5e, 0 x79, 0 x71;/不带小数点编码。unsigned char code tablel 二Oxbf, 0 x86, Oxdb, Oxcf, 0 xe6, Oxed, Oxfd,DB监DE1ODBMDBJOLUOD附昭辰JW?n JPlOffPUTM2P13PM川P16innniitj71TOX2R.K5CTi952D$18BSOguRSF 9lipwSJf肮19m;paP51ALER.XTrxrALMPSEir*11g:20vceb.0 x87, Oxff, Oxef) ;/带小数点编码。void delay(uint count) /delay uint i:while(count)i二200;while(i0)i;count;/功能:串口初始化,波特率9600,方式1/ void Init_Com(void)TMOD = 0 x20;PCON = 0 x00;SCON = 0 x50;TH1 = OxFd;TL1 = OxFd;TRI = 1;void dsreset(void) /send reset and initialization commanduint i; /DS18B20初始化DS二0;i二103;while(i0)i-;DS二1;i二4;while(i0)i-;bit tmpreadbit(void) /read a bit读一位 uint i:bit dat;DS二0;i+; /!+ for delay小延时一下DS二l;i+;i+;dat=DS;i=8;while(i0)i;return (dat);uchar tmpread(void) /read a byte date读一个字节 uchar i, j, dat;dat=0;for(i=l;i=8;i+)j=tmpreadbit ();dat=(j7)|(datl);读出的数据最低位在最前面,这样刚好/一个字节 在DAT里return(dat) ;/将一个字节数据返回void tmpwritebyte(uchar dat) /write a byte to dsl8b20 /写一个字节到DS18B20里uint i:uchar j;bit testb;for(j=l;j0) i;elseDS二0; /write 0写0部分i=8;while(i0)i;DS二1;i卄;i卄;void tmpchange (void) /DS18B20 begin change发送温度转换命令dsresetO :/初始化DS18B20delay (1) ;/延时tmpwritebyte (Oxcc) ; /跳过丿了:列号命令tmpwritebyte(0 x44) ;/发送温度转换命令uint tmp() /get the temperature获得温度float tt;uchar a, b;dsreset ();delay(l);tmpwritebyte(Oxcc);tmpwritebyte (Oxbe) :/发送读取数据命令a=tmPread() :/连续读两个字节数据b=tmpread ();temp=b;temp=8; /two byte compose a int variabletemp二temp a;/两字节合成一个整型变量。tt=temp*0. 0625;/得到真实十进制温度值,因为DS18B20/可以精确到0.0625度,所以读回数据的最低位代表的是/0.0625度。temp=tt*10+0.5;/放大十倍,这样做的目的将小数点后第一位也转换为 可显示数字,同时进行一个四舍五入操作。A2=A2t/10;A3=A2t%10;dula=O;PO=tableAl ;/显示百位dula=l;dula=O;wela=O;P0=0 x7e;wela=l;wela=O;delay(l);dula=O;P0=tablelA2;/显示十位带小数点的dula=l;dula=O;wela=O;P0=0 x7d;wela=l;wela=O;delay (1);P0=tableA3;显示个位dula=l;dulaO;P0=0 x7b;wela=l;wela=O;delay(l);void main()/主函数uchar a;Init_Com();/初始化串口dotmpchange () ;/温度转换for(a=10;a0;a-)display (tmp() ;/显示十次while (1);59秒计数器实验要求使用软件延时的方法实现0-59秒自动讣数器,用数码管的询两位显示出来。实验LI的练习进位操作,数码管动态显示。硬件电路3dSS3g自宸左源代码/59秒自动计数器#includereg31 h#define uchar unsigned char uchar j, k, i, a, Al, A2, second; sbit dula二P26;sbit wela=P27;uchar code table = 0 x3f, 0 x06, 0 x5b, 0 x4f, 0 x66, 0 x6d, 0 x7d,0 x07, 0 x7f, 0 x6f, 0 x77, 0 x7c, 0 x39, 0 x5e, 0 x79, 0 x71;/数字编码voiddelay(uchar i)/延时函数for(j=i; j0; j)辻(second60)/判断是否到60二71TLDUUJl84ZD3 6/6-J9BH BS H0叫asdsd z.dz.dd d2 25252ZB? =.tnIS . u vrTTFisK WV v9*6.6Qr6Q-69*6.6Qr6Q-6丁mmDeD-mD-mmDeD-mD-L COTe e E E-s-ssecond二0;/如果到了则清零A1二second/10;/没到则分离出十位和个位A2=second%10;for (a=50;a0;a-)/显示部分。至于时间大概是多少请用户用软件仿真看时间约等于1秒display(Al,A2);/便可,如果需要精确定时请用定时器12864点阵液晶显示实验实验要求利用128X64点阵液晶显示屏显示图片,字符,汉字,实现其基本显示功能。实验口的掌握128X64点阵液晶显示的原理。注意:关于液晶的操作说明请用户查看光盘元件资料下的YM12864J液晶资料。硬件电路源代码/TX-1B实验板12864液晶测试程序/测试驱动液晶的程序在指定的位置显示汉字include #define uchar unsigned char tidefine uint unsigned int unsigned char codelcd_latticel6_16;/几个函数声明unsigned char code lcd_letter_8_16n ;void display_8_16(uchar, uchar, uchar);void displaycoslight(uchar): unsigned char code lcd_lattice_coslight15320;sbit CS1二P30;/液晶左半屏选择sbit CS2二P3l;/液晶右半屏选择sbit RS二P35;/写数据或命令选择sbit E二P34;/液晶使能bit dot_not;反白标志void wrst_le (uchar date)/写左部分状态字CS1=1;CS2二0;RS二0;E=l;P0二date;E二0;void wrst_ri (uchar date)写右部分状态字CS1二0;CS2二1;RS二0;E二1;P0二date;E二0;void wrda_le(uchar date)/写左部分数据CS1二1;CS2二0;RS二1;E二1;P0二date;E二0;void wrda_ri (uchar date)/写右部分数据CS1二0;CS2二1;RS二1;E二1;P0二date;E二0;void lcdinit ()/初始化wrst_le(0 x3f);wrst_ri (0 x3f) ; display on*/void displaycis (uchar background) /I清口屏,0清成黑屏uchar i;uchar j;lcdinit ();wrst_le(OxcO);wrst_ri (OxcO); /设置显示起始行for(i=0;i8;i+)wrst_le (0 xb8 i) ;/设置页地址wrst_le (0 x40 0) :/设置列地址for(j=0;j64;j+)if (background0)wrda_le(0 xff) ;/清成白屏elsewrda_le(O) ;/清成黑屏for(i=0;i8;i+)wrst_ri (0 xb8 i) :/设置页地址wrst_ri (0 x40 0) ;/设置列地址for(j=0;j64;j+)if (background0)wrda_ri (Oxff) ;/清成口屏elsewrda_ri (0) ;/清成黑屏void displayword(uchar lcdrow, uchar lcdline, uchar wordnumber)在指定的列和行显示一个汉字uchar i;uint j;if(lcdline64)lcdinit ();wrst_le(OxcO);wrst_le (0 xb8 lcdrow) ;/设置页地址wrst_le(0 x40 lcdline) :/设置列地址j=(wordnumber-1)*32;for(i=0;i32;i+)if(dot_not=l) wrda_le(lcd_latticel6_16 Li+j); elsewrda_le(lcd_latticel6_16i+j);if(i=15)lcdinit ();wrst_le (0 xb8 (lcdrow+1);设置页地址wrst_le(0 x40 lcdline) :/设置列地址elselcdinit ();wrst_ri (OxcO) :/设置显示起始行wrst_ri (0 xb8 lcdrow) :/设置页地址wrst_ri(0 x40 (lcdline-64);设置列地址j二(wordnumber-1)*32;for(i=0;i32;i+)if(dot_not=l)wrda_ri(lcd_latticel6_16Li+jl);else wrda_ri(lcd_latticel6_161i+jj);if (i=lo)wrst_ri (0 xb8 (lcdrow+1) ;/设置页地址wrst_ri (0 x40 (lcdline-64) ;/设置列地址void display_8_16(uchar lcdrow, uchar lcdline,uchar datanumber)在指定的列和行显示一个字符uchar i;uint j;if(lcdline64)wrst_ri(OxcO);wrst_ri (0 xb8 lcdrow) :/设置页地址wrst_ri (0 x40 lcdline) ;/设置列地址j=datanumber;j二(16*j);for(i=0;i16;i+)if(dot_not) wrda_ri(lcd_letter_8_16Zi+j);else wrda_ri(lcd_letter_8_16i+jj);if(i=7)wrst_ri (0 xb8 (lcdrow+1) ;/设置页地址wrst_ri (0 x40 lcdline) ;/设置列地址else if(lcdline122)wrst_le(0 xc0) ;/设置显示起始行wrst_le (0 xb8 lcdrow) ;/设置页地址if(lcdline121)wrda_le (0 x40 (lcdline-64) ;/设置列地址j=datanumber*16;for(i=0;i16;i+)if(dot_not)wrda_le Clcd_letter_8_16i+j);else wrda_le (lcd_letter_8_16 Zi+j);)辻(i=7)wrst_le (0 xb8 : (lcdrow+1);设置页地址wrst_le(0 x40 (lcdline-64);设置列地址void displaycoslight (uchar which_bmp)/显示一幅图像函数uchar i;uchar j;wrst_le(OxcO);wrst_ri (OxcO) ;/*设置显示起始行*/for(i=l;i6;i+)wrst_ri(0 xb8 i) ;/*设置页地址*/wrst.ri (0 x40 32) ;/*设置列地址*/for(j=0;j32;j+)wrda_ri (lcd_lattice_coslight which_bmp(64* (iT)+j);wrst_le(0 xb8 i) ;/*设置页地址*/wrst_le(0 x40 00) ;/*设置列地址*/for(j=32;jnclude #define uint unsigned int#define uchar unsigned char sbit adrd=P3 7: /IO口定义sbitadwr=P3 6;sbit diola=P25;sbit dula二P26;sbit wela=P27:unsigned char j, k, adval: void delay (unsigned char i)/延时程序for(j=i; j0; j)for(k=125;k0;k); uchar code table = 0 x3f, 0 x06, Oxob, 0 x4f, 0 x66, 0 x6d, 0 x7d,/数码管编码0 x07, 0 x7f, 0 x6f, 0 x77, 0 x7c, 0 x39, 0 x5e, 0 x79, 0 x71;void display (uchar bai_c, uchar sh_c, uchar g_c)/显示程丿芋 Portablebai_c;显示百位dula=l;dula二0;P0二Oxfe;wela=l;wela=0;delay (5);dula=0;Portablesh_c;显示十位dula=l;dula=0;wela=0;P0二Oxfd;wela=l;wela=0;delay (5);PO=tableg_c :/显示个位dula=l;dula=0;PO二Oxfb;wela=l;wela=0;delay(5); void main() /主程序uchar a, Al, A2, A2t, A3;while (1)wela=l;PO二0;/选通ADCSadwr=0; /AD写入(随便写个什么都行,主要是为了启动AD转换)_nop_();adwr=l;P0二Oxff;/关闭ADCSdelay (10);wela=0;/关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的 片选发生变化for(a=20;a0;a)/需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据 这里把显示部分放这里的原因也是为了增加写读之间的时间间隔display (Al, A2, A3); 送去显示各位。weld二1;重新打开有AD片选信号锁存器的锁存端P1二Oxff;读取Pl口之前先给其写全1P0二0;/选通ADCSadrd=0: /AD读使能adval=Pl; /AD数据读取赋给Pl口adrd=l;P0二Oxff;关闭ADCSadwr=0;Pladval;/同时把AD的值送八个发光二极显示Al=adval/100;/分出百,十,和个位A2t=adval%100;A2=A2t/10;A3二A2t%10;;数模转换DAC0832的应用实验要求通过用单片机控制DAC0832输出锯齿波,让实验板上发光二极管D12山暗到亮 变化,循环下去。实验日的学会用单片机控制数模转换芯片DAC0832oDAC0832:DAC0832是8位全MOS中速D/A转换器,采用R2RT形电阻解码网 络,转换结果为一对差动电流输出,转换时间大约为lus。使用单电源+5V+15V供电。参考电压为-10V, +10Vo在此我们直接选择+5V作为参考电压。DAC0832有 三种工作方式:直通方式, 单缓冲方式, 双缓冲方式;在此我们选择直通的工作方 式, 将XFER WR2CS管脚全部接数字地。管脚8接参考电压,在此我们接的参考 电压是+3V。我们在控制P0口输出数据有规律的变化将可以产生三角波,锯齿波, 梯型波等波形了。源代码/TX-1BDA测试程序,下载后可观察到D13发光二极管山暗变亮再熄/灭过程,#includereg31 hsbit wela=P27;/数码管位选sbit dula=P26;/段选sbit dawr=P3 6; /DA写数据sbit csda=P3 2; /DA片选unsigned char a, j, k; void delay (unsigned char i)/延时 for(j=i; j0; j)for(k=125;k0;k) : 圭R0Q.祁FSEHPHTPJ/Tk:J P-3咛P: P.OP:714T2T4V.T 70ESv?1.17卜OE硬件电,6,6 ? ?clcl 3*3* 3 3 MMMM J J 6 6 7 7pzLkJpzRKRr;pzLkJpzRKRr; vo:|_Hffl-D er旧: 广;汕Iik13ui16Iik13ui16“ “ Irrrhx.HCIrrrhx.HCvoid main()wela=0;dula=0;csda=0;a=0;dawr=0;while (1)P0=a;/给d不断的加一,然后送给DAdelay (50) ; /延时50ms左右,再加一,再送DA。&+;注意:随着给DA送的数字量的不断增加,其转换成模拟量的电流也不断的增大,所以我们观察发光二极管D12就会从
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!