free性丰满hd毛多多,久久综合给合久久狠狠狠97色69 ,欧美成人乱码一区二区三区,国产美女久久久亚洲综合,7777久久亚洲中文字幕

0
問答首頁 最新問題 熱門問題 等待回答標(biāo)簽廣場
我要提問

單片機(jī)

單片機(jī)

#include                  //調(diào)用單片機(jī)頭文件

#define uchar unsigned char  //無符號(hào)字符型 宏定義        變量范圍0~255

#define uint  unsigned int         //無符號(hào)整型 宏定義        變量范圍0~65535

#include "eeprom52.h"

//數(shù)碼管段選定義      0     1    2    3    4    5        6         7          8           9       

uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,

                                           0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //斷碼

//數(shù)碼管位選定義

uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};

uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};       

uchar smg_i = 3;    //顯示數(shù)碼管的個(gè)位數(shù)

sbit dq   = P2^4;        //18b20 IO口的定義

bit flag_lj_en;                 //按鍵連加使能

bit flag_lj_3_en;         //按鍵連3次連加后使能  加的數(shù)就越大了

uchar key_time,key_value;//用做連加的中間變量

bit key_500ms  ;

sbit moc30 = P2^5;  

uint temperature ;  //

bit flag_300ms ;

uchar menu_1;       //菜單設(shè)計(jì)的變量

uint t_high = 300,t_low = 100;           //溫度上下限報(bào)警值

/***********************1ms延時(shí)函數(shù)*****************************/

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i                for(j=0;j<120;j++);

}

/***********************小延時(shí)函數(shù)*****************************/

void delay_uint(uint q)

{

        while(q--);

}

/***********************數(shù)碼顯示函數(shù)*****************************/

void display()

{

        static uchar i;   

        i++;

        if(i >= smg_i)

                i = 0;       

        P1 = 0xff;                         //消隱

        P3 = smg_we[i];                          //位選

        P1 = dis_smg[i];                 //段選                

}

/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eepom中******************/

void write_eeprom()

{

        SectorErase(0x2000);

        byte_write(0x2000, t_high % 256);

        byte_write(0x2001, t_high / 256);

        byte_write(0x2002, t_low % 256);

        byte_write(0x2003, t_low / 256);

        byte_write(0x2055, a_a);       

}

/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eepom中讀出來*****************/

void read_eeprom()

{

        t_high  = byte_read(0x2001);

        t_high <<= 8;

        t_high  |= byte_read(0x2000);

        t_low   = byte_read(0x2003);

        t_low <<= 8;

        t_low   |= byte_read(0x2002);

        a_a      = byte_read(0x2055);

}

/**************開機(jī)初始化保存的數(shù)據(jù)*****************/

void init_eeprom()

{

        read_eeprom();                //先讀

        if(a_a != 22)                //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom

        {

                t_high = 250;

                t_low  = 200;

                a_a = 22;

                write_eeprom();           //保存數(shù)據(jù)

        }       

}

/***********************18b20初始化函數(shù)*****************************/

void init_18b20()

{

        bit q;

        dq = 1;                                //把總線拿高

        delay_uint(1);            //15us

        dq = 0;                                //給復(fù)位脈沖

        delay_uint(80);                //750us

        dq = 1;                                //把總線拿高 等待

        delay_uint(10);                //110us

        q = dq;                                //讀取18b20初始化信號(hào)

        delay_uint(20);                //200us

        dq = 1;                                //把總線拿高 釋放總線

}

/*************寫18b20內(nèi)的數(shù)據(jù)***************/

void write_18b20(uchar dat)

{

        uchar i;

        for(i=0;i<8;i++)

        {                                         //寫數(shù)據(jù)是低位開始

                dq = 0;                         //把總線拿低寫時(shí)間隙開始

                dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了

                delay_uint(5);         // 60us

                dq = 1;                         //釋放總線

                dat >>= 1;

        }       

}

/*************讀取18b20內(nèi)的數(shù)據(jù)***************/

uchar read_18b20()

{

        uchar i,value;

        for(i=0;i<8;i++)

        {

                dq = 0;                         //把總線拿低讀時(shí)間隙開始

                value >>= 1;         //讀數(shù)據(jù)是低位開始

                dq = 1;                         //釋放總線

                if(dq == 1)                 //開始讀寫數(shù)據(jù)

                value |= 0x80;

                delay_uint(5);         //60us        讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間

        }

        return value;                 //返回?cái)?shù)據(jù)

}

/*************讀取溫度的值讀出來的是小數(shù)***************/

uint read_temp()

