1、更改keil uvision3的字体以及关键字颜色的设置:
修改顺序入下 1 打开edit 2 打开edit 最下方configuration 3 打开colars 4 选择8051 edit c file 可以修改 C语言的大小 和关键词着色 问题。
源自http://zhidao.baidu.com/question/137561189.html
2、位定义:sbit LED00 = P0^0 ; (放在头文件下面,main()函数上方)。
3、12M晶振,1ms基准延时程序如下:
void delay1ms(unsigned int i)
{
unsigned char j;
while(i--)
{
for(j=0;j<125;j++) //1ms基准延时程序
{
;
}
}
// j < 125 是因为for(){ ; }循环每循环一次括号内消耗3个指令周期,{;}内执行一个空语句消耗1个指令周期,即:每循环一次消耗4个指令周期(12M晶振:1us * 4)
//注意在写延时函数时 while(){ } 和 for( ; ; ){ } 的区别。
4、循环左移、右移函数_crol_(要移的数字 ,一次移动的位数) ; _cror_();
使用的头文件是#include
应用例程如下:
应用例程如下:
/******************************************************************************
* 说明:AT89S52芯片,12M晶振
* P0、P1两个8位端口分别连接8个LED灯
* 低电平点亮,高电平熄灭。
******************************************************************************/
#include
#include
//是循环左移、右移函数的头文件,参考网址如下 //sbit LED00=P0^0; //位定义,定义单片机引脚
void delay(int t)
{
int i , j ;
for(i = 0 ; i < 100*t ; i++)
{
for(j = 0 ; j < 125 ; j++)
{
;
}
}
}
void main(void)
{
P0 = 0xfe ; //0b11111110
P1 = 0x7f ; //0b01111111
while(1)
{
P0 = _crol_(P0 , 1); //循环左移,每次循环1位
P1 = _cror_(P1 , 1); //循环右移,每次循环1位
delay(5) ;
}
}
5、在电路连接时,如果是小电压(小功率)设备,如LED灯,最好加一个限压电阻,如果是驱动一个大功率(需要大电流)设备时,最好加一级三极管进行驱动。
6、用程序实现,在单片机的某一个引脚上产生一定频率的方波。
最好利用定时器实现,这样比较精确。通过延时函数实现也行,不过要确保延时的精确度,最好不要使用带有参数的延时函数。
示例如下:
无源蜂鸣器要发声音,必须给它提供一定频率(1KHz左右)的方波。(声音频率)
实现方法:周期性的将打片机引脚“置位、延时、复位、延时”
示例中无源蜂鸣器接在AT89S52单片机的P3^6引脚:
/******************************************************************************
* 说明:AT89S52芯片,12M晶振
* 此开发板蜂鸣器的控制端口和单片机的P3^6引脚相连接
* 用三极管进行驱动
* 无源蜂鸣器:需要写函数产生1KHz左右的声音频率(方波)
******************************************************************************/
#include
sbit FMQ = P3^6 ; //位定义,定义单片机引脚
/******************************************************************************
* 名称:delay1ms()
* 功能:延时1ms
* 参数:int t
* 返回:无
******************************************************************************/
void delay1ms(int t)
{
unsigned char i ;
while(t--)
{
for(i = 0 ; i < 125 ; i++)
{
;
}
}
}
/******************************************************************************
* 名称:delay500us()
* 功能:延时500us
* 参数:无
* 返回:无
******************************************************************************/
void delay500us(void)
{
int i ;
for(i = 0 ; i < 63 ; i++)
{
;
}
}
/******************************************************************************
* 名称:beep_sound()
* 功能:产生FMQ发声需要的1KHz的声音频率
* 参数:无
* 返回:无
******************************************************************************/
void beep_sound(void)
{
FMQ = 0 ;
delay500us();
FMQ = 1 ;
delay500us();
}
void main(void)
{
int i , t;
while(1)
{
t = 1000 ; //蜂鸣器发声1000*1ms 1KHz频率的方波,一个周期是1ms
for(i = 0 ; i < t/3 ; i++) //for( ; ; )循环自身每循环一次占用3个指令周期
{
beep_sound();
}
FMQ = 1 ; //关掉FMQ 1s(延时)
delay1ms(1000) ;
}
}
将delay500ms()函数 和 beep_sound()函数改成如下形式,蜂鸣器的声音频率和发声时长完全面目全非了,很无解!欢迎有经验的朋友通过评论的方式进行交流。
/******************************************************************************
* 名称:delay500us()
* 功能:延时500us
* 参数:int t
* 返回:无
******************************************************************************/
void delay500us(int t)
{
int i ;
for(i = 0 ; i < 63*t ; i++)
{
;
}
}
/******************************************************************************
* 名称:beep_sound()
* 功能:产生FMQ发声需要的1KHz的声音频率
* 参数:无
* 返回:无
******************************************************************************/
void beep_sound(void)
{
FMQ = 0 ;
delay500us(1);
FMQ = 1 ;
delay500us(1);
}
7、在基于AT89S52单片机编程时,把一些静态变量或数组等(程序运行过程中不发生改变的变量或数组)在定义时变量名前加上 code ,这样这些变量或数组等将被存到单片机外部的ROM(AT89S52的8K ROM)中,这样便节省了单片机内部宝贵的RAM资源。(AT89S52内部只有256Byte的RAM)
注意:动态变量(在程序运行过程中会发生改变的变量或数组)不能用 code 声明,这些变量存放到外部ROM中,程序在运行过程中或出错。
#include
sbit SMG_1 = P2^7 ; //位定义,定义单片机引脚
unsigned char code S8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//数组名前加 code 作用:将静态数组S8[16]存到AT89S52外部的8K的ROM中,而不是内部的256字节的RAM中。
//这样就节省了芯片内部宝贵的RAM资源。
//但是动态的(在程序运行过程中要发生变化的)变量或数组不能存放在外部的ROM中,变量名前面加code程序会出错
8、4 x 4 矩阵键盘 AT89S52的P1口(8位)扫描矩阵键盘
分为逐行扫描和线反转法扫描两种方式。
逐行扫描:1、先给列全写1 :1111
2、给行写 0111 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(1 , n)键按下;
给行写 1011 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(2 , n)键按下;
给行写 1101 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(3 , n)键按下;
给行写 1110 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(4 , n)键按下;
线反转法扫描: 1、先给列全写1,给行全写0 ,则第x列被拉低;
2、再给列全写0,给行全写1 ,则第y行被拉低;
3、确定出是坐标为(x , y)的按键被按下。
具体程序实现过程参照我的博客博文《51单片机复习程序例举001》第8、9程序段:
http://blog.csdn.net/dragon12345666/article/details/22148459
9、按键消抖
按键消抖分为:软件消抖和硬件消抖。
注意:软件消抖时,两到三次的消抖延时,获取按键后加等待按键释放语句也可减少干扰。如果没有加等待按键释放的语句,则要在读取按键后加一个几十到一百毫秒的延时,防止后延抖动带来的干扰。
上一篇:51单片机复习程序例举001
下一篇:51单片机的i2c多字节的读写24c02
推荐阅读最新更新时间:2024-03-16 15:37
设计资源 培训 开发板 精华推荐
- 智能家电解决方案 互联品质生活
- 美信基础模拟IC APP下载 助力您创新模拟设计!
- 了解PI最新产品,评论、下载抢楼好礼送!
- 免费申请|中科亿海微神针系列FPGA开发板EQ6HL45 1V0
- Littelfuse【智能家居的电路保护方案】在线研讨会 11月22日10点 强势登场!预报名、参与研讨会赢好礼!
- 【电源技术需求调查,为2024年蓄力!】活动开始啦~
- PSoC4 Cortex-M0开发板免费申请,分享心得赢惊喜大礼!
- TE 福利月|有奖调查、技术干货、限时折扣
- 【TI.com线上采购专场——智能楼宇篇】畅聊火爆的智能电子锁、可视化门铃、智能传感器和网络摄像头方案
- Littelfuse 碳化硅(SiC) MOSFET和肖特基二极管产品介绍及相关应用