
说明,以下是我整理了一些在学习单片机的过程中所做的一些典型的实验,所有程序均用C语言编写,为了方便,在仿真时电路能省的都被省掉了(比如省去晶振用了外部时钟)。程序不一定很优化,也不一定完全没有错误,仅供大家参考。
希望大家一块学习!!!!
第一:I/O操作篇
实验一.闪烁的灯
图:
程序:
#include "ATX51.H"
void delay02s();
void main(void)
{while(1)
点亮
delay02s(); //延时0.2s
熄灭
delay02s(); //延时0.2s
}
}
v延时0.2s的函数
{unsigned char i,j,k;
for(j=20;j>0;j--)
for(i=20;i=0;i--)
for(k=248;k=0;k--);
}
实验二:模拟开关
程序:
#include "ATX51.H"
void main()
{
while(1)
按下P1_7=0,led点亮
弹起P1_7=1,led熄灭
}
实验三: 多路开关
程序:
#include "ATX51.H"
void main()
{while(1)
{P1_0 = P1_7;
P1_1 = P1_6;
P1_2 = P1_5;
P1_3 = P1_4;
}
}
实验四:跑马灯(一)
图:
程序:
//单一灯的左移右移
//八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上
//输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。
#include "ATX51.H"
void delay02s();
void main()
{unsigned int a;
while (1)
{P1=0xfe;
delay02s();
for(a=7;a>0;a--)//右移
{P1=(P1<<1)+1;
}
for(a=6;a>0;a--)//左移
{P1=(P1>>1)+0x80;
}
}
}
void delay02s()
{unsigned int i,j,k;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
for(k=0;k<248;k++);
}
实验五:跑马灯(二、查表方式)
图:
程序:
#include "ATX51.H"
void delay02s();
void main()
{第一次,右移一行
第二次,右移一行
第一次,左移一行
第二次,左移一行
闪烁两次
unsigned char a;
while(1)
{ for (a=0;a<35;a++)
}
void delay02s()
{unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
}
实验六: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) void delay02s() { unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } 实验七:二进制计数 程序: //用四个发光二极管模拟计数点击开关次数. #include "ATX51.H" void delay10ms(); void main() {P0=0xff; while(1) { /* if(P0_7==1) //按键按下 if(P0_7==0) //按键弹起,此时灯亮. ////////////////////////////////////////////// */ ////////////////////////////////////////////// if(P0_7==0) //按键弹起 if(P0_7==1) //按键按下,此时灯亮. ////////////////////////////////////////////// } } void delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } 验八:一键多用 程序: #include "ATX51.H" void delay10ms(); void delay02s(); void main() {unsigned char id=0; while(1) 按键弹起 switch(id) } } void delay10ms() {unsigned char i,k; for(i=20;i>0;i--) for(k=248;k>0;k--); } void delay02s() {unsigned char j; for(j=20;j>0;j--) delay10ms(); } 实验九:00~99计数 程序: //00~99计数器 #include "ATX51.H" void 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=table[light]; P2=table[high]; delay1s(); while(1) {for(light=0;light<10;light++) } } void delay1s() {unsigned char i,j,k; for(i=82;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } 实验十:可预置数加减计数器 程序: //K1(P3_7)加计数.K2(P3_6)头减计数. #include "ATX51.H" void delay02s(); void delay10ms(); void main() {P0=P2; while(1) {if(P3_6==0) {P0--; } void delay02s() {unsigned char j; for(j=20;j>0;j--) delay10ms(); } void delay10ms() {unsigned char i,k; for(i=20;i>0;i--) for(k=248;k>0;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) } void delay01ms() for(a=4;a>0;a--) for(b=248;b>0;b--); } 实验十二、4*4键盘 图: 程序: #include "ATX51.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) P3=0xff; P3_5=0; key=P3&0x0f; if(key!=0x0f) P0=table[key]; while(key!=0x0f) } P3=0xff; P3_6=0; key=P3&0x0f; if(key!=0x0f) P0=table[key]; while(key!=0x0f) } P3=0xff; P3_7=0; key=P3&0x0f; if(key!=0x0f) P0=table[key]; while(key!=0x0f) } } } void delay10ms() {unsigned int i,k; for(i=20;i>0;i--) for(k=20;k>0;k--); } 实验十三 lcd 原理图: 程序: #include "ATX52.H" #define lcd_rs P3_2 #define lcd_rw P3_1 #define lcd_en P3_0 #define lcd_data P1 void writecmd(int a) //写控制字 {int i; for(i=2000;i>0;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;i>0;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); while(*str!='\\0'); } //=====lcd初始化================================ {writecmd(0x38);//8位,两行,5X7字型 (控制字"001 d1 d2 d3 x x" , 其中 d1:数据长度选择(8位或4位),d2:单双列选择,d3:5X10或5X7字型选择) writecmd(0x08); //关闭显示屏 writecmd(0x01); //清除显示屏 writecmd(0x0c); //开启显示屏,游标,与闪烁 (控制字"00001 d1 d2 d3其中 d1:屏幕开/关, d2:光标开/关, d3:闪烁开/关) writecmd(0x06); //地址递增(AC+1) } //============================================== void main() {char disp1[]={"My QQ:3402384"}; char disp2[]={" Hello Lameck !"}; lcdinit(); while(1) {writestring(0xc0,disp1); } } 目前只完成了这些,剩下的还没来的及写出来,先跟大家共享一下吧。