{

        uint value;

        uchar low;                           //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳過64位ROM

        write_18b20(0x44);           //啟動(dòng)一次溫度轉(zhuǎn)換命令

        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳過64位ROM

        write_18b20(0xbe);           //發(fā)出讀取暫存器命令       

        low = read_18b20();           //讀溫度低字節(jié)

        value = read_18b20();  //讀溫度高字節(jié)

        value <<= 8;                   //把溫度的高位左移8位

        value |= low;                   //把讀出的溫度低位放到value的低八位中

        value *= 0.625;               //轉(zhuǎn)換到溫度值 小數(shù)

        return value;                   //返回讀出的溫度 帶小數(shù)

}

/*************定時(shí)器初始化程序***************/

void time_init()          

{

        EA=1;                   //開總中斷

        TMOD =0x11;          //定時(shí)器0、定時(shí)器1工作方式1

        ET0 =1;                  //開定時(shí)器0中斷

        TR0 =1;                  //允許定時(shí)器0定時(shí)

        EX0=1;                //開外中斷0

    IT0=1;                   //下降沿觸發(fā)

        ET1=1;

}

/********************獨(dú)立按鍵程序*****************/

uchar key_can;         //按鍵值

void key()         //獨(dú)立按鍵程序

{

        static uchar key_new;

        key_can = 20;                   //按鍵值還原

        P2 |= 0x07;

        if((P2 & 0x07) != 0x07)                //按鍵按下

        {

                if(key_500ms == 1)        //連加

                {

                        key_500ms = 0;

                        key_new = 1;

                }

                delay_1ms(1);                     //按鍵消抖動(dòng)

                if(((P2 & 0x07) != 0x07) && (key_new == 1))

                {                                                //確認(rèn)是按鍵按下

                        key_new = 0;

                        switch(P2 & 0x07)

                        {

                                case 0x06: key_can = 3; break;           //得到k2鍵值

                                case 0x05: key_can = 2; break;           //得到k3鍵值

                                case 0x03: key_can = 1; break;           //得到k4鍵值

                        }

                        flag_lj_en = 1;         //連加使能

                }                       

        }

        else

        {

                if(key_new == 0)

                {

                        key_new = 1;

                        write_eeprom();                //保存數(shù)據(jù)

                        flag_lj_en = 0;                //關(guān)閉連加使能

                        flag_lj_3_en = 0;        //關(guān)閉3秒后使能

                        key_value = 0;                //清零

                        key_time = 0;

                        key_500ms = 0;

                }

        }       

}

/****************按鍵處理數(shù)碼管顯示函數(shù)***************/

void key_with()

{

        if(key_can == 1)          //設(shè)置鍵

        {

                menu_1 ++;

                if(menu_1 >= 3)                        //按設(shè)置鍵3次

                {

                        menu_1 = 0;

                        smg_i = 3;                  //數(shù)碼管顯示3位

                }

        }

        if(menu_1 == 1)                        //設(shè)置高溫報(bào)警

        {

                smg_i = 4;                  //數(shù)碼管顯示4位

                if(key_can == 2)

                {

                        if(flag_lj_3_en == 0)

                                t_high ++ ;                //按鍵按下未松開自動(dòng)加三次       

                        else

                                t_high += 10;        //按鍵按下未松開自動(dòng)加三次之后每次自動(dòng)加10

                        if(t_high > 990)

                                t_high = 990;

                }

                if(key_can == 3)

                {

                        if(flag_lj_3_en == 0)

                                t_high -- ;                //按鍵按下未松開自動(dòng)減三次       

                        else

                                t_high -= 10;        //按鍵按下未松開自動(dòng)減三次之后每次自動(dòng)減10

                        if(t_high <= t_low)

                                t_high = t_low + 1;

                }

                dis_smg[0] = smg_du[t_high % 10];                   //取小數(shù)顯示

                dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf;  //取個(gè)位顯示

                dis_smg[2] = smg_du[t_high / 100 % 10] ;           //取十位顯示

                dis_smg[3] = 0x64;         //H

        }       

        if(menu_1 == 2)                        //設(shè)置低溫報(bào)警

        {

                smg_i = 4;                  //數(shù)碼管顯示4位

                if(key_can == 2)

                {

                        if(flag_lj_3_en == 0)

                                t_low ++ ;                        //按鍵按下未松開自動(dòng)加三次       

                        else

                                t_low += 10;                //按鍵按下未松開自動(dòng)加三次之后每次自動(dòng)加10

                        if(t_low >= t_high)

                                t_low = t_high - 1;

                }

                if(key_can == 3)

                {

                        if(flag_lj_3_en == 0)

                                t_low -- ;                        //按鍵按下未松開自動(dòng)減三次       

                        else

                                t_low -= 10;                //按鍵按下未松開自動(dòng)加三次之后每次自動(dòng)加10

                        if(t_low <= 10)

                                t_low = 10;

                }

                dis_smg[0] = smg_du[t_low % 10];                   //取小數(shù)顯示

                dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf;   //取個(gè)位顯示

                dis_smg[2] = smg_du[t_low / 100 % 10] ;               //取十位顯示

                dis_smg[3] = 0x3D;          //L

        }       

}  

