单片机实验总结.doc

上传人:asd****56 文档编号:26856767 上传时间:2022-07-19 格式:DOC 页数:95 大小:1.19MB
返回 下载 相关 举报
单片机实验总结.doc_第1页
第1页 / 共95页
单片机实验总结.doc_第2页
第2页 / 共95页
点击查看更多>>
资源描述

《单片机实验总结.doc》由会员分享,可在线阅读,更多相关《单片机实验总结.doc(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、心得:1.劳劳逸(脑力劳动,体力劳动,娱乐活动)2.发现问题,解决问题就是在你的大脑中建立广泛的联系3.条缕清晰的做事风格会让你的大脑变得异常秩序,清晰。做到了此三点你的大脑会一天天聪明,清楚,灵活起来。反过来有秩序的大脑将会使你的行为更加利索,清晰。注意:我的人生需注意1.不要口出妄语,只要脚踏实地。2.不要轻易生气,不要轻易露出邪恶的表情。3.不要做作要自然。4.不要猥琐,慌张,要大方,放松,镇定,让自己尽量多的处在禅定状态中2010年5月8日一单片机学习中的问题总结:(天才可以被训练出来,任何人可以在任何领域取得惊人的成就,只要你对你所从事的领域感兴趣,并能长久地保持专注,并具有吃苦耐劳

2、的精神。你的成功与否取决于你的思维方式(习惯)训练的过程是一个不断积累模式的过程,而解决问题的过程最后就变成了对模式进行识别的过程。训练到最后拿到一个问题你可以在0.8秒内迅速再现头脑中类似的模式并凭借直觉给出解决问题的绝佳方式。那样你就是一个天才(后天培养的人才)说明:黑色的程序代表没有问题可以直接用,绿色代表存在缺陷需要改进,紫色代表自创的程序精华!红色代表要交代的重点内容4.221.%bx代表什么数据类型呢?2.串口调试时有时会发送和接收不一?3.直接对P1口取反可以实现灭亮的时间对等,但是通过对P1口赋值则比较复杂!4.做计数显示于LED上的实验的时候不太明白当按下键后P3.4被拉低但

3、是当松开手的时候是什么因素导致了此口被抬为高电平呢详见D:dpjshiyanjilesson1_4计数器实验?5.在利用单片机进行音乐播放的时候需要注意一下几点:1.对于音乐的编码是遵循音调常数,节拍常数,音调常数,节拍常数,.的顺序进行的数组组合。2.音乐的最小单元是音符,每个音符又分为音高和音长,其中控制音高的称为音调常数(共21个),控制音长的叫节拍常数(共7个分别为四分之一拍0x10,半拍0x20,3/4拍0x30,1拍0x40,1又1/2拍0x60,2拍0x80,4拍0x100),其中这两个常数变量又分别由控制节拍常数变量的定时器中断服务子程序和控制频率常数变量的延时程序来控制。6.

4、驱动三极管一般只工作在饱和和截止两种状态下,只有当三极管用在放大电路中时才工作在放大区。7.注意DOFLY的板子采用的是:1.利用573锁存器来驱动段,利用三八译码器来驱动位选。8.松手检测和松手处理不是同一个概念。松手去抖操作一般不进行。硬件按键去抖有:1.滤波去抖和双稳态去抖!所谓的双稳态即为RS触发器,所谓的滤波即为在按键之后加入一个滤波器和一个反向器以实现在键按下后输出正规的方波。9.LCD液晶显示器依据内容分为段式,点阵式,以及字符式其中字符式应用最为简单。进一步可学习图案式LCD.1602内部的控制驱动器是HD44780.DDRAM:用于存放LCD要显示的数据,只要将标准的ASCI

5、I码送入DDRAM中内部的控制电路将自动将数据送到显示器上进行显示。10.总结:要学会使用别人编好的功能程序包!例如LCD显示驱动功能程序包!I2C总线驱动功能程序包。二经典程序收集(1)利用定时计数器0实现计数功能#includevoid main() TMOD=0X05;TH0=0;TL0=0;TF0=0;IE=0;TR0=1;/init();while(1)P1=TL0;/*if(p34=0)p34=1;temp+;P1=temp;*/问题与思考:谁来讲P3.4口的点评拉高?按键抖动问题在此难道不需要予以考虑吗?为什么没有加入去抖程序却没有抖动?此处的初值不用反复复是因为默认为0.(2)

6、定时计数器1的计数功能实验 1 #include 2 #define uchar unsigned char 3 /uchar temp; 4 /sbit p34=P34; 5 /void init(); 6 uchar i=0; 7 void main() 8 TMOD=0X60; 9 1 TH1=0xfe; 10 1 TL1=0xfe; 11 1 TF1=0; 12 1 TR1=1; 13 1 /init(); 14 1 while(1) 15 1 16 1 17 2 while(!TF1); 18 2 TF1=0; 19 2 +i; 20 2 P1=i; 21 2 /*if(p34=0)

7、 22 2 23 2 p34=1; 24 2 temp+; 25 2 P1=temp; 26 2 */ 27 2 28 1 问题与思考:同上此处的初始值不用反复复由于使用的工作方式2.(3)串口通信实验:利用P3.0,P3.1实现字符串的发送。#include#include#define uchar unsigned char#define uint unsigned intuchar trdata=8,0,c,5,1,0x0d,0x0a,0x00;void main() uint i,j;SCON=0X40;PCON=0;/REN=1;/有没有它也是不影响串口通信的因为他只在单片机接收的时

8、候才要求必须置一;TMOD=0X20;TH1=0XE6;TL1=0XE6;/TI=1;/说明:有没有这个都不影响串口通信且位为有硬件置一TR1=1;while(1)i=0;while(trdatai!=0x00)SBUF=trdatai;while(TI=0);TI=0;i+;for(j=0;j50000;j+); 说明:当TI=1且SBUF=A时便启动了串口的发送计算机将接受到单片机发过来的数据A。REN=1;虽说对于发送而言可有可无但是最好还是加上吧!(4)数码管的动态十分交替显示123456和050906的规范化程序#include#define uchar unsigned charu

9、char code dula=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar code wela=0x00,0x01,0x02,0x03,0x04,0x05;uchar a,b,flag,temp;sbit p37=P37;void delay(uchar);void display(uchar,uchar);void init();void main()while(1)uchar i;for(i=0;i90;i+)display(6,1);delay(2);display(5,2);delay(2);display(4,3);d

10、elay(2);display(3,4);delay(2);display(2,5);delay(2);display(1,6);delay(2);for(i=0;i0;x-)for(j=0;j125;j+);void display(uchar a,uchar num)switch(a)case 6:p37=1,P0=dulanum,P2=wela0,p37=0;break;case 5:p37=1,P0=dulanum,P2=wela1,p37=0;break;case 4:p37=1,P0=dulanum,P2=wela2,p37=0;break;case 3:p37=1,P0=dula

11、num,P2=wela3,p37=0;break;case 2:p37=1,P0=dulanum,P2=wela4,p37=0;break;case 1:p37=1,P0=dulanum,P2=wela5,p37=0;break;default:break;思考:用此程序实现比起我原来写的那个程序要好不必写两个显示函数了减少了程序的篇幅提高了效率,而且使得整个程序看上去整齐划一非常之规范,利用子函数实现特定的功能实现模块化程序设计的思路必须得以贯彻,子程序的效率也要必须得以提高!注意:此程序在延迟时间上并不准确的实现一秒显示,显示123456为480ms显示050906为480ms因此从一个1

12、23456到另一个持续时间为960毫秒小于一秒。(5)自编的高效矩阵键盘检测程序#include#define uchar unsigned charuchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x38,0x3e,0x6e,0x00;uchar temp=0;/sbit p37=P37;void delay(uchar);void display();uchar keyscan();void main()P2=0x02;while(1)

13、display();void delay(uchar x)uchar j;for(;x0;x-)for(j=0;j125;j+);uchar keyscan()P3=0x0f;temp=P3&0x0f;if(temp!=0x0f)delay(10);temp=P3&0x0f;if(temp!=0x0f)temp=P3&0x0f;P3=0xf0;P3=P3&0xf0;if(P3!=0xf0)delay(10);P3=P3&0xf0;if(P3!=0xf0)temp=temp+P3;return temp;void display()uchar temp;temp=keyscan();switch

14、(temp)case 0x7e:P0=table1;break;case 0x7d:P0=table2;break;case 0x7b:P0=table3;break;case 0x77:P0=table4;break;case 0xbe:P0=table5;break;case 0xbd:P0=table6;break;case 0xbb:P0=table7;break;case 0xb7:P0=table8;break;case 0xde:P0=table9;break;case 0xdd:P0=table10;break;case 0xdb:P0=table11;break;case 0

15、xd7:P0=table12;break;case 0xee:P0=table13;break;case 0xed:P0=table14;break;case 0xeb:P0=table15;break;case 0xe7:P0=table16;break;说明:其高效体现在:1.代码量少。注意:P3可以作为如变量temp一样使用。另外键盘的工作方式有三种1.程序控制扫描2.定时扫瞄3.中断扫描。其中前两中方式或多或少对CPU造成一定的浪费。而方式3则最高效。(6)LCD驱动程序包#include#include#define uchar unsigned char#define uint u

16、nsigned intsbit rs=P24;sbit rw=P25;sbit e=P26;#define dataport P0const uchar nodisp=0;/无显示;const uchar nocur=1;/有显示但无光标;const uchar curNoFlash=2;/有光标但无闪烁;const uchar curflash=3;/有光标且有闪烁;void lcdpos(uchar,uchar);/确定光标的位置;void lcdwd(uchar);/写字符;void lcdwc(uchar);/送控制字且检测忙信号;void lcdwcn(uchar);/送控制字但不检

17、测忙信号;void mdelay(uchar);/延迟子程序;void waitidle();/正常读/写操作之前的检测LCD控制状态;/延迟子程序;void mdelay(uchar j)uint i=0;for(;j0;j-)for(i=0;i=15)break;/设置光标的功能;void setcur(uchar para)mdelay(2);switch(para)case 0:lcdwc(0x08);break;case 1:lcdwc(0x0c);break;case 2:lcdwc(0x0e);break;case 3:lcdwc(0x0f);break;default:brea

18、k;/实现清屏功能的子函数void clrlcd()lcdwc(0x01);/调用送控制字子程序;/正常读写之前的检测lcd控制状态;void waitidle()uchar tmp;rs=0;rw=1;e=1;_nop_();for(;)tmp=dataport;tmp&=0x80;if(tmp=0)break;e=0;/实现写字符功能;void lcdwd(uchar c)waitidle();rs=1;rw=0;dataport=c;e=1;_nop_();_nop_();e=0;/送控制字子程序(检测忙信号);void lcdwc(uchar c)waitidle();lcdwcn(c

19、);/调用送控制字子程序(不检测忙信号);/送控制字子程序(不检测忙信号);void lcdwcn(uchar c)rs=0;rw=0;dataport=c;e=1;_nop_();e=0;/设置第xpos,ypos光标所在的地址;void lcdpos(uchar xpos,uchar ypos)uchar tmp;xpos&=0x0f;ypos&=0x01;if(ypos=0)tmp=xpos;elsetmp=xpos+0x40;tmp|=0x80;lcdwc(tmp);/复位LCD控制器;void lcdreset()mdelay(15);lcdwc(0x38);lcdwc(0x08);

20、lcdwc(0x01);lcdwc(0x06);lcdwc(0x0c);/-以下是用lcd实现现实一个字符串的主函数-void main()uchar xpos,ypos;uchar *s=80c51!;xpos=8;ypos=0;lcdreset();clrlcd();setcur(curflash);writestring(s,xpos,ypos);for(;);-以下实现让字母A围绕着LCD屏转动-void main()char xpos,ypos;while(1)p37=0;ypos=0;for(xpos=0;xpos=0;xpos-)lcdreset();clrlcd();setcu

21、r(nocur);writechar(A,xpos,ypos);mdelay(3000);if(xpos=-1)break;ypos=0; -实现上行动态显示娄浩很性感,下行静态显示80C51-添加以上的LCD显示驱动包。void main()uchar s=louhao is sexy!;char xpos,ypos;lcdreset();clrlcd();setcur(nocur);writestring(80c51,6,1);while(1)p37=0;ypos=0;for(xpos=0;xpos=15;xpos+)writechar(sxpos,xpos,ypos);mdelay(50

22、00);if(xpos=15)lcdreset();clrlcd();setcur(nocur);writestring(80c51,6,1);break; 说明:LCD显示比起9段数码显示更加高级且由于有了现成的驱动程序包因而用户只需要把握如何与驱动程序之间建立联系(接口)便可以了!在其他的工程项目应用场合要尽量使用lcd来显示,当然是在成本允许的情况下!(用户只需关注以下几点:1.写字符函数writechar(uchar s,uchar xpos,uchar ypos)2.写字符串函数writestring(uchar*s,uchar xpos,uchar ypos)3.setcur(uc

23、har set)在使用时只需对函数中的各个参数作出合理的设置便可其他的程序则套用周坚老师的模式便可!)(7)I2C总线驱动程序包/*- 启动IIC总线-*/ void start(void) sda=1; _nop_();_nop_(); scl=1; _nop_();_nop_();_nop_();_nop_();_nop_(); sda=0; _nop_();_nop_();_nop_();_nop_();_nop_(); scl=0; /*- 停止IIC总线-*/ void stop(void) sda=0; _nop_(); scl=1; _nop_();_nop_();_nop_()

24、;_nop_();_nop_(); sda=1; _nop_();_nop_();_nop_();_nop_();_nop_(); scl=0; /*- 应答IIC总线-*/ void ack(void) sda=0;_nop_();_nop_();_nop_();scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;_nop_();_nop_();/*- 非应答IIC总线-*/void noack(void) sda=1; _nop_();_nop_();_nop_(); scl=1; _nop_();_nop_();_nop_();_nop

25、_();_nop_(); scl=0; _nop_();_nop_(); /*- 发送一个字节-*/ void send(unsigned char c) unsigned char bitcounter=8; unsigned char temp; do temp=c; scl=0; _nop_();_nop_();_nop_();_nop_();_nop_(); if(temp&0x80)=0x80) sda=1; else sda=0;scl=1;temp=c1;c=temp;bitcounter-; while(bitcounter); scl=0; /*- 读入一个字节并返回-*/

26、unsigned char read(void) unsigned char temp=0; unsigned char temp1=0; unsigned char bitcounter=8; sda=1; do scl=0; _nop_();_nop_();_nop_();_nop_();_nop_(); scl=1; _nop_();_nop_();_nop_();_nop_();_nop_(); if(sda) temp=temp|0x01; else temp=temp&0xfe; if(bitcounter-1) temp1=temp1; temp=temp1; bitcounte

27、r-; while(bitcounter);return(temp); /*- 写入数据-*/ void wr_to_rom(unsigned char shuju,unsigned char address,unsigned char num) unsigned char i; unsigned char *pshuju; pshuju=shuju; for(i=0;inum;i+) start(); send(addwr); /写入芯片地址 ack(); send(address+i);/写入存储地址 ack(); send(*(pshuju+i);/写数据 ack(); stop();

28、mdelay(20); /*- 读出数据-*/ void rd_from_rom(unsigned char shuju,unsigned char address,unsigned char num) unsigned char i; unsigned char *pshuju; pshuju=shuju; for(i=0;inum;i+) start(); /写入芯片地址 send(addwr); ack(); send(address+i);/写入存储地址 ack(); start(); send(addrd); /读入地址 ack(); *(pshuju+i)=read();/读数据

29、scl=0; noack(); stop(); 说明:以上程序为I2C总线驱动程序(模拟)用时只需关注其中的两个函数便可:rd_from_rom(shuzu,address,num)和wr_to_rom(shuzu,address,num).I2c总线的应用还需要继续进行练习我仅仅只是一知半解而已!而且还有周坚老师的一个实验没有完成以后继续做!-以下为利用I2C总线实现的对EEPROM的读和写-void main()uchar num=0x7f,0x6f,0x77,0x06,0x5b;uchar i;wp=0;/关写保护如若开则写不进;wr_to_rom(num,1,4);for(i=0;i5

30、;i+)numi=0x3f;P2=0x03;rd_from_rom(num,1,5);for(i=0;i5;i+)p37=1;P0=numi;mdelay(1000);p37=0;注:参考浩豚公司的师访程序!(8)数码管999数字计数程序(带有消影功能)非定时器应用#include#define uint unsigned int#define uchar unsigned charvoid delay(uint);sbit p37=P37;uchar bai,shi,ge;uint num=0,a;uchar wela=0x00,0x01,0x02;uchar code shuma=0x3f

31、,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;void main()while(1)for(num=0;num0;a-)/a的值可以实现数字显示速度的快慢;P2=wela2;p37=1;P0=shumage;p37=0;delay(100);P0=0xff;/ 消影P2=wela1;p37=1;P0=shumashi;p37=0;delay(100);P0=0xff;/ 消影P2=wela0;p37=1;P0=shumabai;p37=0;delay(100);P0=0xff;/ 消影void delay(uint i)/用延时程序实现数码管的动态显示;while(i-);注:消影功能即是让数码管的不该亮的部分熄灭;(9)按键计数程序(待改进不太稳定而且只能计数255次)/ 有待改进的程序用绿色 #include

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 初中资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