用定時器和lcd1602做的一個簡單計時器。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (78.78 KB, 下載次數(shù): 40)
下載附件
2022-1-14 17:32 上傳
屏幕截圖 2022-01-13 1651hei2.png (53 KB, 下載次數(shù): 36)
下載附件
2022-1-13 16:40 上傳
單片機源程序如下:
- #include <REGX51.H>
- #include "LCD1602.h"
- unsigned char miao,fen,shi;
- //定時器
- void InitTimer0(void)
- {
- TMOD = 0x01;
- TH0 = 0xff;
- TL0 = 0xA4;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- //主函數(shù)
- void main()
- {
- InitTimer0();//定時器初始化
- LCD_Init();//1602初始化
- LCD_ShowString(1,1,"TIME:");
- LCD_ShowChar(2,3,':');
- LCD_ShowChar(2,6,':');
- while(1)
- {
- LCD_ShowNum(2,1,shi,2);
- LCD_ShowNum(2,4,fen,2);
- LCD_ShowNum(2,7,miao,2);
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- unsigned int jia; //長整型
- TH0 = 0xff;
- TL0 = 0xA4;
- jia++;
- if(jia>=10000)
- {
- jia=0;
- miao++;
- if(miao>=60)
- {
- miao=0;
- fen++;
- if(fen>=60)
- {
- fen=0;
- shi++;
- if(shi>=24)
- {
- shi=0;
- }
- }
- }
- }
- }
復(fù)制代碼- #include <REGX52.H>
- //引腳配置:
- sbit LCD_RS=P2^6;
- sbit LCD_RW=P2^5;
- sbit LCD_EN=P2^7;
- #define LCD_DataPort P0
- //函數(shù)定義:
- /**
- * @brief LCD1602延時函數(shù),12MHz調(diào)用可延時1ms
- * @param 無
- * @retval 無
- */
- void LCD_Delay()
- {
- unsigned char i, j;
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- /**
- * @brief LCD1602寫命令
- * @param Command 要寫入的命令
- * @retval 無
- */
- void LCD_WriteCommand(unsigned char Command)
- {
- LCD_RS=0;
- LCD_RW=0;
- LCD_DataPort=Command;
- LCD_EN=1;
- LCD_Delay();
- LCD_EN=0;
- LCD_Delay();
- }
- /**
- * @brief LCD1602寫數(shù)據(jù)
- * @param Data 要寫入的數(shù)據(jù)
- * @retval 無
- */
- void LCD_WriteData(unsigned char Data)
- {
- LCD_RS=1;
- LCD_RW=0;
- LCD_DataPort=Data;
- LCD_EN=1;
- LCD_Delay();
- LCD_EN=0;
- LCD_Delay();
- }
- /**
- * @brief LCD1602設(shè)置光標位置
- * @param Line 行位置,范圍:1~2
- * @param Column 列位置,范圍:1~16
- * @retval 無
- */
- void LCD_SetCursor(unsigned char Line,unsigned char Column)
- {
- if(Line==1)
- {
- LCD_WriteCommand(0x80|(Column-1));
- }
- else if(Line==2)
- {
- LCD_WriteCommand(0x80|(Column-1+0x40));
- }
- }
- /**
- * @brief LCD1602初始化函數(shù)
- * @param 無
- * @retval 無
- */
- void LCD_Init()
- {
- LCD_WriteCommand(0x38);//八位數(shù)據(jù)接口,兩行顯示,5*7點陣
- LCD_WriteCommand(0x0c);//顯示開,光標關(guān),閃爍關(guān)
- LCD_WriteCommand(0x06);//數(shù)據(jù)讀寫操作后,光標自動加一,畫面不動
- LCD_WriteCommand(0x01);//光標復(fù)位,清屏
- }
- /**
- * @brief 在LCD1602指定位置上顯示一個字符
- * @param Line 行位置,范圍:1~2
- * @param Column 列位置,范圍:1~16
- * @param Char 要顯示的字符
- * @retval 無
- */
- void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
- {
- LCD_SetCursor(Line,Column);
- LCD_WriteData(Char);
- }
- /**
- * @brief 在LCD1602指定位置開始顯示所給字符串
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param String 要顯示的字符串
- * @retval 無
- */
- void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=0;String[i]!='\0';i++)
- {
- LCD_WriteData(String[i]);
- }
- }
- /**
- * @brief 返回值=X的Y次方
- */
- int LCD_Pow(int X,int Y)
- {
- unsigned char i;
- int Result=1;
- for(i=0;i<Y;i++)
- {
- Result*=X;
- }
- return Result;
- }
- /**
- * @brief 在LCD1602指定位置開始顯示所給數(shù)字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數(shù)字,范圍:0~65535
- * @param Length 要顯示數(shù)字的長度,范圍:1~5
- * @retval 無
- */
- void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
- }
- }
- /**
- * @brief 在LCD1602指定位置開始以有符號十進制顯示所給數(shù)字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數(shù)字,范圍:-32768~32767
- * @param Length 要顯示數(shù)字的長度,范圍:1~5
- * @retval 無
- */
- void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
- {
- unsigned char i;
- unsigned int Number1;
- LCD_SetCursor(Line,Column);
- if(Number>=0)
- {
- LCD_WriteData('+');
- Number1=Number;
- }
- else
- {
- LCD_WriteData('-');
- Number1=-Number;
- }
- for(i=Length;i>0;i--)
- {
- LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
- }
- }
- /**
- * @brief 在LCD1602指定位置開始以十六進制顯示所給數(shù)字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數(shù)字,范圍:0~0xFFFF
- * @param Length 要顯示數(shù)字的長度,范圍:1~4
- * @retval 無
- */
- void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i,SingleNumber;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- SingleNumber=Number/LCD_Pow(16,i-1)%16;
- if(SingleNumber<10)
- {
- LCD_WriteData(SingleNumber+'0');
- }
- else
- {
- LCD_WriteData(SingleNumber-10+'A');
- }
- }
- }
- /**
- * @brief 在LCD1602指定位置開始以二進制顯示所給數(shù)字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數(shù)字,范圍:0~1111 1111 1111 1111
- * @param Length 要顯示數(shù)字的長度,范圍:1~16
- * @retval 無
- */
- void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
- }
- }
復(fù)制代碼
51hei.png (13.13 KB, 下載次數(shù): 31)
下載附件
2022-1-14 17:35 上傳
所有資料51hei附件下載:
1602計數(shù)器(帶仿真).7z
(93.48 KB, 下載次數(shù): 25)
2022-1-14 17:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|