⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testpromain.c

📁 单片机学习例子(全面测试程序) 适合初学者使用
💻 C
字号:
#include "reg52.h"
#include <intrins.h>

//typedef bit BOOL  ;
#define uchar unsigned char


sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit D4=P2^3;
sbit CE573=P2^5;
sbit BEEP=P2^4;
sbit KEY1=P3^3;
sbit KEY2=P3^2;
sbit KEY3=P3^4;
sbit KEY4=P3^5;
sbit KEY5=P3^7;


#define SEL_D1 D1=0;
#define SEL_D2 D2=0;
#define SEL_D3 D3=0;
#define SEL_D4 D4=0;

#define REL_D1 D1=1;
#define REL_D2 D2=1;
#define REL_D3 D3=1;
#define REL_D4 D4=1;


sbit rs 	= P2^6 ; 
sbit rw 	= P3^6 ;
sbit ep 	= P2^7 ;



void _delay(uchar) ;
void lcd_wcmd(uchar) ;
//BOOL lcd_bz() ;
void lcd_pos(uchar) ;
void lcd_wdat(uchar) ;
void display(uchar,uchar *) ;



//串口、中断、初始化设置子函数
//11.0592MH晶振下,波特率9600,无奇偶校验

void initmpu(void) 
                   
{
		//定时器1的工作方式2
	TMOD=0x20;
		//装载计数初值
	TL1=0xfd;
	TH1=0xfd;
		//采用串口工作方式1,无奇偶校验
	SCON=0x50;	
		//串口波特率不加倍
	PCON=0x00; 
		//开总中断,开串口中断
	TR1=1;
	IE=0x95; 

}

void Delay(int m)
{
	while(--m);
}


void test_led(void)
{
	int i;

	P1=0x7F;
	Delay(40000);
	for(i=0;i<7;i++)
	{
		P1=P1>>1;
		Delay(40000);
	}
	P1=0xFF;
	return;

}
code unsigned char 	digseg[]={		
		0xC0,  // 0
        0xF9,  // 1
        0xA4,  // 2
        0xB0,  // 3
        0x99,  // 4
        0x92,  // 5
        0x82,  // 6
        0xF8,  // 7
        0x80,  // 8
        0x90,  // 9
		0x88,  // A
        0x83,  // b
        0xC6,  // C 
        0xA1,  // d
        0x86,  // E
        0x8E,  // F
		};
void test_digseg(void)
{
	char i;

	CE573=1;	//0
	SEL_D1;
	SEL_D2;
	SEL_D3;
	SEL_D4;
	for(i=0;i<16;i++)
	{
		P0=digseg[i];
		Delay(40000);
	}
	P0=0xFF;
	Delay(50000);
	P0=0x00;
	Delay(50000);
	P0=0xFF;
	Delay(50000);
	P0=0x00;
	Delay(50000);
	P0=0xFF;
	
	/*
	P0=0x00;
	SEL_D1;
	Delay(60000);
	REL_D1;
	SEL_D2;
	Delay(60000);
	REL_D2;
	SEL_D3;
	Delay(60000);
	REL_D3;
	SEL_D4;
	Delay(60000);
	REL_D4;
	*/

}
void test_beep(void)
{
	BEEP=0;
	Delay(60000);
	BEEP=1;
	Delay(50000);
	BEEP=0;
	Delay(60000);
	BEEP=1;

}

char check_K3(void)
{
	if(KEY3==0)
	{
		Delay(2000);
		{
			if(KEY3==0)
			{
				return 1;	
			}
		}
	}
	return 0;	
}
char  check_K4(void)
{
	if(KEY4==0)
	{
		Delay(2000);
		{
			if(KEY4==0)
			{
				return 1;	
			}
		}
	}
	return 0;	
}
char  check_K5(void)
{
	if(KEY5==0)
	{
		Delay(2000);
		{
			if(KEY5==0)
			{
				return 1;	
			}
		}
	}
	return 0;	
}

code uchar  dis1[] = {"  www.52eda.com  "} ;
code uchar  dis2[] = {"WELCOME TO 52EDA\n"} ;

code uchar send_txt[]={"测试程序到此结束,OK!\n需要帮助请登陆:\nwww.52eda.com\n"};
void test_serial()
{
	int i;
	EA=0;
	for(i=0;i<sizeof(send_txt);i++)
	{
		SBUF=send_txt[i];
		while(TI==0);
		TI=0;
	}
	EA=1;

}

