网站建设公司工作岗位说明书南充移动网站建设
网站建设公司工作岗位说明书,南充移动网站建设,正规引流推广公司,怎么免费永久创建网站无广告各位CSDN的uu们好呀#xff0c;今天#xff0c;小雅兰的内容是51单片机中的定时器以及按键控制LED流水灯模式定时器时钟#xff0c;下面#xff0c;让我们进入51单片机的世界吧#xff01;#xff01;#xff01; 定时器
按键控制LED流水灯模式
定时器时钟
源代… 各位CSDN的uu们好呀今天小雅兰的内容是51单片机中的定时器以及按键控制LED流水灯模式定时器时钟下面让我们进入51单片机的世界吧 定时器
按键控制LED流水灯模式
定时器时钟
源代码 定时器 按键控制LED流水灯模式
0~65535 每隔1微秒计数加一 总共定时时间65535微秒
64535离计数器溢出差值1000所以计时时间为1ms Delay.c的内容 void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
} Key.c的内容 #include REGX52.H
#include Delay.h/*** brief 获取独立按键键码* param 无* retval 按下按键的键码范围0~4无按键按下时返回值为0*/
unsigned char Key()
{unsigned char KeyNumber0;if(P3_10){Delay(20);while(P3_10);Delay(20);KeyNumber1;}if(P3_00){Delay(20);while(P3_00);Delay(20);KeyNumber2;}if(P3_20){Delay(20);while(P3_20);Delay(20);KeyNumber3;}if(P3_30){Delay(20);while(P3_30);Delay(20);KeyNumber4;}return KeyNumber;
}Timer0.c的内容 #include REGX52.H/*** brief 定时器0初始化1毫秒12.000MHz* param 无* retval 无*/
void Timer0Init(void)
{TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET01;EA1;PT00;
}Delay.h的内容 #ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endifKey.h的内容 #ifndef __KEY_H__
#define __KEY_H__unsigned char Key();#endifTimer0.h的内容 #ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0Init(void);#endif main.c的内容 #include REGX52.H#include Timer0.h
#include Key.h
#include INTRINS.Hunsigned char KeyNum,LEDMode;void main()
{P20xFE;Timer0Init();while(1){KeyNumKey(); //获取独立按键键码if(KeyNum) //如果按键按下{if(KeyNum1) //如果K1按键按下{LEDMode; //模式切换if(LEDMode2)LEDMode0;}}}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值T0Count; //T0Count计次对中断频率进行分频if(T0Count500)//分频500次500ms{T0Count0;if(LEDMode0) //模式判断P2_crol_(P2,1); //LED输出if(LEDMode1)P2_cror_(P2,1);}
}定时器时钟 Delay.c的内容 void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}Delay.h的内容 #ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endifLCD1602.c的内容 #include REGX52.H//引脚配置
sbit LCD_RSP2^6;
sbit LCD_RWP2^5;
sbit LCD_ENP2^7;
#define LCD_DataPort P0//函数定义
/*** brief LCD1602延时函数12MHz调用可延时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_RS0;LCD_RW0;LCD_DataPortCommand;LCD_EN1;LCD_Delay();LCD_EN0;LCD_Delay();
}/*** brief LCD1602写数据* param Data 要写入的数据* retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS1;LCD_RW0;LCD_DataPortData;LCD_EN1;LCD_Delay();LCD_EN0;LCD_Delay();
}/*** brief LCD1602设置光标位置* param Line 行位置范围1~2* param Column 列位置范围1~16* retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line1){LCD_WriteCommand(0x80|(Column-1));}else if(Line2){LCD_WriteCommand(0x80|(Column-10x40));}
}/*** brief LCD1602初始化函数* param 无* retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口两行显示5*7点阵LCD_WriteCommand(0x0c);//显示开光标关闪烁关LCD_WriteCommand(0x06);//数据读写操作后光标自动加一画面不动LCD_WriteCommand(0x01);//光标复位清屏
}/*** 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(i0;String[i]!\0;i){LCD_WriteData(String[i]);}
}/*** brief 返回值X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result1;for(i0;iY;i){Result*X;}return Result;
}/*** brief 在LCD1602指定位置开始显示所给数字* param Line 起始行位置范围1~2* param Column 起始列位置范围1~16* param Number 要显示的数字范围0~65535* param Length 要显示数字的长度范围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(iLength;i0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%100);}
}/*** brief 在LCD1602指定位置开始以有符号十进制显示所给数字* param Line 起始行位置范围1~2* param Column 起始列位置范围1~16* param Number 要显示的数字范围-32768~32767* param Length 要显示数字的长度范围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(Number0){LCD_WriteData();Number1Number;}else{LCD_WriteData(-);Number1-Number;}for(iLength;i0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%100);}
}/*** brief 在LCD1602指定位置开始以十六进制显示所给数字* param Line 起始行位置范围1~2* param Column 起始列位置范围1~16* param Number 要显示的数字范围0~0xFFFF* param Length 要显示数字的长度范围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(iLength;i0;i--){SingleNumberNumber/LCD_Pow(16,i-1)%16;if(SingleNumber10){LCD_WriteData(SingleNumber0);}else{LCD_WriteData(SingleNumber-10A);}}
}/*** brief 在LCD1602指定位置开始以二进制显示所给数字* param Line 起始行位置范围1~2* param Column 起始列位置范围1~16* param Number 要显示的数字范围0~1111 1111 1111 1111* param Length 要显示数字的长度范围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(iLength;i0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%20);}
}LCD1602.h的内容 #ifndef __LCD1602_H__
#define __LCD1602_H__//用户调用函数
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endifTimer0.c的内容 #include REGX52.H/*** brief 定时器0初始化1毫秒12.000MHz* param 无* retval 无*/
void Timer0Init(void)
{TMOD 0xF0; //设置定时器模式TMOD | 0x01; //设置定时器模式TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET01;EA1;PT00;
} Timer0.h的内容 #ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0Init(void);#endif main.c的内容 #include REGX52.H
#include Delay.h
#include LCD1602.h
#include Timer0.hunsigned char Sec55,Min59,Hour23;void main()
{LCD_Init();Timer0Init();LCD_ShowString(1,1,Clock:); //上电显示静态字符串LCD_ShowString(2,1, : :);while(1){LCD_ShowNum(2,1,Hour,2); //显示时分秒LCD_ShowNum(2,4,Min,2);LCD_ShowNum(2,7,Sec,2);}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值T0Count;if(T0Count1000) //定时器分频1s{T0Count0;Sec; //1秒到Sec自增if(Sec60){Sec0; //60秒到Sec清0Min自增Min;if(Min60){Min0; //60分钟到Min清0Hour自增Hour;if(Hour24){Hour0; //24小时到Hour清0}}}}
}源代码
定时器时钟 main.c的内容 #include REGX52.H #include Delay.h #include LCD1602.h #include Timer0.h unsigned char Sec55,Min59,Hour23; void main() { LCD_Init(); Timer0Init(); LCD_ShowString(1,1,Clock:); //上电显示静态字符串 LCD_ShowString(2,1, : :); while(1) { LCD_ShowNum(2,1,Hour,2); //显示时分秒 LCD_ShowNum(2,4,Min,2); LCD_ShowNum(2,7,Sec,2); } } void Timer0_Routine() interrupt 1 { static unsigned int T0Count; TL0 0x18; //设置定时初值 TH0 0xFC; //设置定时初值 T0Count; if(T0Count1000) //定时器分频1s { T0Count0; Sec; //1秒到Sec自增 if(Sec60) { Sec0; //60秒到Sec清0Min自增 Min; if(Min60) { Min0; //60分钟到Min清0Hour自增 Hour; if(Hour24) { Hour0; //24小时到Hour清0 } } } } } Delay.c的内容 void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i 2; j 239; do { while (--j); } while (--i); } } Timer0.c的内容 #include REGX52.H /** * brief 定时器0初始化1毫秒12.000MHz * param 无 * retval 无 */ void Timer0Init(void) { TMOD 0xF0; //设置定时器模式 TMOD | 0x01; //设置定时器模式 TL0 0x18; //设置定时初值 TH0 0xFC; //设置定时初值 TF0 0; //清除TF0标志 TR0 1; //定时器0开始计时 ET01; EA1; PT00; } LCD1602.c的内容 #include REGX52.H //引脚配置 sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_ENP2^7; #define LCD_DataPort P0 //函数定义 /** * brief LCD1602延时函数12MHz调用可延时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_RS0; LCD_RW0; LCD_DataPortCommand; LCD_EN1; LCD_Delay(); LCD_EN0; LCD_Delay(); } /** * brief LCD1602写数据 * param Data 要写入的数据 * retval 无 */ void LCD_WriteData(unsigned char Data) { LCD_RS1; LCD_RW0; LCD_DataPortData; LCD_EN1; LCD_Delay(); LCD_EN0; LCD_Delay(); } /** * brief LCD1602设置光标位置 * param Line 行位置范围1~2 * param Column 列位置范围1~16 * retval 无 */ void LCD_SetCursor(unsigned char Line,unsigned char Column) { if(Line1) { LCD_WriteCommand(0x80|(Column-1)); } else if(Line2) { LCD_WriteCommand(0x80|(Column-10x40)); } } /** * brief LCD1602初始化函数 * param 无 * retval 无 */ void LCD_Init() { LCD_WriteCommand(0x38);//八位数据接口两行显示5*7点阵 LCD_WriteCommand(0x0c);//显示开光标关闪烁关 LCD_WriteCommand(0x06);//数据读写操作后光标自动加一画面不动 LCD_WriteCommand(0x01);//光标复位清屏 } /** * 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(i0;String[i]!\0;i) { LCD_WriteData(String[i]); } } /** * brief 返回值X的Y次方 */ int LCD_Pow(int X,int Y) { unsigned char i; int Result1; for(i0;iY;i) { Result*X; } return Result; } /** * brief 在LCD1602指定位置开始显示所给数字 * param Line 起始行位置范围1~2 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围0~65535 * param Length 要显示数字的长度范围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(iLength;i0;i--) { LCD_WriteData(Number/LCD_Pow(10,i-1)%100); } } /** * brief 在LCD1602指定位置开始以有符号十进制显示所给数字 * param Line 起始行位置范围1~2 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围-32768~32767 * param Length 要显示数字的长度范围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(Number0) { LCD_WriteData(); Number1Number; } else { LCD_WriteData(-); Number1-Number; } for(iLength;i0;i--) { LCD_WriteData(Number1/LCD_Pow(10,i-1)%100); } } /** * brief 在LCD1602指定位置开始以十六进制显示所给数字 * param Line 起始行位置范围1~2 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围0~0xFFFF * param Length 要显示数字的长度范围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(iLength;i0;i--) { SingleNumberNumber/LCD_Pow(16,i-1)%16; if(SingleNumber10) { LCD_WriteData(SingleNumber0); } else { LCD_WriteData(SingleNumber-10A); } } } /** * brief 在LCD1602指定位置开始以二进制显示所给数字 * param Line 起始行位置范围1~2 * param Column 起始列位置范围1~16 * param Number 要显示的数字范围0~1111 1111 1111 1111 * param Length 要显示数字的长度范围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(iLength;i0;i--) { LCD_WriteData(Number/LCD_Pow(2,i-1)%20); } } LCD1602.h的内容 #ifndef __LCD1602_H__ #define __LCD1602_H__ //用户调用函数 void LCD_Init(); void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char); void LCD_ShowString(unsigned char Line,unsigned char Column,char *String); void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length); void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); #endif Delay.h的内容 #ifndef __DELAY_H__ #define __DELAY_H__ void Delay(unsigned int xms); #endif Timer0.h的内容 #ifndef __TIMER0_H__ #define __TIMER0_H__ void Timer0Init(void); #endif 好啦小雅兰今天的内容就到这里啦还要继续加油呀
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89869.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!