這是我在學習了中斷和LCD12864液晶后,將兩者結合寫出來的程序,實現了999倒計時功能,和計數器的功能。程序注釋完整可用,適合學51單片機的新手,希望大家多多參考學習哦~
單片機源程序如下:
- /*看書的時候要十分重點去看寄存器,看到前面我剛開始也是看完之后似懂非懂,我就一直看一直看反復記憶,等覺得自己差不多了就開始看中斷程序,看了程序之后,我的天哪其實定時器初始化要寫的東西并不多,程序比那些復雜的文字要簡單多了,再加上程序后面的分析,我差不多就理解了,之后就用四位數碼管編寫了一個分秒程序,程序沒有錯誤沒有警告但是運行不了,找師兄看過之后他叫我不要深究在這里讓我去做定時器液晶,現在想想可能程序還是有點問題等有空再深究一下,不然怎么別人的可以用數碼管而我的不行呢。
- 我把程序寫出來之后不行,我是這么寫顯示的放在主函數中
- Write1_XY_string(2,0,"shi");
- 我知道可能是這里有了問題可我不會改,不知道如何下手,楊銘師兄就幫我改成了
- Set1_XY(2,0);
- write_date(0x30+shi/10);
- 就可以運行了,因為這些要轉化成十進制的數要加上0x30所以要用這樣寫來轉換。
- 后來師兄想讓我做兩個定時器,一個是時鐘一個是定時的,他把思路告訴我了,后來我寫出來程序是OK的,其實理解了中斷之后多一個少一個都是一樣的。
- 我在寫的時候用上了那些C語言的符號
- else if(miao1==0&&fen1!=0)
- 我感覺這些很好用的,之前我是不會用的,慢慢的突然就想到就會用了哈哈,定時器我是寫程序的時候真的是走的挺快的因為沒有出現什么錯誤,所以我也不知道總結點什么,看書的時候多看看重點“寄存器”吧一定要看懂才行的。
- 我會繼續加油的!*/
- /***** 液晶12864頭文件 *****/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit LCD_RS=P2^4; //片選信號
- sbit LCD_RW=P2^5; //數據信號
- sbit LCD_EN=P2^6; //時鐘信號
- sbit LCD_PSB=P2^7; //串、并行選擇信號
- uchar shi=00,fen=00,miao=00,num,shi1=99,fen1=99,miao1=99,num1;
- /*延時函數 延時xms*/
- void delay(uchar xms)
- {
- uchar x,y;
- for(x=xms;x>0;x--)
- for(y=12;y>0;y--);
- }
- /*以串行協議把數據按位發送,相當于使用并行時接通八個DI口*/
- void send_bit(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD_RW=((byte<<i)&0x80);
- LCD_EN=0; //不加延時,串口中每輸送一個數據都有要有個跳變沿,因此速度很快不需延時
- LCD_EN=1;
- }
- delay(5);
- }
- /*寫串口命令函數 */
- void write_com(uchar com)
- {
- LCD_RS=1; //串口中只要進行數據操作RS就將拉高
- send_bit(0xf8); //第一字節輸入寫指令
- send_bit(com&0xf0); //第二字節發送高四位
- send_bit((com<<4)&0xf0); //第三字節發送低四位
- delay(5);
- LCD_RS=0;
- }
- /*寫數據命令函數*/
- void write_date(uchar date)
- {
- LCD_RS=1;
- send_bit(0xfa); //發送數據識別碼
- send_bit(date&0xf0); //發送高四位
- send_bit((date<<4)&0xf0); //發送低四位
- delay(5);
- LCD_RS=0;
- }
- /*********液晶初始化*********/
- void lcd_init()
- {
- LCD_PSB=0; //串口
- LCD_EN=0;
- write_com(0x30); //基本指令操作 //可加延時也可不加,一般來說液晶都是穩定的
- write_com(0x0c); //開顯示,關光標,反白關
- write_com(0x06); //設置顯示格式,光標位置
- write_com(0x01); //清除顯示,將DDRAM的地址計數器歸零
- }
- ///*********設定顯示位置************/
- void Set1_XY(uchar X, uchar Y)
- {
- switch(X)
- {
- case 1:write_com(0x80+Y); break; //當X為1時執行此程序,在第一行輸入
- case 2:write_com(0x90+Y); break; //第二行
- case 3:write_com(0x88+Y); break; //等三行
- case 4:write_com(0x98+Y); break; //第四行
- }
-
-
- }
- //
- ///************寫字符串***************/
- //
- void Write1_XY_string(uchar X, uchar Y, uchar *str)
- {
- uchar temp;
- Set1_XY(X,Y);
- temp=*str;
- while(temp!=0)
- {
- write_date(temp); //輸出字符
- temp=*(++str);
- }
- }
- //
- ////**************************************************//
- //
- ///************液晶顯示*************/
- //
- void display1()
- {
- Write1_XY_string(1,0,"北京時間,");
- Write1_XY_string(2,0," ");
- Write1_XY_string(3,0,"天氣陰");
- Write1_XY_string(4,0," ");
- }
- void main()
- {
-
- TMOD=0X10; //設置定時器工作方式
- TH0=(65536-45872)/256; //裝初值
- TL0=(65536-45872)%256;
- TH1=(65536-45872)/256; //裝初值
- TL1=(65536-45872)%256;
- EA=1; //全局中斷,打開全局中斷
- ET0=1; //定時器中斷允許位 ,打開T1中斷
- ET1=1;
- TR0=1; //啟動定時器0.INT1電平由高到低
- TR1=1;
- lcd_init(); //調用
- display1();
- while(1)
- {
- // Write1_XY_string(2,0,"shi");
- // Write1_XY_string(2,2,":");
- // Write1_XY_string(2,3,"fen");
- // Write1_XY_string(2,5,":");
- // Write1_XY_string(2,6,"miao/10");
- Set1_XY(2,0);
- write_date(0x30+shi/10);
- write_date(0x30+shi%10);
- Set1_XY(2,2);
- write_date(':');
- Set1_XY(2,3);
- write_date(0x30+fen/10);
- write_date(0x30+fen%10);
- Set1_XY(2,5);
- write_date(':');
- Set1_XY(2,6);
- write_date(0x30+miao/10);
- write_date(0x30+miao%10);
- //********************************************//
- Set1_XY(4,0);
- write_date(0x30+shi1/100);
- write_date(0x30+shi1%100/10);
- write_date(0x30+shi1%10);
- Set1_XY(4,2);
- write_date(':');
- Set1_XY(4,3);
- write_date(0x30+fen1/100);
- write_date(0x30+fen1%100/10);
- write_date(0x30+fen1%10);
- Set1_XY(4,5);
- write_date(':');
- Set1_XY(4,6);
- write_date(0x30+miao1/100);
- write_date(0x30+miao1%100/10);
- write_date(0x30+miao1%10);
- }
- }
- void time()interrupt 1
- {
- TH0=(65536-45872)/256; //重裝初值
- TL0=(65536-45872)%256;
- num++;
- if(num==20)
- {
- num=0;
- miao++;
- if(miao==60)
- {
- fen++;
- miao=0;
- if(fen==60)
- {
- shi++;
- fen=0;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- }
- }
- //************************************************************//
- void time1()interrupt 3
- {
- TH1=(65536-45872)/256; //重裝初值
- TL1=(65536-45872)%256;
- num1++;
- if(num1==20)
- {
- num1=0;
- if(miao1!=0)
- {
- miao1--;
- }
- else if(miao1==0&&fen1!=0)
- {
- fen1--;
- }
- else if(fen1==0&&shi1!=0)
- {
- shi1--;
- }
- if(shi1==0)
- {
- shi1=99;
- fen1=99;
- miao1=99;
- }
- }
- }
復制代碼
以上程序51hei提供下載:
中斷液晶兩個定時器.zip
(34.85 KB, 下載次數: 22)
2019-11-12 20:11 上傳
點擊文件名下載附件
可用,內容精煉,注釋完整,新老手都適合參考
|