新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機C語言程序舉例(二)

        單片機C語言程序舉例(二)

        作者: 時間:2016-11-22 來源:網絡 收藏
        8.液晶背光控制

        本文引用地址:http://www.104case.com/article/201611/320071.htm


        #include
        #include
        #include


        unsigned int hour,minute,second,count;

        sbit RS = P2^4;//Pin4
        sbit RW = P2^5; //Pin5
        sbit E = P2^6;//Pin6

        sbit BLCtrl = P2^7;
        sbit KEY = P3^2;
        #define Data P0 //數據端口

        char data TimeNum[]=" ";
        char data Test1[]=" ";



        void DelayUs(unsigned char us)//delay us
        {
        unsigned char uscnt;
        uscnt=us>>1;
        while(--uscnt);
        }

        void DelayMs(unsigned char ms)//delay Ms
        {
        while(--ms)
        {
        DelayUs(250);
        DelayUs(250);
        DelayUs(250);
        DelayUs(250);
        }
        }
        void WriteCommand(unsigned char c)
        {
        DelayMs(5);//short delay before operation
        E=0;
        RS=0;
        RW=0;
        _nop_();
        E=1;
        Data=c;
        E=0;
        }

        void WriteData(unsigned char c)
        {
        DelayMs(5); //short delay before operation
        E=0;
        RS=1;
        RW=0;
        _nop_();
        E=1;
        Data=c;
        E=0;
        RS=0;
        }

        void ShowChar(unsigned char pos,unsigned char c)
        {
        unsigned char p;
        if (pos>=0x10)
        p=pos+0xb0; //是第二行則命令代碼高4位為0xc
        else
        p=pos+0x80; //是第二行則命令代碼高4位為0x8
        WriteCommand (p);//write command
        WriteData (c); //write data
        }

        void ShowString (unsigned char line,char *ptr)
        {
        unsigned char l,i;
        l=line<<4;
        for (i=0;i<16;i++)
        ShowChar (l++,*(ptr+i));//循環顯示16個字符
        }

        void InitLcd()
        {
        DelayMs(15);
        WriteCommand(0x38); //display mode
        WriteCommand(0x38); //display mode
        WriteCommand(0x38); //display mode
        WriteCommand(0x06); //顯示光標移動位置
        WriteCommand(0x0c); //顯示開及光標設置
        WriteCommand(0x01); //顯示清屏

        }


        /////////////////////////////////////////////////////////////////
        void main(void)

        {


        InitLcd();//初始化液晶
        DelayMs(15);

        sprintf(Test1," www.haotun.com ");//第一行
        ShowString(0,Test1);

        sprintf(TimeNum,"LCM1602 Test ok!");//第二行
        ShowString(1,TimeNum);

        while(1){
        if(!KEY)
        {
        DelayMs(10);//按下去抖
        while(!KEY);
        if(KEY)
        {
        DelayMs(10);//釋放去抖
        if(KEY)
        BLCtrl=!BLCtrl; //背光關掉或者打開
        }
        }
        }

        }

        9.步進電機控制

        #include


        unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10};//正轉表格
        unsigned char code B_Rotation[4]={0x10,0x08,0x040,0x02};//反轉表格

        void Delay(unsigned int i)//延時
        {
        while(--i);
        }

        main()
        {

        unsigned char i;

        while(1)
        {
        for(i=0;i<4;i++) //4相
        {
        P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
        Delay(10000); //改變這個參數可以調整電機轉速
        }
        }
        }

        10. 直流電機調速

        #include
        sbit KEY1 = P3^1;
        sbit PWM = P1^5;
        unsigned char CYCLE; //定義周期 該數字X基準定時時間 如果是10 則周期是10 x 0.1ms
        unsigned char PWM_ON ;//定義高電平時間
        void delay(unsigned int cnt)
        {
        while(--cnt);
        }

        main()
        {
        unsigned char PWM_Num;//定義檔位
        TMOD |=0x01;//定時器設置 1ms in 12M crystal
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//定時1mS
        IE= 0x82; //打開中斷
        TR0=1;

        CYCLE = 10;// 時間可以調整 這個是10步調整 周期10ms 8位PWM就是256步
        while(1)
        {
        if(!KEY1)
        {
        delay(10000);
        if(!KEY1)
        {
        PWM_Num++;
        if(PWM_Num==4)PWM_Num=0;
        switch(PWM_Num){
        case 0:P1=0xFE;PWM_ON=0;break;//高電平時長
        case 1:P1=0xFD;PWM_ON=4;break;
        case 2:P1=0xFB;PWM_ON=6;break;
        case 3:P1=0xF7;PWM_ON=8;break;
        default:break;
        }
        }

        }
        }

        }



        void tim(void) interrupt 1 using 1
        {
        static unsigned char count; //
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//定時1mS

        if (count==PWM_ON)
        {
        PWM = 1; //燈滅
        }
        count++;
        if(count == CYCLE)
        {
        count=0;
        if(PWM_ON!=0) //如果左右時間是0 保持原來狀態
        PWM = 0;//燈亮

        }

        }
        11.秒表


        #include

        code unsigned char tab[]=
        {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        //共陰數碼管 0-9

        unsigned char Dis_Shiwei;//定義十位
        unsigned char Dis_Gewei; //定義個位
        unsigned char S_Dis_Shiwei;//定義秒十位
        unsigned char S_Dis_Gewei; //定義秒個位
        unsigned char second,msecond;

        void CLR(void);
        void delay(unsigned int cnt)
        {
        while(--cnt);
        }

        main()
        {
        EX0=1;//外部中斷0設置
        IT0=1;

        EX1=1;//外部中斷1設置
        IT1=1;

        TMOD |=0x01;//定時器設置 10ms in 12M crystal
        TH0=0xd8;
        TL0=0xf0;
        ET0=1; //打開中斷
        TR0=0;

        EA=1;
        CLR();
        while(1)
        {
        P0=S_Dis_Shiwei;//顯示秒十位
        P2=1;
        delay(300);//短暫延時
        P0=S_Dis_Gewei; //顯示秒個位
        P2=2;
        delay(300);
        P0=0x40; //顯示秒個位
        P2=3;
        delay(300);
        P0=Dis_Shiwei;//顯示十位
        P2=4;
        delay(300);//短暫延時
        P0=Dis_Gewei; //顯示個位
        P2=5;
        delay(300);
        }
        }



        void tim(void) interrupt 1 using 1
        {

        TH0=0xd8;//重新賦值
        TL0=0xf0;
        msecond++;
        if (msecond==100)
        {
        msecond=0;
        second++;//秒加1
        if(second==100)
        second=0;
        S_Dis_Shiwei=tab[second/10];//十位顯示值處理
        S_Dis_Gewei=tab[second%10]; //個位顯示處理

        }
        Dis_Shiwei=tab[msecond/10];//十位顯示值處理
        Dis_Gewei=tab[msecond%10]; //個位顯示處理

        }
        void ISR_INT0(void) interrupt 0 using 1
        {
        TR0=!TR0; //利用外部中斷打開和關閉定時器0 用于開始和停止計時

        }
        void ISR_INT1(void) interrupt 2 using 1
        {
        if(TR0==0)//停止時才可以清零
        CLR();
        }

        void CLR(void)
        {
        second=0; //利用外部中斷清零
        msecond=0;
        Dis_Shiwei=tab[msecond/10];//十位顯示值處理
        Dis_Gewei=tab[msecond%10]; //個位顯示處理
        S_Dis_Shiwei=tab[second/10];//十位顯示值處理
        S_Dis_Gewei=tab[second%10]; //個位顯示處理
        }

        12.花樣燈

        #include

        unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0x55,0x55,0xaa,0xaa};//rom允許情況可以無限添加
        ////////////////////////////////////////////////////////
        void delay(unsigned int cnt)//簡易延時
        {
        while(--cnt);
        }
        ///////////////////////////////////////////////////////
        main()
        {
        unsigned char i;
        while(1)
        {
        P1=0xFE;//第一個LED
        for(i=0;i<8;i++)
        {
        delay(10000);
        P1 <<=1;
        }

        P1=0x7F;//第七個LED亮
        for(i=0;i<8;i++)
        {
        delay(10000);
        P1 >>=1;
        }

        P1=0xFE;//第一個LED亮
        for(i=0;i<8;i++)
        {
        delay(10000);
        P1 <<=1;
        P1 |=0x01;
        }

        P1=0x7F;//第七個LED亮
        for(i=0;i<8;i++)
        {
        delay(10000);
        P1 >>=1;
        P1 |=0x80;
        }
        ////////////////////////////////////
        for(i=0;i<16;i++)//查表可以簡單的顯示各種花樣 實用性更強
        {
        delay(20000);
        P1=seg[i];
        }
        }

        }
        13.紅綠燈


        #include

        bit red,green,yellow,turnred;

        code unsigned char tab[]=
        {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        //共陰數碼管 0-9

        unsigned char Dis_Shiwei;//定義十位
        unsigned char Dis_Gewei; //定義個位
        void delay(unsigned int cnt)
        {
        while(--cnt);
        }

        main()
        {

        TMOD |=0x01;//定時器設置 10ms in 12M crystal
        TH0=0xd8;
        TL0=0xf0;
        IE= 0x82; //打開中斷
        TR0=1;

        P1=0xfc;//紅燈亮
        red =1;
        while(1)
        {
        P0=Dis_Shiwei;//顯示十位
        P2=0;
        delay(300);//短暫延時
        P0=Dis_Gewei; //顯示個位
        P2=1;
        delay(300);
        }

        }



        void tim(void) interrupt 1 using 1
        {
        static unsigned char second=60,count; //初值99

        TH0=0xd8;//重新賦值
        TL0=0xf0;
        count++;
        if (count==100)
        {
        count=0;
        second--;//秒減1
        if(second==0)
        { //這里添加定時到0的代碼 ,可以是燈電路,繼電器吸合等,或者執行一個程序
        if(red)
        {
        red=0;yellow=1;
        second=5;
        P1=0xF3;//黃燈亮5秒
        }
        else if(yellow && !turnred)
        {
        yellow=0;green=1;
        second=50;
        P1=0xCF;//綠燈亮50秒
        }
        else if(green)
        {
        yellow=1;green=0;
        second=5;
        P1=0xF3;//黃燈亮5秒
        turnred=1;
        }
        else if(yellow && turnred)
        {
        red=1;yellow=0;
        P1=0xFC;//紅燈亮60秒
        second=60;
        turnred=0;
        }

        }
        Dis_Shiwei=tab[second/10];//十位顯示值處理
        Dis_Gewei=tab[second%10]; //個位顯示處理

        }
        }




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永丰县| 慈溪市| 宁城县| 霍山县| 三明市| 广灵县| 德安县| 会东县| 油尖旺区| 郧西县| 仁寿县| 黔西县| 西昌市| 宁蒗| 同仁县| 萨嘎县| 平罗县| 江安县| 册亨县| 淅川县| 北票市| 天津市| 晋江市| 务川| 南川市| 长春市| 顺义区| 平顶山市| 靖安县| 化隆| 上林县| 牙克石市| 山丹县| 许昌县| 元阳县| 如皋市| 无棣县| 江津市| 定日县| 德令哈市| 克东县|