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

📄 text1.c

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//数据口定义
#define lcd1602_bus P0	 

//引脚定义
sbit rs_1602=P2^5;	     
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit alarm=P0^0;

uchar tplsb,tpmsb;
uint temp,tempx;
sbit DQ=P2^0;



uchar state;
uchar bdata adc_549; 
sbit  adc_549low=adc_549^0; 
uchar s; 
uchar mea,m[2];
uint in[2];



/*********延时子程序**********/
void delay(uchar t)
{
	uchar i;
	while(t--)
	{
		/* 对于11.0592M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
} 


/*****************启动总线**********************/


/*****************停止IIC总线****************/


/**************检查应答位*******************/


/*****************不对IIC总线产生应答***************/

/*******************向IIC总线写数据*********************/




/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
	uchar busy_flag;
	rs_1602=0;
	rw_1602=1;
	_nop_();
	e_1602=1;
	_nop_();
	lcd1602_bus=0xff;
	busy_flag=lcd1602_bus;	 //e在高电平时读 
	e_1602=0;
	return (bit)(busy_flag&0x80);    //BF=1; BUSY  返回一个位
}


/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0 
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
   	while(lcd1602_busy());	   //等待空闲
	lcd1602_bus=lcdcmd;
	rs_1602=0;
	rw_1602=0;
	_nop_();
	e_1602=1;
	_nop_();
	_nop_();
	e_1602=0;      //产生一个下沿	  
}



/***************向液晶写数据******************/
void lcd1602_wrdata(uchar lcddata)
{
 while(lcd1602_busy());	      //等待空闲
 lcd1602_bus=lcddata;		  //在下沿的时候写数据
 rs_1602=1;
 rw_1602=0;
 _nop_();
 e_1602=1;
 _nop_();
 _nop_();
 e_1602=0;
 //lcd_bus=0xff;
}


/************液晶的清屏************/
void lcd1602_clear(void)
{
  lcd1602_wrcmd(0x01);	   //液晶清屏控制字	并延时>40us
  delay(1);
}

/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
  lcd1602_wrcmd(0x38);	    	//功能设置-----8位数据接口,两行显示,5*7点阵字符显示
  delay(1);
  lcd1602_wrcmd(0x0e);	       //显示开关控制----显示开关开,光标开关关,闪烁开关关
  delay(1);
  lcd1602_wrcmd(0x06);	       //输入方式设置,AC自增1, S=0;
  delay(1);		   
  lcd1602_wrcmd(0x01);         //清屏
  delay(1);
}


/**********4*4矩阵键盘****************/
/************
 矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
   D   C  B  A
1〔15 14 13 12〕
2〔11 10  9  8〕
3〔 7  6  5  4〕
4〔 3  2  1  0〕
利用已有的那个按键程序  
*************/

void TxReset(void)
{
	uint i;
	DQ = 0;

	/* 拉低约900us */
	i = 100;
	while (i>0)	i--;	
	
	DQ = 1;				// 产生上升沿
	i = 4;
	while (i>0)	i--;
}

/* 等待应答脉冲 */
void RxWait(void)
{
	uint i;
	while(DQ);
	while(~DQ);			// 检测到应答脉冲 
	i = 4;
	while (i>0)	i--;
}

/* 读取数据的一位,满足读时隙要求 */ 
bit RdBit(void)
{
	uint i;
	bit b;
	DQ = 0;
	i++;
	DQ = 1;
	i++;i++;			// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
	b = DQ;
	i = 8;
	while(i>0) i--;
	return (b);
}

/* 读取数据的一个字节 */
uchar RdByte(void)
{
	uchar i,j,b;
	b = 0;
	for (i=1;i<=8;i++)
	{
		j = RdBit();
		b = (j<<7)|(b>>1);
	}
	return(b);
}

