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

📄 final-all.c

📁 一个单片机作业 用于晶体管的循环显示
💻 C
字号:
#include <reg52.h>

sbit rect_wave=P1^2;   //在P1.2脚上输出周期为2MS即500H方波的

unsigned long fre_in,fre_out;

unsigned char  count2;

unsigned char fre_in_bit[4];       //依次存放要求产生的频率值的百位,十位,各位  

unsigned char count;

unsigned char Read0,Read1,Read2,N0,N1;

unsigned int N;
unsigned char THH0;
void delay(unsigned char m)
{
	unsigned char i,j;
	for(;m>0;m--)
	{
		for(i=0;i<10;i++)
			for(j=0;j<10;j++);
	}
	   
}
void display(void)
{
	unsigned char fre_out_bit[4];   //依次存放测量得到的频率值的百位,十位,各位
	
	//显示数码管的字型码的常数表,在ROM区,只读不可写(共阴数码管)
	unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
	unsigned char i;        //显示第i个数码管
	unsigned int j;
	//刷新测量频率值

	j++;
	if (j == 100)
	{   j = 0;
		EA = 0;
		fre_out = Read2;
		fre_out <<= 8;
		fre_out += Read1;
		fre_out <<= 8;
		fre_out += Read0;
		EA = 1;
		fre_out =(unsigned long)( 921600 / (fre_out+5));
		fre_out_bit[3]=(fre_out/1000);                //计算千位
		fre_out_bit[2]=(fre_out/100)%10;              //计算百位
		fre_out_bit[1]=(fre_out/10)%10;               //计算十位
		fre_out_bit[0]=(fre_out)%10;                  //计算个位	
	}
	for(i=0;i<4;i++)//显示输入频率值
	{
		P0=table[fre_in_bit[i]];
		P2=(0x7f>>i)|(0x7f<<(8-i));
		delay(5);
	}
	
	for(i=0;i<4;i++)//显示测量频率值
	{
		P0=table[fre_out_bit[i]];
		P2=(0xf7>>i)|(0xf7<<(8-i));
		delay(5);
	} 	
}

//产生方波
void time0(void) interrupt 1
{
	   count++;
	   TH0=N1;
       TL0=N0;
	   if(count==10)
	   {   count=0;
		   rect_wave=~rect_wave;
	   }
}

////////////////////////////////////////////////////////////////////////////////////////////
/************************************************ 测频模块 *********************************/
////////////////////////////////////////////////////////////////////////////////////////////
//采用测周的方式测量频率.将方波信号接至外部中断INT0,利用外部中断每来一个下降沿执行?
//一次中断程序来实现在一个方波周期内测量计数器T2总计了多少个机器周期的办法来实现
void testfre(void) interrupt 0
{
	TR1=0;                       //关闭定时器T2,以读取计数器的值
	Read2 = count2;
	Read1 = TH1;
	Read0 = TL1;
	TH1=0;     //计数器初值请零
	TL1=0;
	count2=0;  //溢出次数请零
	TR1=1;     //启动定时器2
}


////////////////////////////////////////////////////////////////////////////////////////////
/**************************************  显示模块   ***************************************/
////////////////////////////////////////////////////////////////////////////////////////////
//用8位LED共阴数码关显示,其中PO口输出段码数据,P2.7~P2.0口作为位选,即扫描控制,每个数码管亮1ms
//动态显示

///////////// ////////////////////     延时 ? ms函数       ///////////////////////////////////

void T2_ISR(void) interrupt 3
{ 
    count2++;   //每溢出依次count2加1
	TH1=0;
	TL1=0;	
}
unsigned char  Key_scan(void)//用查询方式扫描键盘,返回键值
{
	unsigned char key_value;
	unsigned char reread_key;
	key_value=P1&0xf0;    
	if(key_value!=0xf0)
	{
        delay(30);             //延时10ms
		reread_key=P1&0xf0;    //再读P1高4位
		if(reread_key==key_value) 
		{
		delay(30);
		while(reread_key&P1!=0xf0);
		return key_value; 
  	    }
	}
    //P1|=0xf0;
	
}
////////////////////////////////////////////////////////////////////////////////////////////
/**************************************  主程序    ***************************************/
////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
  {	
    unsigned char key_value;
  	IE=0x00;
	P2=0xff;      //启动状态数码管全灭
	fre_out=0;   
	fre_in=500;
    N=65536-(46080/fre_in)+15;
    TMOD=0x11;
    count=0;
    N1=(N>>8)%256;
    N0=N%256;
    TH0=N1;
    TL0=N0;
	TH1=TL1=0;

	fre_in_bit[3]=(fre_in/1000);                //计算千位
	fre_in_bit[2]=(fre_in/100)%10;              //计算百位
	fre_in_bit[1]=(fre_in/10)%10;               //计算十位
	fre_in_bit[0]=(fre_in)%10;                  //计算个位
   
    IP=0x03;          //置T0中断的优先级最高
    EA=1;
    ET0=1;
    ET1=1;
    EX0=1;     //开放定时器T0 T1中断、外部中断0
	
    TR0=1;      //启动定时器T0启动定时器T1
    TR1=1;
	IT0=1;
	
   
	do{
		key_value=Key_scan();  
		switch(key_value)
		{
		case 0xe0: 	fre_in++; 	break;
		
		case 0xd0: 	fre_in+=10;	break;
			   
		case 0xb0:  fre_in+=100; break;
		
		case 0x70:  fre_in+=1000; break;
					
		default:break;
		}
		//刷新输入频率值的各个位
		
		if(fre_in>9999) 
		{
		fre_in-=10000;
		fre_in_bit[0]=0;
		}
		else
		fre_in_bit[3]=(fre_in/1000);                //计算千位
		fre_in_bit[2]=(fre_in/100)%10;              //计算百位
		fre_in_bit[1]=(fre_in/10)%10;               //计算十位
		fre_in_bit[0]=(fre_in)%10;                  //计算个位
	    N=65536-(46080/fre_in)+15;
		count=0;
        N1=(N>>8)%256;
    	N0=N%256;		
        display();
	}while(1);
}


⌨️ 快捷键说明

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