char key1_flag=0;
char key2_flag=0;
void ext_int0() interrupt 0    //外部中断0服务程序
{  
	EA = 0;
	Delay(4000);
	key1_flag=1;
	EA = 1;
}
void ext_int1() interrupt 2    //外部中断1服务程序
{  
	EA = 0;
	Delay(4000);
	key2_flag=1;
	EA = 1;
}

//中断源编号为4,即串口中断
void getch(void) interrupt 4 
{
		
	uchar m;
	EA=0;
    //清除中断标志,硬件置位,软件清零
	RI=0; 
	//接受串口缓冲区数据     	 
	m=SBUF;
	if(m==0x80)
	{
		
		test_serial();

	}
    //通过串口缓冲区向外发送数据
	//SBUF=m;    
	//判断是否发送结束:TI==1为结束
	//while(TI==0); 
	//发送结束标志清零
	//TI=0; 
	EA=1;
	 	     
}
/*
code char num_data[]={"0123456789"};
void send_serial_data(char dat)
{
	SBUF=dat;
	while(TI==0);
	TI=0;	
}
*/

/*
void longdelay(uchar s)  //长延时
{
	 while(s--)
	 {
	  	_delay(60) ;
	 }
}
*/
void _delay(uchar ms)
{       // 延时子程序
	 uchar i ;
	 while(ms--)
	 {
	  	for(i = 0 ; i<250;i++) ;
	 }
}
/*
BOOL lcd_bz()
{       // 测试LCD忙碌状态
	 BOOL result ;
	 rs = 0 ;
	 rw = 1 ;
	 ep = 1 ;
	 result = (BOOL)(P0 & 0x80) ;
	 ep = 0 ;
	 return result ; 
}
*/

void lcd_wcmd(uchar cmd)
{       // 写入指令数据到LCD
 	//while(lcd_bz()) ;
	_delay(1);
	rs = 0 ;
	rw = 0 ;
	ep = 0 ;
	P0 = cmd ;
	ep = 1 ;
	ep = 0 ;  
}

void lcd_pos(uchar pos)
{       //设定显示位置
 	lcd_wcmd(pos | 0x80) ;
}

void lcd_wdat(uchar dat) 
{       //写入字符显示数据到LCD
 	//while(lcd_bz()) ;
	_delay(1);
  	rs = 1 ;
  	rw = 0 ;
  	ep = 0 ;
  	P0 = dat ;
  	ep = 1 ;
  	ep = 0 ; 
}

void lcd_init()
{       //LCD初始化设定
	 lcd_wcmd(0x38) ;   //function set
	 _delay(1) ;
	 lcd_wcmd(0x38) ;   //function set
	 _delay(1) ;
	 lcd_wcmd(0x08) ;   //display on/off
	 _delay(1) ;
	 lcd_wcmd(0x01) ;   //清除LCD的显示内容
	 _delay(1) ;
	 lcd_wcmd(0x06) ;   //entry mode set
	 _delay(1) ;
	 lcd_wcmd(0x0c) ;   //entry mode set
	 _delay(1) ;
}


void display(uchar pos, uchar *q)
{ 
	 uchar i ;
	 //lcd_wcmd(0x01) ; //clear 
	 _delay(10) ;
	 lcd_pos(pos) ;
	 for(i=0 ;i<16;i++)
	 {
		  lcd_wdat(*q) ;
		  q++ ;
		  _delay(60) ;
	 } 
}

void test_lcd(void)
{
	CE573=0;  //1
	display(0x00,dis1) ;
	display(0x40,dis2) ;
	display(0x14,dis1) ;
	display(0x54,dis2) ;
	P0=0xFF;
	CE573=1;	 //0
}


main()
{

	initmpu();
	lcd_init(); 
	Delay(10000);	
	

	  
		test_led();
		test_digseg();	
		test_beep();
		test_lcd();
	
		test_serial();

		while(1)
		{
			if(key1_flag)
			{
				key1_flag=0;
				P0=digseg[1];
				P1=0xFE;


	
			}
			else if(key2_flag)
			{
				key2_flag=0;
				P0=digseg[2];
				P1=0xFC;
					
			}
			else if(check_K3())
			{
				P0=digseg[3];
				P1=0xF8;
	
			}
			else if(check_K4())
			{
				P0=digseg[4];
				P1=0xF0;
			}
			else if(check_K5())
			{
				P0=digseg[5];
				P1=0xE0;	
			}
			SEL_D1;
			_delay(600);
			REL_D1;
			_delay(600);
			
		}

	

	
			          
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -