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

📄 0838.c

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 C
字号:
				 ///////////////////////////////////////////////////////////////////////////////////////////////
//                                               
//           H.C.H                            
//           NNU(南京师范大学通信工程)                               
//           TLC0838驱动程序TLC0838_II.c           
//           uchar adc_tlc0838(uchar channel);
//           函数说明:channel为通道的选择:0……CH0   1……CH1  2……CH2  3……CH3 
//                         当error=0时,返回的值为有效值,当error=1时,返回值无效                               
///////////////////////////////////////////////////////////////////////////////////////////////

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit CLK=P1^6;     //TLC0838---PIN16
sbit DI=P1^5;      //TLC0838---PIN17
sbit DO=P1^7;      //TLC0838---PIN14
sbit CS=P1^4;      //TLC0838---PIN18
                   //SE接成低电平

//1602 数据口定义
#define lcd_bus P0			 

//1602引脚定义
sbit rs=P2^5;	     
sbit rw=P2^6;
sbit e=P2^7;

//ASCII码表
/**********0---9**************/
unsigned  int  code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**********a---z**************/
unsigned  int code table1[26]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
                               0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a};
/***********A---Z*************/
unsigned  int code table2[26]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
                               0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};

//基本变量定义
//uchar cnt;
unsigned int d[3];

bit error=1;



uint adc_tlc0838(uchar channel)
{
    uchar t,i;
	uint Temp1=0,Temp2=0;
    if (channel==0)     t=0;
	else if(channel==1) t=1;
	else if(channel==2) t=4;
	else if(channel==3) t=5;
	else if(channel==4) t=2;
	else if(channel==5) t=3;
	else if(channel==6) t=6;
	else if(channel==7) t=7;
   
    CS=1;
   _nop_();_nop_();_nop_();_nop_();

   
    CLK=0;
    CS=0;            //使AD通道打开
    DI = 1;          //Start bit=1
    CLK = 1;
    _nop_();
    _nop_();

    CLK=0;
    CS=0;          
    DI = 1;          
    CLK = 1;
    _nop_();
    _nop_();


    for(i=0;i<3;i++)
	{
      CLK = 0;
      _nop_();
      _nop_();
      if(t&1)DI=1;
	  else DI=0;
	  t=t>>1;       
      CLK = 1;
      _nop_();
      _nop_();
    }


    CLK=0;
    _nop_();
    _nop_();
    CLK=1;
    _nop_();
    _nop_();


     for(i=0;i<=6;i++)
	 {
         CLK = 0;                  //时钟为低电平
         if(DO)
		 {                         //如果采集到的位为1
           Temp1=Temp1+1;          //给临时存储Temp1加1
           Temp1=Temp1<<1;
		 }         //临时存储器左移一位
         else
           Temp1=Temp1<<1;          //如果采集到的数位为0,临时存储器左移一位
		 _nop_();
         _nop_();
         _nop_();
         _nop_();
         CLK = 1;    
      }                             //时钟为高电平,完成一个时钟周期数据采集
       CLK = 0;
       if(DO)  Temp1=Temp1+1;
       if(DO)  Temp2=0x80;

       CLK = 1; 
                                      //采集数据校验          
       
       for(i=0;i<=6;i++)
         {
           CLK=0;
           if(DO){
             Temp2=Temp2>>1;
             Temp2=Temp2+0x80;  }
           else
             Temp2=Temp2>>1;
           CLK = 1; 
         }
   CS = 1;
   if(Temp1==Temp2)             //判断数据采集是否有效
   {  
      error=0;
      return Temp1;
	}
   else
   {
     error=1;
     return 0;
   }
}



/*
hexstoascii2(unsigned int hex)
{
d[0]=table[hex/10];
hex=hex%10;
d[1]=table[hex]; 
}
*/

hexstoascii3(unsigned int hex)
{
d[0]=table[hex/100];
hex=hex%100;
d[1]=table[hex/10];
hex=hex%10;
d[2]=table[hex];
}



/*********延时子程序**********/
void delay(uchar dy)
{
  while(--dy);
} 

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


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



/***************向液晶写数据******************/
void lcd_wrdata(uchar lcddata)
{
 while(lcd_busy());	      //等待空闲
 lcd_bus=lcddata;		  //在下沿的时候写数据
 rs=1;
 rw=0;
 _nop_();
 e=1;
 _nop_();
 _nop_();
 e=0;
 //lcd_bus=0xff;
}


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

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