/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
	uint i;
	uchar j;
	bit btmp;
	for(j=1;j<=8;j++)
	{
		btmp = b&0x01;
		b = b>>1;		// 取下一位(由低位向高位)
		if (btmp)
		{
			/* 写1 */
			DQ = 0;
			i++;i++;	// 延时,使得15us以内拉高
			DQ = 1;
			i = 8;
			while(i>0) i--;	// 整个写1时隙不低于60us 
	   	}
		else
		{
			/* 写0 */
			DQ = 0;			
			i = 8;
			while(i>0) i--;	// 保持低在60us到120us之间
			DQ = 1;
			i++;
			i++;
		}
	}
}

/* 启动温度转换 */
void convert(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20
	RxWait();			// 等待DS18B20给出应答脉冲
	delay(1);			// 延时
	WrByte(0xcc);		// skip rom 命令
	WrByte(0x44);		// convert T 命令
}

/* 读取温度值 */
void RdTemp(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20 
	RxWait();			// 等待DS18B20给出应答脉冲
	delay(1);			// 延时
	WrByte(0xcc);		// skip rom 命令
	WrByte(0xbe);		// read scratchpad 命令
	tplsb = RdByte();	// 温度值低位字节(其中低4位为二进制的“小数”部分)
	tpmsb = RdByte();	// 高位值高位字节(其中高5位为符号位)		
}



void gettemp()
{
   delay(1);		// 延时1ms
   convert();		// 启动温度转换,需要750ms
   delay(100);	// 延时1s
   RdTemp();
   temp=(tpmsb&0x07)*16+((tplsb&0xf0)>>4);
   tempx=tplsb&0x0f;
}




uchar getkey_ii()

{
    unsigned char keycode=0xff,temp,i;
    P1=0x0f;
    temp=P1&0x0f;
    if(temp!=0x0f)        //判是否有键按下
    {
       // beep=0;
        P1=0xef;          //自第0行开始扫描输出,自列读入键值
        for(i=0;i<4;i++)
        {
            temp=P1&0x0f;
            if(temp==0x07)     //判断第0列是否有键按下
            {    
                keycode=i*4+0;
                break;
            }
            else if(temp==0x0b)//判断第1列是否有键按下
            {
                keycode=i*4+1;
                break;                                  						  
            }
            else if(temp==0x0d)//判断第2列是否有键按下
            {
                keycode=i*4+2;
                break;
            }
            else if(temp==0x0e)//判断第3列是否有键按下
            {
                keycode=i*4+3;
                break;
            }
            P1=(P1<<1)|0x1;
        }

         while((P1&0x0f)!=0x0f)   //等待释放
         {
             P1=0x0f;
         }
    //   beep=1;                                             
        
     }
     return keycode;
}

/**********lcd1602 测试程序**********************/
//上电后lcd1602 显示  
//            "System of P.H.Y"      
//             "   Welcome!"
//
//分别按矩阵最右下角的三个按键 分别出现下面几个显示界面:
//   key=0 显示
//    		"    2005/7/28";
//			"      20:27";
//   key=1 显示
//    		"<>?+-*/()="    
//     		"`-=\[]/.,;"    
//   key=2 显示
//         "!@#$%^&*()_+|~"
//         "!@#$%^&*()_+|~"

void xianshu(unsigned long a)
{          unsigned long c,p=0;
				if (a!=0) 
 			{	
                
				c=a/10000;
				if(c!=0)
                {lcd1602_wrdata(c+0x30);
 			     p=1;
				 }
                
                
                c=(a%10000)/1000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
				c=(a%1000)/100;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
				c=(a%100)/10;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
	            c=a%10+0x30;
         	    lcd1602_wrdata(c);   
				
            }
}


void xianshi(uchar j)
{  	uchar str[][9]={{"1.temp "},{"2.date "},{"3.tsx  "},{"4.four "},{"1.temp "}};   
    uchar i;
    unsigned char offset=0x80;
          lcd1602_clear();
  	  	    lcd1602_wrcmd(offset+0x00);

             lcd1602_wrcmd(offset+0x00);
             lcd1602_wrdata('#');
         	for(i=0;i<7;i++)   lcd1602_wrdata(str[j+0][i]);    
   
          	lcd1602_wrcmd(offset+0x40);
			 lcd1602_wrdata(' ');
             for(i=0;i<7;i++)   lcd1602_wrdata(str[j+1][i]);		   
}

