单片机实验及proteus仿真_C语言.doc_第1页
单片机实验及proteus仿真_C语言.doc_第2页
单片机实验及proteus仿真_C语言.doc_第3页
单片机实验及proteus仿真_C语言.doc_第4页
单片机实验及proteus仿真_C语言.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

单片机实验:说明,以下是我整理了一些在学习单片机的过程中所做的一些典型的实验,所有程序均用c语言编写,为了方便,在仿真时电路能省的都被省掉了(比如省去晶振用了外部时钟)。程序不一定很优化,也不一定完全没有错误,仅供大家参考。希望大家一块学习!第一:i/o操作篇实验一.闪烁的灯图:程序:#include at89x51.hvoid delay02s();void main(void)while(1) p1_0=0; /p1.0=0 led点亮 delay02s(); /延时0.2s p1_0=1; /p1.0=1 led熄灭 delay02s(); /延时0.2s void delay02s(void) /延时0.2s的函数unsigned char i,j,k; for(j=20;j0;j-) for(i=20;i=0;i-) for(k=248;k=0;k-); 实验二:模拟开关程序:#include at89x51.hvoid main() while(1) if (p1_7=0) p1_0 = 0;/key按下p1_7=0,led点亮 else if ( p1_7=1) p1_0 = 1;/key弹起p1_7=1,led熄灭 实验三: 多路开关程序:#include at89x51.hvoid main()while(1) p1_0 = p1_7; p1_1 = p1_6; p1_2 = p1_5; p1_3 = p1_4; 实验四:跑马灯(一)图:程序:/单一灯的左移右移/八个发光二极管l1l8分别接在单片机的p1.0p1.7接口上/输出“0”时,发光二极管亮,开始时p1.0p1.1p1.2p1.3p1.7p1.6p1.0亮,重复循环。#include at89x51.hvoid delay02s();void main()unsigned int a; while (1) p1=0xfe; delay02s(); for(a=7;a0;a-)/右移 p1=(p10;a-)/左移 p1=(p11)+0x80; delay02s(); void delay02s()unsigned int i,j,k; for(i=0;i20;i+) for(j=0;j20;j+) for(k=0;k248;k+);实验五:跑马灯(二、查表方式)图:程序:#include at89x51.hvoid delay02s(); void main()unsigned char table=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, /第一次,右移一行 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, /第二次,右移一行 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, /第一次,左移一行 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, /第二次,左移一行 0x00,0xff,0x00,0xff; /闪烁两次 unsigned char a; while(1) for (a=0;a0;i-) for(j=20;j0;j-) for(k=248;k0;k-);实验六:led计数程序:#include void delay02s(); void main() unsigned char code table=0x40,0xf9,0x24,0x30,0x19,0x12,0x03,0xf8,0x00,0x18; unsigned char disp; while(1) for(disp=0;disp0;i-) for(j=20;j0;j-) for(k=248;k0;k-); 实验七:二进制计数程序:/用四个发光二极管模拟计数点击开关次数.#include at89x51.hvoid delay10ms();void main()p0=0xff; while(1) /*/ if(p0_7=1) /按键按下 delay10ms(); if(p0_7=0) /按键弹起,此时灯亮. p0=p0-1; /*/ if(p0_7=0) /按键弹起 delay10ms(); if(p0_7=1) /按键按下,此时灯亮. p0=p0-1; / void delay10ms() unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); 验八:一键多用程序:#include at89x51.hvoid delay10ms();void delay02s();void main()unsigned char id=0; while(1) if(p1_7=0) /按键弹起 delay10ms(); if(p1_7=0) id+; if(id=4) id=0; while(p1_7=0); switch(id) case 0: p0_0=p0_0; delay02s(); break; case 1: p0_1=p0_1; delay02s(); break; case 2: p0_2=p0_2; delay02s(); break; case 3: p0_3=p0_3; delay02s(); break; void delay10ms()unsigned char i,k; for(i=20;i0;i-) for(k=248;k0;k-);void delay02s()unsigned char j; for(j=20;j0;j-) delay10ms();实验九:0099计数程序:/0099计数器#include at89x51.hvoid delay1s();void main()unsigned char code table=0xf9,0x24,0x30,0x19,0x12,0x03,0xf8,0x00,0x18,0x40; unsigned int high=9; unsigned int light=9; p0=tablelight; p2=tablehigh; delay1s(); while(1) for(light=0;light0;i-) for(j=20;j0;j-) for(k=248;k0;k-);实验十:可预置数加减计数器程序:/k1(p3_7)加计数.k2(p3_6)头减计数.#include at89x51.hvoid delay02s();void delay10ms();void main()p0=p2; while(1) if(p3_6=0) delay10ms(); if(p3_6=0) p0+; delay02s(); if(p3_7=0) delay10ms(); if(p3_7=0) p0-; delay02s(); void delay02s()unsigned char j; for(j=20;j0;j-) delay10ms();void delay10ms()unsigned char i,k; for(i=20;i0;i-) for(k=248;k0;k-); 实验十一:图:共阴led程序:/开关按下时显示12345,开关弹起时显示hello.#include void delay01ms();void main(void) unsigned char code table1=0xf9,0x24,0x30,0x19,0x12,0xff,0xff,0xff; unsigned char code table2=0x09,0x06,0xc7,0xc7,0x40,0xff,0xff,0xff; unsigned char i; while(1) p2=0xfe; if(p1_0=0) delay01ms(); if(p1_0=0) for(i=0;i8;i+) p0=table1i; p2=(p21)+1; else if(p1_0=1) delay01ms(); if(p1_0=1) for(i=0;i8;i+) p0=table2i; p2=(p20;a-) for(b=248;b0;b-); 实验十二、4*4键盘图:程序:#include at89x51.h void delay10ms();void main()unsigned char key; unsigned char table=0x40,0xf9,0x24,0x30,0x19,0x12,0x03,0xf8,0x00,0x18,0x08,0x00,0x46,0x40,0x06,0x0e, 0xff; while(1) p0=0xff; p3=0xff; p3_4=0; key=p3&0x0f; if(key!=0x0f) delay10ms(); key=p3&0x0f; if(key!=0x0f) switch(key) case 0x0e: key=0;break; case 0x0d: key=1;break; case 0x0b: key=2;break; case 0x07: key=3;break; p0=tablekey; key=key&0x0f; while(key!=0x0f) key=p3; key=key&0x0f; p3=0xff; p3_5=0; key=p3&0x0f; if(key!=0x0f) delay10ms(); key=p3&0x0f; if(key!=0x0f) switch(key) case 0x0e: key=4;break; case 0x0d: key=5;break; case 0x0b: key=6;break; case 0x07: key=7;break; p0=tablekey; key=key&0x0f; while(key!=0x0f) key=p3; key=key&0x0f; p3=0xff; p3_6=0; key=p3&0x0f; if(key!=0x0f) delay10ms(); key=p3&0x0f; if(key!=0x0f) switch(key) case 0x0e: key=8;break; case 0x0d: key=9;break; case 0x0b: key=10;break; case 0x07: key=11;break; p0=tablekey; key=key&0x0f; while(key!=0x0f) key=p3; key=key&0x0f; p3=0xff; p3_7=0; key=p3&0x0f; if(key!=0x0f) delay10ms(); key=p3&0x0f; if(key!=0x0f) switch(key) case 0x0e: key=12;break; case 0x0d: key=13;break; case 0x0b: key=14;break; case 0x07: key=15;break; p0=tablekey; key=key&0x0f; while(key!=0x0f) key=p3; key=key&0x0f; void delay10ms() unsigned int i,k; for(i=20;i0;i-) for(k=20;k0;k-); 实验十三 lcd原理图:程序:#include at89x52.h#define lcd_rs p3_2#define lcd_rw p3_1#define lcd_en p3_0#define lcd_data p1void writecmd(int a) /写控制字int i; for(i=2000;i0;i-); lcd_rs=0; lcd_rw=0; lcd_en=1; lcd_data=a; lcd_en=0;void writedata(char lcddata) /显示字符int i; for(i=2000;i0;i-); lcd_rs=1; lcd_rw=0; lcd_en=1; lcd_data=lcddata; lcd_en=0;void writestring(char addr,char *str) /显示字符串writecmd(addr); do writedata(*str); str+; while(*str!=0); /=lcd初始化= void lcdinit() writecmd(0x38);/8位,两行,5x7字型 (控制字001 d1 d2 d3 x x , 其中 d1:数据长度选择(8位或4位),d2:单双列选择,d3:5x10或5x7字型选择) writecmd(0x08); /关闭

温馨提示

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

评论

0/150

提交评论