/**********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〕
利用已有的那个按键程序  
*************/
/*
uchar getkey_ii()
{
    unsigned char keycode=0xff,temp,i;
    P1=0x0f;
	temp=P1&0x0f; 
	if(temp!=0x0f)              //有键按下
	{
	   // beep=0;
	    P1=0x7f;
	    for(i=0;i<4;i++)
		{
			temp=P1&0x0f;
            if(temp==0x07)
	        {    
			    keycode=i*4;
				break;
			}
	        else if(temp==0x0b)
			{
	            keycode=i*4+1;
				break;															  
			}
    	    else if(temp==0x0d)
			{
	            keycode=i*4+2;
				break;
			}
    	    else if(temp==0x0e)
			{
	            keycode=i*4+3;
				break;
			}
			P1=(P1>>1)|0x80;
		}

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

 */

/************单个读键****************/

//没有按键时返回键值0;
//
//P2.3  P2.2  P2.1  P2.0
// 1	 2	  3		 4

 /*
unsigned char getkey()		   
{
 unsigned char k,tem,keytem;
 keytem=0;
 tem=P2&0x0f;
 if(tem!=0x0f)
  	{
	    for(k=0;k<10;k++)  delay(250);				  //加延时防抖
		tem=P2&0x0f;
	 	if(tem!=0x0f)
	 	 {     if(tem==0x07) keytem=1;		//	按下去的键对应的位是0;
	  	  else if(tem==0x0b) keytem=2;
	  	  else if(tem==0x0d) keytem=3;
	      else if(tem==0x0e) keytem=4;
	     }
	 }
	while(tem!=0x0f) tem=P2 & 0x0f;	 //等待按键释放
	return(keytem);
}

 */


/************无线键盘4*4****************/
//无线键盘的四个译码输出口从低到高依次对应于P1口的低四位
//下面是无线键盘的键值分布
// 8 4 2 1 码输出;
// 返回的直接就是键值 (很好用)

/*
uchar getkey_juzhen()
{
	unsigned char keytem=0,k,tem;
	tem=P1&0x0f;
    for(k=0;k<10;k++)	delay(100);		 //加延时防抖
	tem=P1&0x0f;
	keytem=tem;
	while((tem=P1&0x0f)!=0);		   	 //等待按键释放
	return(keytem);
}

*/



main1()
{					 
   uchar result;
   result=adc_tlc0838(0);
   while(1);
}
main2()
{
		  result=adc_tlc0838(0)*5*10/255;
		  if (result!=50)
		  {
		  lcd1602_clear();
		  xianshu(result/10); 
		  lcd1602_wrdata('.');
		  xianshu(result%10);
		  ad9850(result,0,0) ;
		  delay(100);
		  }
}

void main()
{	
	unsigned int  result,result1;
    unsigned char i;
	unsigned int t;
	unsigned char str0[]="System of P.H.Y";
    unsigned char str1[]="    2005/7/28";
	unsigned char str2[]="      20:27";
	unsigned char str3[]="v";
	unsigned char str4[]=".";
	unsigned char kk=0x80; 
//	unsigned char key;
	unsigned int count1=10;
	unsigned int count2=297;
	delay(2);

	lcd_bus=0xff;
	lcd_init();
	lcd_wrcmd(kk+0x00);
	for(i=0;i<15;i++)   lcd_wrdata(str0[i]);
    for(t=0;t<1000;t++) delay(250);
	lcd_clear();
    while(1)
        {  										    
          	 result=adc_tlc0838(0);
		//  key=getkey_ii();
		//  hexstoascii2(count1);
        //   hexstoascii3(count2);
		     result1=2*result;
	         hexstoascii3(result1);
		//  if(key==0)
		 // lcd_clear();
     	  	    lcd_wrcmd(kk+0x00);
	      	    for(i=0;i<13;i++)     lcd_wrdata(str1[i]);
		        lcd_wrcmd(kk+0x46);	  lcd_wrdata(d[0]);
				lcd_wrcmd(kk+0x48);
				for(i=1;i<3;i++)      lcd_wrdata(d[i]);
				lcd_wrcmd(kk+0x4a);   lcd_wrdata(str3[0]);
				lcd_wrcmd(kk+0x47);   lcd_wrdata(str4[0]);
		//	 }
        }

}

⌨️ 快捷键说明

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