void main()																	  		 
{	
   
    uchar i;
//	uint t;

    unsigned char a=30;
 
	uchar j=0;     //标记
	
	uchar d[]="2007/07/18";
    uchar w[]="warning";

	uchar str0='7';
	uchar str1='4';
	uchar str2='1';
    uchar str3=' ';
	uchar str4='8';
	uchar str5='5';
    uchar str6='2';
	uchar str7='0';
	uchar str8='9';
    uchar str9='6';
	uchar str10='3';

	

	unsigned char offset=0x80;   //定义一个偏移地址变量,lcd1602 写入控制字时用到
	unsigned char key;

	delay(2);
	lcd1602_bus=0xff;
	lcd1602_init();
    lcd1602_wrcmd(offset+0x00);
    xianshi(0);  
   
	
    


//	lcd1602_clear();
    while(1)
        {  	
           
		   key=getkey_ii();

		  if(key==4)
		  	{ 
				j=j+1;
				if(j>3)j=0;
			     xianshi(j);      
			 
			 }
		   if (key==0)
		  	{ 			 
			    if (j==0) j=4;
				j=j-1;
			    

				xianshi(j);

			 } 
		  if(key==2  || ((j==0)&&(key==3)))
        	{
                while(key==2 || key==0xff || key==3)
		       {key=getkey_ii(); 
   		     
	    	   gettemp();              
               lcd1602_clear();
		       xianshu(temp);
		       tempx=tempx*10000/16;
		  		
		
		       lcd1602_wrdata('.');
	     	   xianshu(tempx);
			   lcd1602_wrdata(' ');
			   lcd1602_wrdata('*');
			   lcd1602_wrdata('C');
			   if (temp>=a)
			   {
			     alarm=0;
                 lcd1602_wrcmd(offset+0x40);
			     for(i=0;i<8;i++){lcd1602_wrdata(w[i]);delay(10);}
			     delay(1000);
				 alarm=1;
				}
	           delay(1000);
             }  
         	}
          if(key==6  || ((j==1)&&(key==3)))
		  {
          lcd1602_init();
          lcd1602_clear();
	      for(i=0;i<10;i++) lcd1602_wrdata(d[i]);
		  }
		  if(key==10 || ((j==2)&&(key==3)))
		  { a=0;
		    lcd1602_clear();
			
		    while(key!=15 )
		    {
		      key=getkey_ii();


			if(key==0)
		    	{ 
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);//换行
			           
			    a=a*10+7;
	      	    xianshu(a);  
		        //lcd1602_wrcmd(offset+0x40);
			//	for(i=0;i<11;i++) lcd1602_wrdata(str12[i]);
		    	 }
		    else if (key==1)
		    	{ 
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
								
	      	    
				 a=a*10+4;
				 xianshu(a);  
		        //lcd1602_wrcmd(offset+0x40);
				//for(i=0;i<15;i++) lcd1602_wrdata(str22[i]);
		    	 }
		   else if (key==2)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
	      	      
                a=a*10+1;
				xianshu(a);  
		      //  lcd1602_wrcmd(offset+0x40);
			//	for(i=0;i<15;i++) lcd1602_wrdata(str31[i]);
		    	 }

           else if (key==4)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+8;
	      	    xianshu(a);  
               }
            else if (key==5)
		    	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+5;
	      	    xianshu(a);  
               }
            else if (key==6)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+2;
	      	    xianshu(a);  
                }
			else if (key==7)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				
				a=a*10+0;
	      	    xianshu(a);  
                }
			else if (key==8)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+9;
	      	   xianshu(a);  
                 }
			else if (key==9)
		     	 {
		  		lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+6;
	      	   xianshu(a);  
                }
			else if (key==10)
		     	 {
				lcd1602_clear();
     	  	    lcd1602_wrcmd(offset+0x00);
				a=a*10+3;
	      	   xianshu(a);  
                 }
             
              }
		    
	         xianshi(0);
			 j=0;
        	}
	
		





		   

		  
	
     }

}

⌨️ 快捷键说明

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