/****************風(fēng)扇控制函數(shù)***************/

       

               

/****************主函數(shù)***************/

void main()

{

        P0 = P1 = P2 = 0xff;  //初始化單片機(jī)IO口為高電平  ?

        time_init();                    //初始化定時(shí)器

        temperature = read_temp();                //先讀出溫度的值       

        init_eeprom();  //開始初始化保存的數(shù)據(jù)

        delay_1ms(650);                               

        temperature = read_temp();                         //先讀出溫度的值

        dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示

        dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個(gè)位顯示

        dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示

            TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

ET1=1;

TR1=1;

EA=1;

        while(1)

        {               

                key();                                        //按鍵程序

                if(key_can < 10)

                {

                        key_with();                        //設(shè)置報(bào)警溫度       

                }

                if(flag_300ms == 1)            //300ms 處理一次溫度程序

                {          

                        flag_300ms = 0;       

                        temperature = read_temp();        //先讀出溫度的值

                        if(menu_1 == 0)

                        {       

                                smg_i = 3;

                                dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示

                                dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個(gè)位顯示

                                dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示

                        }

                }

        }

}

/*************定時(shí)器0中斷服務(wù)程序***************/

void time0_int() interrupt 1

{       

        static uchar value;                         //定時(shí)2ms中斷一次

        TH0 = 0xf8;

        TL0 = 0x30;     //2ms

        display();                //數(shù)碼管顯示函數(shù)

        value++;          

        if(value >= 150)

        {

                value = 0;          

                flag_300ms = 1;

        }

        if(flag_lj_en == 1)           //按下按鍵使能

        {

                key_time ++;

                if(key_time >= 250) //500ms

                {

                        key_time = 0;

                        key_500ms = 1; //500ms

                        key_value ++;

                        if(key_value > 3)

                        {

                                key_value = 10;

                                flag_lj_3_en = 1; //3次后1.5秒連加大些

                        }                                               

                }

        }

}

/*******************定時(shí)器1用做單片機(jī)模擬PWM 調(diào)節(jié)***********************/

void Timer1() interrupt 3

{

TR1=0;

moc30=1;

moc30=1;

moc30=0;

moc30=0;

moc30=0;

moc30=0;

moc30=0;         

}

  interrupt0() interrupt 0

{

EX0=0;

TMOD=0X11;

if(temperature >= t_high)          //風(fēng)扇全開               

   {  TR1=0;

moc30=1;

        }

if((temperature < t_high)        && (temperature >= t_low))                   //風(fēng)扇緩慢

  {

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

ET1=1;

TR1=1;

EA=1;

}

if(temperature < t_low)         //關(guān)閉風(fēng)扇

{ TR1=0 ;

moc30=1;

  }       

}為何進(jìn)入不了定時(shí)器中斷服務(wù)程序

提問者:光攝微針 地點(diǎn):- 瀏覽次數(shù):8724 提問時(shí)間:10-22 11:41
我有更好的答案
提 交
3條回答
60user1 03-18 23:27
外中斷由過零檢測電路采集到,完全可以進(jìn)入外中斷0
sagsdc 03-20 22:29
你把總中斷TIM0中的EA = 1去掉試試?。?
zsl1220548 03-20 05:09
找到問題了,循環(huán)給初值
void Timer1() interrupt 3
{
TR1=0;
ET0=0;
moc30=0;
delay_uint(50);
moc30=1;
ET0=1;
}
??interrupt0() interrupt 0
{
if(temperature >= t_high)? ? ? ?? ?//風(fēng)扇全開? ? ? ? ? ? ? ?
? ?{??TR1=0;
moc30=1;
? ? ? ? }
if((temperature < t_high)? ? ? ? && (temperature >= t_low))? ? ? ? ? ? ? ?? ? //風(fēng)扇緩慢

??{
TH1=(65536-10000/(t_high-t_low)*(t_high-temperature))/256;
TL1=(65536-10000/(t_high-t_low)*(t_high-temperature))%256;;
TR1=1;
ET1=1;
}

if(temperature < t_low)? ? ? ???//關(guān)閉風(fēng)扇

{ TR1=0 ;
moc30=1;
??}? ? ? ?
延時(shí)5ms寫成延時(shí)50ms了,外中斷0中也不能關(guān)閉外中斷0
撰寫答案
提 交
1 / 3
1 / 3
相關(guān)單片機(jī)
具有音調(diào)控制的單片機(jī)立體聲前置放大器
用于單片機(jī)與電子裝置中的開關(guān)電源
單片機(jī)軟硬件復(fù)位的條件都有啥
電動(dòng)機(jī)的單片機(jī)控制
單片機(jī)應(yīng)用系統(tǒng)開發(fā)實(shí)例導(dǎo)航