实验一 流水灯
依次点亮
#include<reg51.h>
#include<intrins.h>
void delay() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void main()
{
int i;
int mm=0x80;
int nn;
while(1){
P1=0xff;
mm=0x80;
for(i=0;i<8;i++)//8个灯
{
nn=~(mm>>i);
P1=P1&nn;
delay();
}
}
}
间隔点亮
#include<reg51.h>
#include<intrins.h>
void delay() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void main()
{
P1=0x55;
while(1){
P1=~P1;
delay();
}
}
左右循环点亮
#include<intrins.h>
#include <REG51.H>
void delay() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void main(){
int mm=0x80;
int nn=0x01;
int i=0;
int j=0;
while(1)
{
for(i=0;i<8;i++)
{
P1=~(mm>>i);
delay();
}
for(j=0;j<8;j++)
{
P1=~(nn<<j);
delay();
}
}
}
实验二 8位数码管
全零显示 emmm,,,
动态扫描
#include "reg52.h"
#include <intrins.h>
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
#define dstluumagr P1 //使用宏定义数码管段码口
void delay() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
//定义数码管位选信号控制脚
sbit DSA=P2^2;
sbit WSB=P2^3;
int i;
int test;
u8 drma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
u8 wzma[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main()
{
while(1)
{
for(i=0;i<8;i++)
{
dstluumagr=0x00;
DSA=1;
DSA=0;
dstluumagr=wzma[i];
WSB=1;
WSB=0;
dstluumagr=drma[i];
DSA=1;
DSA=0;
delay();
}
}
}
实验三 定时器产生两秒的方波用led显示
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P3
sbit led =P3^0;
sbit led1=P3^1;
void dyuiqi0(void)
{
TMOD &=0XF0;
TMOD |=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=0x4c;
TL0=0x00;
}
void dyuiqivsdr0(void) interrupt 1
{
static u16 j=0;
TH0=0x4c;
TL0=0x00;
j++;
if(j==4)
{
j=0;
led1=!led1;
}
}
void dyuiqi1(void)
{
TMOD &=0X0F;
TMOD |=0x10;
EA=1;
ET1=1;
TR1=1;
TH1=0X4C;
TL1=0X00;
}
void dyuiqivsdr1(void) interrupt 3
{
static u16 i=0;
TH1=0X4C;
TL1=0X00;
i++;
if(i==40)
{
i=0;
led=!led;
}
}
void mian()
{
TMOD=0x11;
dyuiqi0();
dyuiqi1();
while(1)
{}
}
实验 四 中断与定时器
定时器0计数模式按键中断led显示
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
sbit key=P3^4;
unsigned char count=0;
void delay() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
void timer0(void)
{
TMOD &=0X0F;
TMOD |=0X50;
EA=1;
TR0=1;
ET0=1;
TR0=1;//这里也是踏马的离谱,电平触发和边沿触发都一样,真尼玛花花世界迷人眼
TH0=0XFF;
TL0=0XFF;
}
/***
这里是真他妈的离谱,闯了鬼咯。
***/
void vsdr(void) interrupt 1
{
delay();
if(key==0)
{
count++;
P0= ~count;
}
while(key==0)
{
delay();
}
TH0=0XFF;//在循环外围初始化,lest抖动清零定时器
TL0=0XFF;
}
void main(void)
{
P0=0xff;
timer0();
while(1);
}
实验五串行口通信
74LS164用中断方式控制8个二极管
实验六 步进电机正反转
正反转按键,松开停止
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit IN1_A=P1^0;
sbit IN2_B=P1^1;
sbit IN3_C=P1^2;
sbit IN4_D=P1^3;
sbit key1=P3^1;
sbit key2=P3^0;
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void motor(u8 step,u8 dir)
{
u8 temp=step;
if(key1==0 ||key2==0)//有无按键按下
{
if(dir==0)//是否反转
temp=7-step;
switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
{
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
}
}
}
void main()
{
u8 dir=0;
u8 step=0;//小黑狗认逆时针方向
while(1)
{
if(key2)//
{
dir=1;
}
if(key1)
{
dir=0;
}
motor(step++,dir);
if(step==8)step=0;
delay_ms(1);
}
}
实验7 串口通信数据发送
单片机向电脑发送数据
#include <reg51.h>
void uart(void)
{
SCON &=0x0f;
SCON |=0x40;
PCON =0X80;
TMOD &=0X0F;
TMOD |=0X20;
TH1=0xF4;
TL1=0xF4;
TR1=1;
}
void sendstr(unsigned char str)
{
SBUF = str ;
while(TI==0);
TI=0;
}
void sendstring(unsigned char *p)
{
while(*p)
{
sendstr(*p);
p++;
}
}
void main(void)
{
uart();
sendstring("hello 51\n \\n");
while(1)
{}
}
电脑向单片机发送数据
#include <reg51.h>
void uart(void)
{
TMOD &=0X0F;
TMOD |=0X20;//设置定时器
SCON=0X50;//串口控制寄存器
PCON=0X80;//电源控制寄存器主要是smod
TH1=0XF4;
TL1=0XF4;
EA=1;
ES=1;//打开接收中断
TR1=1;
}
void uart1(void) interrupt 4 //串口中断
{
unsigned char rdata;
RI=0; //清除接收中断标志
rdata=SBUF;//存储接收到的数据
SBUF=rdata;//将数据放入发送寄存器
while(TI==0);
TI=0;
}
void main(void)
{
uart();
while(1);
}
实验八 1602
两行输出
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define lcd_data P0
typedef unsigned char u8;
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
u8 str1[]={"viva la napoleon"};
u8 str2[]={"12345"};
void delay() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void write_com(u8 com)//写指令
{
RS=0;
RW=0;//写指令
lcd_data=com;
EN=1;
delay();
EN=0;
}
void write_data(u8 dat)//写数据
{
RS=1;
RW=0;//写数据
lcd_data=dat;
EN=1;
delay();
EN=0;
}
void main(void)
{
u8 i=0;
write_com(0x01);//清屏
write_com(0x06);
write_com(0x38);//
write_com(0x0c); //必须跳出循环之外
while(1){
write_com(0x80);//第一行
for(i=0;i<strlen(str1);i++)
{
write_data(str1[i]);
delay();
}
write_com(0xc0); //第二行
for(i=0;i<strlen(str2);i++)
{
write_data(str2[i]);
delay();
}
}
}