电工培训单片机实训项目

实验一   流水灯

依次点亮

#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();
		
	}
		
	
}

	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值