51单片机 C语言
昵称90天可改
这个作者很懒,什么都没留下…
展开
-
51单片机(STC89C52)DS18B20温度传感器驱动程序
原创 2012-05-03 17:44:13 · 10181 阅读 · 4 评论 -
Keil C51对C语言的关键词扩展之九: idata
idata声明的变量存储在内部ram 256字节范围内。data声明的变量存储在内部ram低128字节范围内。原创 2013-11-29 21:15:07 · 2029 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十: pdata
外部ram通过一个地址指针寄存器来间接访问,读写效率要低于内部ram。外部ram容量最大可位64KB。Keil C51提供两种外部数据存储方式,pdata和xdata。1)xdata存储类型,指示变量可存储在外部ram 64KB地址范围内任意位置。large内存模型下,变量即为此种默认存储类型。2)pdata存储类型,指示变量可存储在外部ram 256字节页范围内任意位置。comp原创 2013-11-29 21:26:03 · 2382 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十一: xdata
xdata声明的变量位于外部ram 64KB地址范围内某一位置。程序示例:unsigned int xdata m=0; /* 声明一个全局变量,可位于外部ram 64KB地址范围内任意位置,由编译器决定 */int main(void){......}原创 2013-11-29 21:33:57 · 2341 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十三: sfr
sfr用来定义特殊功能寄存器。用法如下:sfr name = address;name 为寄存器名字address 为寄存器的地址示例:sfr P0 = 0x80; /* P0口,地址为0x80 */sfr P1 = 0x90; /* P1口,地址为0x90 */sfr P2 = 0xA0; /* P2口,地址为0xa0 */sfr P3 =原创 2013-11-29 22:10:26 · 3749 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之八: far
far的出现,是Keil 编译器为了支持新出现的8051家族增强型MCU,这些增强型MCU可能拥有大于64KB的存储器。使用far可访问扩展的RAM,使用const far可访问扩展的ROM。NXP 51MX架构51单片机提供通过通用指针访问多大8MB的code和xdata存储空间。Dallas 390架构的51单片机通过24位的DPTR寄存器结合传统MOVX 、MOVC指令来访问扩展的RAM原创 2013-11-29 21:11:14 · 3098 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之四: bit
bit关键词可定义位变量,可用于函数参数、返回值类型。static bit done_flag = 0; /* 位变量*/bit testfunc ( /* 返回值类型为位变量 */ bit flag1, /* 参数类型为位变量 */ bit flag2){...return (0);原创 2013-11-29 18:54:46 · 4280 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之五: code
code 指定存储位置位于程序存储器。程序存储器只读,因此code类型的变量,是无法再次赋值的。unsigned char code ary[ ] = :"Read only"; /* 数组ary位于程序存储器 */ary[0]='a'; /* 错误,不可修改*/原创 2013-11-29 19:12:23 · 2226 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之六: compact
函数的参数和局部变量存储在内存模型指定的默认区域内。我们可以通过small,compact 或large 指定一个函数使用何种内存模型。#pragma small /* 默认内存模型为small*/extern int calc (char i, int b) large reentrant;extern int func (int i, float f) lar原创 2013-11-29 19:23:40 · 1997 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十四: interrupt
8051/8052系列单片机标准向量表:中断号 描述 地址 0外部中断0 0003h1定时/计数器0 000Bh2外部中断1 0013h3定时计数器1 001Bh4串口 0023h5定时计数器2(8052)原创 2013-12-01 21:21:47 · 3860 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十五: reentrant
reentrant声明的函数为可重入函数。可重入的函数能够被多个进程同时调用。可重入函数在执行时,另外的进程可以中断当前执行的函数,并且调用同一个函数。正常情况下,C51程序中的函数不能被递归地调用,这是由于函数的参数和局部变量都被保存在固定的地址,在递归调用时操作了相同存储位置,导致数据被覆盖。使用reentrant声明函数为可递归调用的可重入函数:int calc (char i,原创 2013-12-02 20:56:06 · 5484 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十六:sfr16
sfr16定义一个16位的特殊功能寄存器:sfr16 name = address; name 16位特殊功能寄存器名称 address 16位特殊功能寄存器地址一些8051系列产品拥有16位的特殊功能寄存器,比如8052使用地址0XCC、0XCD表示定时/计数器2的低字节、高字节。C51编译器提供sfr16数据原创 2013-12-02 21:23:44 · 3225 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十八:using
在8051系列单片机中,内部ram的前32个字节被分为4组,每组8个寄存器。每组的8个寄存器名字都为R0-R7。通过设置PSW寄存器的两个位,可以选择使用4组寄存器中的哪一组。寄存器组在处理中断或者使用实时操作系统时非常有用,可以在进入中断或者切换任务时使用不同寄存器组,而不用把8个寄存器的内容保存到堆栈。在退出中断或返回原任务时,只需切换回原来的寄存器组即可。指定一个函数使用的寄存器组:原创 2013-12-02 22:16:34 · 2949 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十七: sbit
sbit用来定义一个特殊功能寄存器的某一位。sbit name = sfr-name ^ bit-position;sbit name = sfr-address ^ bit-position;sbit name = sbit-address; name 特殊功能寄存器某一位的名称 sfr-name 已定义的特殊功能寄存器名称原创 2013-12-02 21:54:35 · 4066 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之十二: _priority_ 以及 _task_
Keil 51编译器支持 RTX51 Full 和 RTX51 Tiny 实时多任务操作系统,并为其提供了_task_关键词以及_priority_关键词。_task_关键词指示一个函数为实时任务。_priority_关键词指示任务优先级。示例:void func (void) _task_ num _priority_ prinum为任务ID,在RTX51 Full中取原创 2013-11-29 21:44:05 · 1976 阅读 · 0 评论 -
Keil C51 之LST文件
Keil C51编译器在编译程序时,会生成一个扩展名为LST的列表文件,也被称为listing file。 这个文件包含了有关编译过程的丰富信息,该文件由多个段组成,其中Symbol Listing 和 Module Information两个段对于用户分析调试程序尤其有用,下面按照各个段在 listing file中出现的先后顺序加以说明:原创 2014-01-11 12:30:21 · 9782 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之七: data
8051单片机内部256字节RAM,低128字节既可直接寻址,又可间接寻址,高128字节RAM只能间接寻址(直接寻址方式下,高128字节被映射到SFR特殊功能寄存器)。内部RAM中包含16字节可位寻址区域,该区域起始地址为20H。内部RAM存储区被分为三种不同的存储区类型:data,idata,bdata。1)data指低128字节,以直接寻址方式访问存在该区域的变量。2)idata指原创 2013-11-29 20:54:07 · 1875 阅读 · 0 评论 -
Keil C51内存模型
Keil C51编译器提供三种类型的内存模型:small,compact,large。内存模型决定了函数参数、自动变量以及未显式声明存储类型情况下的默认存储类型。三种内存模型的默认存储区域:内存模型参数 &自动变量全局变量常量指针定义指针所占内存SMALLdatadatadata*3 字节COM原创 2013-11-29 19:40:55 · 1770 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展
为了支持8051系列单片机特性,Keil Cx51编译器为C语言扩展了众多关键词:_at_ far sbitalien idata sfrbdata interrupt sfr16bit large smallcode pdata taskcompact priority usingdata reentrant xdata用户可以使用NO原创 2013-11-28 22:02:04 · 1970 阅读 · 0 评论 -
51单片机(AT89C52)控制蜂鸣器
#include#define uchar unsigned char#define uint unsigned intsbit beep=P0^0;void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=111;y>0;y--);}void main(){ while(1) { beep原创 2012-07-04 17:21:55 · 11198 阅读 · 0 评论 -
综合实例:51单片机(AT89C52)万年历(温度闹钟年月日时分秒星期)
功能说明:LCD1602液晶显示年、月、日、时、分、秒、星期、温度,三个按键控制时间日期调整以及闹钟设定。 三个按键:1、“校时”键,每次按下分别对应调整秒、调整分钟、调整小时、调整星期、调整日、调整月份、调整年份、调整闹钟分钟、调整闹钟小时、退出校时模式;2、“增加/开闹钟功能”键,校时模式下按下此键则数值加一,非校时模式下按下此键则显示出闹钟时间并打开闹钟功能(屏幕显示字母原创 2012-07-02 15:17:59 · 15352 阅读 · 15 评论 -
51单片机(AT89C52)DS1302时钟芯片程序
原创 2012-06-29 11:00:15 · 3369 阅读 · 1 评论 -
51单片机(AT89C52)D/A转换
#include#define uchar unsigned char#define uint unsigned intsbit cs=P3^0;sbit wr=P3^1;void delayms(uint x){ uint y,z; for(y=x;y>0;y--) for(z=110;z>0;z--);}void main(){ uchar原创 2012-07-02 14:22:49 · 2959 阅读 · 1 评论 -
51单片机(AT89C52)外部中断程序
#include#define uchar unsigned char#define uint unsigned int#define DELAY 1000void delay(uint z) //1ms{ uint x,y; for(x=z;x>0;x--) for(y=111;y>0;y--);}void main(){ uchar i,dt;原创 2012-07-02 15:00:57 · 12631 阅读 · 0 评论 -
51单片机(AT89C52)A/D转换
#include#define uchar unsigned char#define uint unsigned int#define PORT P3#define dula_h P2|=0x40#define dula_l P2&=0xbf#define wela_h P2|=0x80#define wela_l P2&=0x7fsbit cs=P2^0;sb原创 2012-07-02 14:15:05 · 5244 阅读 · 1 评论 -
51单片机(AT89C52)控制双路继电器
#include#define uchar unsigned char#define uint unsigned int#define DELAY 500sbit relay=P2^0;void delay(uint z) //1ms{ uint x,y; for(x=z;x>0;x--) for(y=111;y>0;y--);}void main()原创 2012-07-02 14:54:25 · 10597 阅读 · 0 评论 -
51单片机(AT89C52)串口收发程序
#include#define uchar unsigned charuchar rtemp,sflag;void SerialInit() //11.0592M晶振,波特率9600{ TMOD=0x20; //设置定时器1工作方式为方式2 TH1=0xfd; TL1=0xfd; TR1=1; //启动定时器1 SM0=0; //串口方式1 SM1=原创 2012-07-02 14:37:36 · 13327 阅读 · 1 评论 -
51单片机(AT89C52)定时器
#include#define uchar unsigned char#define uint unsigned intuchar i,temp;void init(){ TMOD=0x01; TH0=(65536-46080)/256; TL0=(65536-46080)%256; ET0=1; EA=1; TR0=1;}void main()原创 2012-07-02 14:47:37 · 4164 阅读 · 0 评论 -
51单片机(AT89C52)矩阵键盘检测程序
矩阵键盘检测思路:行线设为输出、列线设为输入获得列码,行线设为输入、列线设为输出获得行码,由行列码确定键值。本程序可改进的地方:按键状态机中,将等待按键释放语句移到第三个状态中,可进一步提高按键扫描程序效率。#include#define uchar unsigned char#define uint unsigned intsbit dula=P3^0;sbit wela原创 2012-07-22 12:32:18 · 14102 阅读 · 2 评论 -
51单片机(AT89C52)一键多功能(短按、长按)
短按(按下持续时间小于3s)一次数码管显示加1,同时流水灯计数加1。长按(按下持续时间大于3s)时,数码管显示每500ms加1,同时流水灯每500ms计数加1。#includetypedef unsigned char uchar;typedef unsigned int uint;#define NOKEY 0#define KEYDOWN 1#define KEYU原创 2012-07-28 16:08:17 · 9986 阅读 · 3 评论 -
51单片机STC89C52 红外解码
/**********************************For:Car mp3 IrControler**Author:YWZ**Date:2013/10/16********************************/#include "reg52.h"typedef unsigned char U8; typedef unsigned int原创 2013-11-12 22:20:15 · 2499 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之三: bdata
使用bdata定义的变量即可字寻址,也可比特位寻址。Keil C51编译器把使用bdata定义的变量放置在8051内部RAM可位寻址区。bdata定义的变量必须为全局变量,不能在任一函数内部定义bdata类型的变量。bdata关键词使用方法:int bdata x1; /* */char bdata bary [4]; /* Bit-addressab原创 2013-11-28 23:09:51 · 7045 阅读 · 1 评论 -
Keil C51对C语言的关键词扩展之一: _at_
_at_关键词用于在定义变量时指定变量所在地址。_at_关键词使用示例如下:struct link { struct link idata *next; char code *test; };struct link list idata _at_ 0x40; /* 定义位于内部RAM低128字节区0x40地址处的 结构体 */char xdata text原创 2013-11-28 22:17:46 · 10652 阅读 · 0 评论 -
Keil C51对C语言的关键词扩展之二: alien
alien关键词主要是为了C51编译器与PL/M-51编译器兼容。在C51编译器中调用PL/M-51函数,须使用alien声明该函数,如下:extern alien char plm_func (int, char);char c_func (void) { int i; char c; for (i = 0; i < 100; i++) { c = plm原创 2013-11-28 22:35:32 · 2636 阅读 · 1 评论 -
51单片机启动代码:STARTUP.A51
通过Keil编译器建立工程时,Keil会提示是否添加STARTUP.A51文件到工程,该文件即为51单片机启动代码。51单片机复位后马上执行STARTUP.A51文件中的启动代码,根据启动代码中的设置依次执行以下操作:内部RAM清零外部RAM清零清零分页的外部RAM初始化SMALL内存模型的可重入模拟堆栈及其堆栈指针初始化LARGE内存模型的可重入模拟堆栈及其堆栈指针初始化COMP原创 2014-01-18 23:40:06 · 9298 阅读 · 1 评论