• 学而时习之专栏
  • 温故而知新专栏



  • PIC在热水器应用例子





    PIC是一种精简指令型的单片机,指令精简。本章是PIC16C84应用在热水器的例子。PIC16C84的说明书


    PIC16C84手册
    PIC16C84的脚位功能图如下:
    16c84脚位图


    这是热水器监视器的程序:




    #include<pic1684.h>

    unsigned char num;
    unsigned int i=0,p=0;
    unsigned char One,Ten;
    const unsigned Code[13]=//0 1 2 3 4 5 6 7 8 9 OFF SPEAKER LED //
    {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff, 0x75, 0xbf };
    void Send(unsigned char One_1,unsigned char Ten_1,unsigned char bai_1);//发送要显示的数据、报警
    void Delay(unsigned int Sec);//延时Sec秒

    main(void)
    {
    TRISA=0x10; //PORTA_RA0:RA3口为输出,RA4口为模拟A/D输入,
    TRISB=0xff; //RB口输入,
    RA3=0;
    while(1)
    {
    i=0;
    //下面Code模拟A/D
    TRISA=0x00; //PORTA口为输出
    RA4=0; Delay(10); //RA4为低并保持
    RA4=1; TRISA=0x10; //RA4为高,并置为输入
    while(RA4!=1) //从 RA4=0到RA4=1计数
    {
    i++;
    if(i>99)break;
    }
    i=99-i; //负温度系数温度传感器转换
    Ten=i/10%10; //将计数值转化为水温值的十位显示编码表(数组Code[])的下标值。
    One=i%10; //将计数值转化为水温值的个位显示编码表(数组Code[])的下标值。

    Send(Code[One],Code[Ten],Code[12]); //根据下标值从常数表中提取编码,发送给移位寄存器(Code[12]=0xbf,LED亮 SPEAKER不响)
    Delay(15); //延时3秒

    p++;//循环次数累加
    num=PORTB;//读取PORTB口
    for(i=7;i>=0;--i) //逐个查询PORTB各脚是否为低电平
    {if((num>>i)%2==0)break;} //为低退出并记录i的值,对应水位值
    if(i==255)i=0;
    i=i*10;
    Ten=i/10%10; //将数值转化为水位值的十位显示编码表的下标值。
    One=i%10; //将数值转化为水位值的个位显示编码表的下标值。

    Send(Code[One],Code[Ten],Code[10]); //根据下标值从常数表中提取编码,发送给移位寄存器(Code[10]=0xff,LED不亮 SPEAKER不响)
    Delay(5); //延时3秒

    if(p>=10) //每循环10次数,嘀--嘀响一次
    {
    unsigned int n;
    p=0;
    Send(Code[One],Code[Ten],Code[11]); //Code[11]=0x75,LED不亮 SPEAKER响
    for(n=0;n<=0x0ed8;n++){;}
    Send(Code[One],Code[Ten],Code[10]); //Code[10]=0xff,LED不亮 SPEAKER不响
    for(n=0;n<=0x2dff;n++){;}
    Send(Code[One],Code[Ten],Code[11]); //Code[11]=0x75,LED不亮 SPEAKER响
    for(n=0;n<=0x0ed8;n++){;}
    Send(Code[One],Code[Ten],Code[10]); //Code[10]=0xff,LED不亮 SPEAKER不响
    }
    if(Ten>=7) //水位数值超过7,嘀--响一次
    {
    Send(Code[One],Code[Ten],Code[11]); //Code[11]=0x75,LED不亮 SPEAKER响
    Delay(20);
    Send(Code[One],Code[Ten],Code[10]); //Code[10]=0xff,LED不亮 SPEAKER不响
    }
    }

    }

    void Send(unsigned char One,unsigned char Ten,unsigned char bai) //发送要显示的数据、报警
    {
    unsigned char j;
    unsigned char l;
    for(l=0;l<=7;l++)//发送个位编码
    {
    RA0=(One>>l)%2; RA1=0;
    for(j=0;j<2;j++){}
    RA1=1;for(j=0;j<2;j++){}RA1=0;
    }
    for(l=0;l<=7;l++)//发送十位编码
    {
    RA0=(Ten>>l)%2;RA1=0;
    for(j=0;j<2;j++){}
    RA1=1;for(j=0;j<2;j++){}RA1=0;
    }
    for(l=0;l<=7;l++)//发送LED,SPEAKER控制位编码
    {
    RA0=(bai>>l)%2;RA1=0;
    for(j=0;j<2;j++){}
    RA1=1;for(j=0;j<2;j++){}RA1=0;
    }
    }
    void Delay(unsigned int Sec) //延时Sec秒
    {
    unsigned int m,n;
    for(m=0;m<=Sec;m++)
    {for(n=0;n<=0x1fff;n++){;}}
    }