ccc

#define MAIN_Fosc        12000000L    //定义主时钟 
//#define Main_Fosc_KHZ    (MAIN_Fosc / 1000) 
#include    "15W4KxxS4.h" 
#include "intrins.h" 
#include   <string.h>
#define Buf_Max 5    
#define  uint8    unsigned char 
#define  uint16   unsigned int  
uint8 data Rec_Buf[Buf_Max];
uint8 i = 0;  





//uint8 data temp[100];
uint8 ti = 0;  

sbit CLK=P3^0;
sbit SI=P0^0;
 
void Timer0Init(void)        //1毫秒@12.000MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    ET0=1;
    EA=1;
    TR0 = 1;        //定时器0开始计时
}
void Delay500us()        //@12.000MHz
{
    unsigned char i, j;

    i = 6;
    j = 211;
    do
    {
        while (--j);
    } while (--i);
}
void Delay1ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 12;
    j = 169;
    do
    {
        while (--j);
    } while (--i);
}
void Delay399500us()        //@12.000MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 19;
    j = 56;
    k = 85;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void  delay_ms(unsigned char ms) 
{
     unsigned int i;
         do
         {
          i = MAIN_Fosc /12000;
                while(--i)    ;   //14T per loop
     }
         while(--ms);
}
 
void UartInit(void)        //9600bps@12.000MHz
{
    AUXR1 |=0x40; //选择串口3.6 3.7
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x40;        //定时器1时钟为Fosc,即1T
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //设定定时器1为16位自动重装方式
    TL1 = 0xC7;        //设定定时初值
    TH1 = 0xFE;        //设定定时初值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
}

 
void U1SendData(uint8 ch)
{
    SBUF = ch;                  //写数据到UART数据寄存器
        while(TI == 0);             //在停止位没有发送时,TI为0即一直等待
        TI = 0;                     //清除TI位(该位必须软件清零)
}

 
void U1SendString(uint8 *s)
{
    while (*s)                    //检测字符串结束标志
    {
        U1SendData(*s++);         //发送当前字符
    }
}
 
 
void Uart1() interrupt UART1_VECTOR using 1
{
    ES = 0;                       // 串口1中断关闭
    if (RI)                       //串行接收到停止位的中间时刻时,该位置1
  {
      RI = 0;                   //清除RI位 (该位必须软件清零)
            Rec_Buf[i] = SBUF;       //把串口1缓存SBUF寄存器数据依次存放到数组Rec_Buf中
            i++;                      
        if(i>Buf_Max)             //接收数大于定义接收数组最大个数时,覆盖接收数组之前值
                {
                    i = 0;                 
                }           
   }
   if (TI)                    //在停止位开始发送时,该位置1
   {
      TI = 0;                 //清除TI位(该位必须软件清零)
   }
     ES =  1;                   // 串口1中断打开
}



void    ADC_config(void)
{    
    ADC_CONTR|=0x80;          //开AD转换电源
    delay_ms(10);           //适当延时等待AD转换供电稳定
    P1ASF|=0x80;                  //选择P1.7作为模拟功能AD使用
    ADC_CONTR|=0x07;        //选择P1.7作为AD转换通道输入使用
    ADC_CONTR|=0x60;        //AD转换速度为90个时钟周期转换一次
    ADC_CONTR&=0xEF;        //清AD转换完成标志
    EADC=0;                 //禁止ADC转换中断
    CLK_DIV|=0x20;          //ADC转换结果ADC_RES存高2位,ADC_RESL存低8位
    ADC_CONTR|=0x08;        //启动AD转换,ADC_START=1
}

 
uint16    Get_ADC10bitResult(void)    
{
    uint16    AD_Dat=0;
    ADC_CONTR&=0xE7;              // 将ADC_FLAG清0
    //10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL
    AD_Dat = ADC_RES;               //将ADC_RES低2位移到应在的第9位和第10位
    AD_Dat <<= 8;
    AD_Dat|= ADC_RESL;           //将ADC_RESL的8位移到应在的低8位
    ADC_CONTR|=0x08;           //重新启动AD转换,ADC_START=1。
    return    AD_Dat;    
}



int  main(void)
{        
          
     uint16    TempPhoto,Temp;
     uint8 strPhoto[6];
         P1M1 &= 0x3F;    P1M0 &= 0x3F;      //设置P1.6~P1.7为准双向口  
         P3M1 &= 0x3F;    P3M0 &= 0x3F;      //设置P3.6~P3.7为准双向口  
     ADC_config();                                 //ADC初始化 
     UartInit();                                   //串口1初始化     
     EA = 1;                                       //打开总中断    
     delay_ms(10);                                 //初始化后延时
    
     Timer0Init(); 
     
  ti=0;
  while (1)
        {
                 Delay500us();
                SI=1;
                Delay1ms();
                SI=0;
                Delay399500us();    
            
            
             memset(strPhoto, 0, sizeof(strPhoto));    //strTemp数组清零    
        TempPhoto = Get_ADC10bitResult();            //实时读取P1.7通道的AD转换结果
    delay_ms(5);
        if(TempPhoto==Temp)                       //如果ADC检测结果没有变化,则不更新屏显示
        {
            ;
        }
        else                                      //如果ADC检测结果发生变化,则更新屏显示内容
        {
          Temp=TempPhoto;
            strPhoto[0] = TempPhoto/100+48;             //光强度百位      
      strPhoto[1] = (TempPhoto%100)/10+48;        //光强度十位
          strPhoto[2] = (TempPhoto%100)%10+48;        //光强度个位
          U1SendString(strPhoto);             
          U1SendString("\r\n");                       //输出回车换行符,方便观察数据    
        }
    delay_ms(5);
            } 
}

void wave() interrupt 1
{
    CLK=!CLK;
     
 
}
View Code

 

posted on 2018-11-12 15:41  arcfz  阅读(140)  评论(0编辑  收藏  举报

导航