51单片机
文章平均质量分 64
_NJZY_
这个作者很懒,什么都没留下…
展开
-
I2C组件
#include #include #define i2cDelay() {_nop_(); _nop_(); _nop_(); _nop_();}sbit i2c_scl = P3^7;sbit i2c_sda = P3^6;void i2cStart() { i2c_sda = 1; i2c_scl = 1; i2cDelay(); i2c_sda原创 2015-02-16 17:54:44 · 508 阅读 · 0 评论 -
STC12系列单片机的AUXR辅助寄存器
AUXR.0:S1BRS,如果为1那么串口1的波特率发生器为独立波特率发生器,否则为定时器1AUXR.1:EXTRAM,为1则可以使用内部扩展RAMAUXR.2:BRTx12,为1则独立波特率发生器不分频,否则12分频。AUXR.3:S2SMOD,为1串口2波特率加倍,否则不加倍AUXR.4:BRTR,为1则允许独立波特率允许,否则不允许。AUXR.5:UART_M0x6,为1则串口模式转载 2015-04-04 19:25:09 · 23733 阅读 · 1 评论 -
51单片机寄存器
【51单片机寄存器功能一览表】 21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。 在51单片机内部有一个CPU用来运算、控制,有转载 2015-04-04 19:56:55 · 1946 阅读 · 0 评论 -
关于uint8_t整数溢出的错误
在单片机编程中,在中断服务函数里,计数变量很容易超出uint8_t的上限255,需要检查。在遇到uint8_t变量自乘或除法运算时,也很容易出现溢出,要特别注意。原创 2015-04-04 19:00:30 · 4118 阅读 · 0 评论 -
51单片机常用的特殊功能寄存器
PSW(Program Status Word)中断:IP(Interrupt Priority)IE(Interrupt Enable)串口:SBUF(Serial Buffer)SCON(Serial Control)定时器:TMOD(Timer Mode)TCON(Timer Control)电源:PCON(Powe原创 2015-04-04 20:10:33 · 1368 阅读 · 0 评论 -
STC15系列单片机-环境监控设备
/** * 产品名称:环境监控设备 * 产品定义: * (1)单片机每隔1秒通过DS18B20温度传感器采集一次温度。 * (2)单片机每隔200毫秒采集一次DS1302时钟芯片的时间。 * (3)通过数码管实时显示时间,格式为日-小时-分-秒。 * (4)通过串口向上位机发送格式提示字符串,设置温度上限和下限; * 格式为xx-yy * (5)可以通过串口设置温度上限和下限。原创 2015-04-05 21:36:18 · 1297 阅读 · 0 评论 -
51单片机 外部中断实验
51单片机一共有两个外部中断源。IE0的置位与否与IT0有关,当IT0=1时,下降沿触发也就是说当INT0由高到低时IE0将被硬件置1,执行完中断,遇到RETI自动清0,但不影响INT0的状态。当IT0=0时,当CPU检测到连续两个周期的INT0低电平时IE0置1,中断结束时遇到RETI自动将IE0清0,之后如果INT0仍然为低电平,且长度超过两个机器周期,那么将重新将IE原创 2015-04-06 17:34:32 · 18963 阅读 · 1 评论 -
STC15系列单片机 超声波测距实验
main.c/** * 文件名称:超声波测距实验 * 实验目的:1.掌握超声波测距原理 * 实验原理:1.定时器0用于数码管的扫描、定时200ms用于采样距离; * 定时器1用于计时器,计算每次采样时从 * 发射声波到接收到声波的时间。距离除以2就为到 * 障碍物的实际距离。 */#include #include #inclu原创 2015-04-06 20:50:37 · 5983 阅读 · 2 评论 -
DS1302组件
DS1302.h#ifndef _DS1302_H#define _DS1302_Hsbit DS1302_CE = P1^7;sbit DS1302_SCLK = P3^5;sbit DS1302_IO = P3^4;typedef struct sTime { //日期时间结构体定义 uint16_t year; //年 uint8_t mon; //转载 2015-04-03 17:53:25 · 550 阅读 · 0 评论 -
DS18B20温度格式转换
#include #include /* DS18B20温度格式转换 */uint8_t tempIntPart[3];uint8_t tempDecPart[4];float convertToFloat(int16_t temperature) { float temp; temp = (float)temperature; temp /= 16.0f;原创 2015-03-25 14:00:35 · 5146 阅读 · 0 评论 -
将一个字节存储的2位BCD码解码
#include #include /* 将一个字节存储的2位BCD码解码成普通的二进制数 */uint8_t decode(uint8_t BCD) { uint8_t geWei, shiWei; geWei = BCD & 0x0F; shiWei = BCD >> 4; return shiWei * 10 + geWei;}int main(原创 2015-03-24 22:53:10 · 2072 阅读 · 0 评论 -
EEPROM组件
/********************************************************************************* 文件名:eeprom.c* 描 述:EEPROM芯片24C02读写驱动模块***************************************************************************转载 2015-02-22 13:25:27 · 484 阅读 · 0 评论 -
LCD1602.c
#include #include "utilities.h"#define LCD1602_DB P0sbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_E = P1^5;void LCDWaitReady() { uchar state; LCD1602_DB = 0xFF; LCD16原创 2014-12-03 23:14:37 · 1245 阅读 · 0 评论 -
LCD1602组件
/** * 文件名:LCD1602.c * 描 述:1602字符液晶驱动模块 */#include #include "stdint.h"#include "LCD1602.h"#define LCD1602_DB P0sbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_E = P1^5;/* 等待液晶原创 2015-03-20 15:31:39 · 709 阅读 · 0 评论 -
关于C51中“大小端存储”问题的详解
1. Little-Endian(小端存储),即将低字节的数据存储于低地址中,Big-Endian(大端存储)反之。2. 小端存储称为Intel模式,大端存储称为Motorola模式。3. C51中LCALL指令将下一指令的执行地址压入堆栈中(堆栈地址由低向高增长),先存入低字节地址,再存入高字节地址,亦即使用“小端模式(Intel模式)”;除此之外,C51中的其它指令和数原创 2015-03-23 18:34:19 · 1586 阅读 · 0 评论 -
51单片机与递归的问题
在C51中,中断和非中断函数调用同一个函数报警就是RECURSIVE CALL TO FUNCTION。标准C语言是在堆栈中动态生成局部变量空间,所以可以递归的。51单片机太弱了,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。被中断和非中断函数调用的函数,如果在非中断状态运行,发生中断后,局部变量被破坏,中断结束后再执行就完全错误了,这个跟不能递归的原理是一转载 2015-03-30 16:51:43 · 2364 阅读 · 0 评论 -
keyBoard组件
#include #include "utilities.h"sbit KEY_OUT_3 = P2^0;sbit KEY_OUT_2 = P2^1;sbit KEY_OUT_1 = P2^2;sbit KEY_OUT_0 = P2^3;sbit KEY_IN_0 = P2^4;sbit KEY_IN_1 = P2^5;sbit KEY_IN_2 = P2^6;sbit KEY原创 2014-12-03 23:15:45 · 1016 阅读 · 0 评论 -
C51中的关键字data,idata,xdata,pdata,bdata
写在最前面的话:官方网站的解答是最可信的。英语不错的必看。http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm下面转载几篇中文的,仅供参考。data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前转载 2015-03-23 18:24:06 · 682 阅读 · 0 评论 -
CT107D开发板 keyBoard.c
#include "stc15f2k60s2.h"#include "stdint.h"sbit keyRow0 = P3^0;sbit keyRow1 = P3^1;sbit keyRow2 = P3^2;sbit keyRow3 = P3^3;//sbit keyCol0 = P3^7;//sbit keyCol1 = P3^6;sbit keyCol0 = P4^4;sb原创 2015-02-23 23:20:12 · 716 阅读 · 0 评论 -
UART串口模块
UART.h/** * 文件名:UART.h * 描 述:UART驱动模块 */#ifndef _UART_H_#define _UART_H_void configUART(uint16_t baud);void UART_ISR() interrupt 4;extern void UARTreceive();extern void UARTtransmit();原创 2015-03-30 13:12:05 · 778 阅读 · 0 评论 -
OneWire组件
OneWire.h#ifndef _ONEWIRE_H#define _ONEWIRE_Hsbit ONEWIRE_PIN = P1^4; //检查通信引脚是否正确!bit OneWire_reset();void OneWire_write(uint8_t dat);uint8_t OneWire_read();#define OneWire_skip() OneWir原创 2015-04-13 10:20:14 · 1770 阅读 · 0 评论 -
51单片机常用开发工具的一些说明
51单片机常用开发工具硬件工具:电烙铁、万用表、双踪示波器、逻辑分析仪软件工具:Keil:这个版本最好选择v4.72的,可以选择UTF-8的字符编码,这样就不容易出现乱码了。我之前用的v4.00版本的就没有这一功能。STC-ISP下载软件:这个最好选择最新版本的。Protel 99 SE或Altum Designer:这两个用于绘制电路原理图和PCB设计。Microso原创 2015-05-05 21:50:51 · 2038 阅读 · 0 评论 -
51单片机项目:多功能记录仪
main.h/** * 51单片机项目:多功能记录仪 * 文件名:main.h */#ifndef _MAIN_H#define _MAIN_Htypedef struct msg { uint8_t hour; //时 uint8_t minute; //分 uint8_t second; //秒 uint8_t tempIntPart; //温度 ui原创 2015-05-06 23:46:21 · 1149 阅读 · 0 评论 -
前后台系统的应用:改版的多功能记录仪
/** * 51单片机项目:多功能记录仪 * 文件名:main.h */#ifndef _MAIN_H#define _MAIN_Htypedef struct msg { uint8_t hour; //时 uint8_t minute; //分 uint8_t second; //秒 uint8_t tempIntPart; //温度 uint8_t hu原创 2015-05-12 23:37:32 · 607 阅读 · 0 评论 -
51单片机项目 模拟智能传送装置
/** * 项目名:模拟智能传送装置 * 文件名:main.h */#ifndef _MAIN_H#define _MAIN_Htypedef enum WorkingState { STOP, START, TRANSFER} eWorkingState_t;sbit RELAY = P0^4;sbit BUZZER = P0^6;void samplingPCF原创 2015-05-22 13:17:43 · 1871 阅读 · 1 评论 -
51单片机 超声波测距组件
/** * 超声波测距组件 * 文件名:ultrasonic.h */#ifndef _ULTRASONIC_H#define _ULTRASONIC_H#define somenop(); { \ _nop_();_nop_();_nop_();_nop_();_nop_(); \ _nop_();_nop_();_nop_();_nop_();_nop_();原创 2015-05-17 20:02:31 · 1314 阅读 · 0 评论 -
electromagneticDev组件
#ifndef _ELECTROMAGNETIC_DEV_H#define _ELECTROMAGNETIC_DEV_Hextern uint8_t elecMagState;void relay_on();void relay_off();void buzzer_toggle();#endif#include #include "stdint.h"#原创 2015-05-24 17:13:55 · 450 阅读 · 0 评论 -
51单片机项目 门禁系统
/** * 项目名:门禁系统 * 文件名:main.h */#ifndef _MAIN_H#define _MAIN_Hsbit RELAY_PIN = P0^4;sbit BUZZER_PIN = P0^6;void sys_init();void samplingDS1302();void samplingUlt();void openRelay();void c原创 2015-05-19 22:25:30 · 3395 阅读 · 0 评论 -
stc15系列单片机 timer组件
/** * 文件名:timer.h */#ifndef _TIMER_H#define _TIMER_H#define SYS_MCLK 11059200 //系统主时钟#define FOSC 11059200 //晶振频率#define USING_T0#define USING_STC15_T2#ifdef USING_T0 extern uint8_原创 2015-05-24 17:35:33 · 3903 阅读 · 0 评论 -
Keil C51中printf()函数的说明
在C51中,使用printf()函数进行格式化输出时,格式控制符与ANSI C有所不同。在格式控制字符中,b表示byte以十进制输出uint8_t : %bu以十进制输出int8_t : %bd#include void tst_printf (void) { char a = 1; int b = 12365; long c = 0x7FFFFFFF原创 2015-05-13 13:20:15 · 5874 阅读 · 0 评论 -
事件驱动机制在单片机软件中的应用
一、Windows的事件驱动机制 在Windows系统中,程序的设计围绕事件驱动来进行。当对象有相关的事件发生时(如按下鼠标键),对象产生一条特定的标识事件发生的消息,消息被送入 消息队列,或不进入队列而直接发送给处理对象,主程序负责组织消息队列,将消息发送给相应的处理程序,使相应的处理程序执行相应的动作,做完相应的处理后 将控制权交还给主程序。在这种机制中,对象的请求仅仅是向队列中转载 2015-05-12 20:19:43 · 4256 阅读 · 1 评论 -
前后台系统
早期的嵌入式系统中没有操作系统的概念,程序员编写嵌入式程序通常直接面对裸机及裸设备。在这种情况下,通常把嵌入式程序分成两部分,即前台程序和后台程序。 应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。前台程序通过中断来处理事件;后台程序则掌管整个嵌入式系统软、硬件资源的分配、管理以及任务的调度,是一个系统管理调度程序。这就是通常所说的前后台系统。一般情转载 2015-05-12 20:03:39 · 1180 阅读 · 0 评论 -
PCF8591组件(A/D和D/A转换)
PCF8591.h#ifndef _PCF8591_H#define _PCF8591_Huint8_t getADCvalue(uint8_t chn);void uint8_tToArray(uint8_t * arry, uint8_t val);#endifPCF8591.c#include //检查是否有误#include "stdint.h"原创 2015-04-08 15:21:16 · 3828 阅读 · 0 评论 -
PCF8591 A/D转换实验-测量电位器的电平
测量电位器Rb2的电平,并显示在数码管上。main.c#include #include "stdint.h"#include "PCF8591.h"#include "digitalTube.h"#include "timer.h"volatile bit flag300ms = 0;void main() { uint8_t value; uint8_t arry[原创 2015-04-08 15:23:44 · 2461 阅读 · 1 评论 -
单片机项目 温度记录仪
main.c/** * 工程名称:温度记录仪 * Mode 0: 温度采集间隔选择模式,用以确定温度采集间隔 * Mode 1: 采集并显示实时时间,采集温度并缓存 * Mode 2: 查看采集到的10个温度样本 * * */#include #include "stdint.h"#include "timer.h"#include "digitalTu原创 2015-04-13 19:32:05 · 1215 阅读 · 1 评论 -
可变参数列表的宏和<stdarg.h>实现函数的可变参数列表
标准头文件中的printf()函数很诡异,它有一个可变的参数列表。下面是自己实现的printf()函数。#include /* printf, vprintf*/#include /* va_list, va_start, va_copy, va_arg, va_end */#include void myprintf(const char * format,原创 2015-04-07 13:39:54 · 529 阅读 · 0 评论 -
51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
#include typedef unsigned char uchar;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;code uchar image[5][8] = { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0原创 2014-12-03 22:36:01 · 1495 阅读 · 1 评论 -
基于OneWire组件的DS18B20组件
DS18B20.h#ifndef _DS18B20_H#define _DS18B20_Hbit DS18B20_start();bit DS18B20_getTemperature(int16_t * temp);uint8_t getIntPart(int16_t temp);uint8_t getDecPart(int16_t temp);bit getSign(int1原创 2015-04-13 10:31:02 · 645 阅读 · 0 评论 -
I2C组件(新)
/** * 文件名:I2C.c * 描 述:I2C总线驱动模块(新) * 备 注:基于IO口模拟实现,总线时序延时等皆由软件方式实现 * 时钟信号SCL的产生和延时很重要 */#include #include #include "stdint.h"#include "I2C.h"/* 产生总线起始信号 */void I2Cstart() { I原创 2015-04-10 13:28:14 · 483 阅读 · 0 评论 -
STC15系列单片机IAP15F2K61S2 矩阵键盘实验
/******************************************************************************* * 文件名称:矩阵键盘实验* 实验目的:1.掌握矩阵键盘扫描的基本原理* 2.掌握按键扫描及消除抖动的基本原理* 程序说明:1.使用程序前,将跳线J2调整为KBD模式* 2.按转载 2015-02-18 18:07:25 · 7210 阅读 · 1 评论