STC12C5A60S2红外发射程序

合集下载

STC12C5A60S2 系列单片机器件手册 说明书

STC12C5A60S2 系列单片机器件手册 说明书

Tel: 0755-********Fax: 0755-********创始人/研发总监:姚永平(139********)宏晶STC 官方网站: 1STC12C5A60S2系列 1T 8051 单片机中文指南全球最大的8051单片机设计公司S T C M C U L i m i t e d .临时技术支持:139********授权代理:南通国芯微电子有限公司总机:0513-5501 2928 / 2929 / 2966传真:0513-5501 2969 / 2956 / 2947宏晶STC 单片机官方网站: Update date: 2011/3/19---高速,高可靠---低功耗,超低价---超���超���� ---�抗静电,�抗干扰---1个时钟/机器周期8051STC12C5A60S2系列单片机器件手册STC12C5A08S2, STC12C5A08ADSTC12C5A16S2, STC12C5A16ADSTC12C5A20S2, STC12C5A20ADSTC12C5A32S2, STC12C5A32ADSTC12C5A40S2, STC12C5A40ADSTC12C5A48S2, STC12C5A48ADSTC12C5A52S2, STC12C5A52ADSTC12C5A56S2, STC12C5A56ADSTC12C5A60S2, STC12C5A60AD STC12C5A62S2, STC12C5A62AD全部中国大陆本土独立自主知识产权,技术处于全球领先水平,请全体中国人民支持,您的支持是中国大陆本土企业统一全球市场的有力保证.目录第1章STC12C5A60S2系列单片机总体介绍 (8)1.1 STC12C5A60S2系列单片机简介 (8)1.2 STC12C5A60S2系列单片机的内部结构 (10)1.3 STC12C5A60S2系列单片机管脚图 (11)1.4 STC12C5A60S2系列单片机选型一览表 (13)1.5 STC12C5A60S2系列单片机最小应用系统 (15)1.6 STC12C5A60S2系列在系统可编程(ISP)典型应用线路图 (17)1.7 STC12C5A60S2系列管脚说明 (19)1.8 STC12C5A60S2系列单片机封装尺寸图 (22)1.9 STC12C5A60S2系列单片机命名规则 (27)1.10 每个单片机具有全球唯一身份证号码(ID号) (28)1.11 如何从传统8051单片机过渡到STC12C5A60S2系列单片机 (31)第2章时钟,省电模式及复位 (35)2.1 STC12C5A60S2系列单片机的时钟 (35)2.1.1 STC12C5A60S2系列单片机内部/外部工作时钟可选 (35)2.1.2 时钟分频及分频寄存器 (36)2.1.3 如何知道单片机内部R/C振荡频率(内部时钟频率) (37)2.1.4 可编程时钟输出 (40)2.2 STC12C5A60S2系列单片机的省电模式 (45)2.2.1 低速模式 (47)2.2.2 空闲模式 (48)2.2.3 掉电模式/停机模式 (48)2.3 复位 (54)2.3.1 外部RST引脚复位(第一复位功能脚) (54)2.3.2 外部低压检测复位(高可靠复位,新增第二复位功能脚RST2复位) (54)2.3.3 外部低压检测若不作第二复位功能时,可作外部低压检测中断 (56)2.3.4 软件复位 (60)2.3.5 上电复位/掉电复位 (60)2.3.6 MAX810专用复位电路 (61)2.3.7 看门狗(WDT)复位 (61)2.3.8 冷启动复位和热启动复位 (65)第3章片内存储器和特殊功能寄存器(SFRs) (66)3.1 程序存储器 (66)3.2 数据存储器(SRAM) (67)3.2.1 内部RAM (67)3.2.2 内部扩展RAM (69)3.2.3 外部扩展的64KB数据存储器(片外RAM) (77)3.3 特殊功能寄存器(SFRs) (80)第4章.STC12C5A60S2系列单片机的I/O口结构 (87)4.1 I/O口各种不同的工作模式及配置介绍 (87)4.2 STC12C5A60S2系列单片机P4/P5口的使用 (92)4.3 I/O口各种不同的工作模式结构框图 (94)4.3.1 准双向口输出配置 (94)4.3.2 强推挽输出配置 (95)4.3.3 仅为输入(高阻)配置 (95)4.3.4 开漏输出配置(若外�上拉电阻,也可读) (95)4.4 一种典型三极管控制电路 (97)4.5 典型发光二极管控制电路 (97)4.6 混合电压供电系统3V/5V器件I/O口互连 (97)4.7 如何让I/O口上电复位时为低电平 (98)4.8 PWM输出时I/O口的状态 (99)4.9 I/O口直接驱动LED数码管应用线路图 (100)4.10 I/O口直接驱动LCD应用线路图 (101)4.11 A/D做按键扫描应用线路图 (102)第5章.指令系统 (103)5.1 寻址方式 (103)5.1.1 立即寻址 (103)5.1.2 直接寻址 (103)5.1.3 间接寻址 (103)5.1.4 寄存器寻址 (104)5.1.5 相对寻址 (104)5.1.6 变址寻址 (104)5.1.7 位寻址 (104)5.2 指令系统分类总结 (105)5.3 传统8051单片机的指令定义 (110)第6章.中断系统 (147)6.1 中断结构 (149)6.2 中断寄存器 (151)6.3 中断优先级 (159)6.4 中断处理 (160)6.5 外部中断 (161)6.6 中断测试程序(C程序及汇编程序) (162)6.6.1 外部中断0(INT0)的测试程序(C程序及汇编程序) (162)6.6.2 外部中断1(INT1)的测试程序(C程序及汇编程序) (166)6.6.3 P3.4/T0/INT下降沿中断(可用于唤醒掉电模式)的测试程序 (170)6.6.4 P3.5/T1/INT下降沿中断(可用于唤醒掉电模式)的测试程序 (172)6.6.5 P3.0/RxD/INT下降沿中断(可用于唤醒掉电模式)的测试程序 (174)—— C程序及汇编程序 (174)6.6.6 低压检测LVD中断(可用于唤醒掉电模式)的测试程序 (177)6.6.7 PCA模块中断(可用于唤醒掉电模式)的测试程序 (180)第7章.定时器/计数器 (184)7.1 定时器/计数器的相关寄存器 (184)7.2 定时器/计数器0工作模式(与传统8051单片机兼容) (189)7.2.1 模式0(13位定时器/计数器) (189)7.2.2 模式1(16位定时器/计数器)及测试程序 (190)7.2.3 模式2(8位自动重装模式) (194)7.2.4 模式3(两个8位计数器) (197)7.3 定时器/计数器1工作模式(与传统8051单片机兼容) (198)7.3.1 模式0(13位定时器/计数器) (198)7.3.2 模式1(16位定时器/计数器) (199)7.3.3 模式2(8位自动重装模式) (203)7.4 可编程时钟输出及测试程序(C程序和汇编程序) (206)7.4.1 定时器0的可编程时钟输出的测试程序 (209)7.4.2 定时器1的可编程时钟输出的测试程序 (211)7.4.3 独立波特率发生器的可编程时钟输出的测试程序 (213)7.5 古老Intel 8051单片机定时器0/1的应用举例 (215)7.6 如何将定时器T0/T1的速度提高12倍 (222)第8章.串行口通信 (223)8.1 串行口1的相关寄存器 (223)8.2 串行口1工作模式 (229)8.2.1 串行口1工作模式0:同步移位寄存器 (229)8.2.2 串行口1工作模式1:8位UART,波特率可变 (231)8.2.3 串行口1工作模式2:9位UART,波特率固定 (233)8.2.4 串行口1工作模式3:9位UART,波特率可变 (235)8.3 串行通信中波特率的设置 (237)8.4 串行口1的测试程序 (242)8.5 串行口2的相关寄存器 (248)8.6 串行口2工作模式 (254)8.7 串行口2的测试程序 (256)8.8 双机通信 (262)8.9 多机通信 (273)第9章.STC12C5A60S2系列单片机的A/D转换器 (279)9.1 A/D转换器的结构 (279)9.2 与A/D转换相关的寄存器 (281)9.3 A/D转换典型应用线路 (286)9.4 A/D做按键扫描应用线路图 (287)9.5 A/D转换模块的参考电压源 (288)9.6 A/D转换测试程序(C程序和汇编程序) (289)9.6.1 A/D转换测试程序(ADC中断方式) (289)9.6.2 A/D转换测试程序(ADC查询方式) (295)第10章.STC12C5A60S2系列单片机PCA/PWM应用 (301)10.1 与PCA/PWM应用有关的特殊功能寄存器 (301)10.2 PCA/PWM模块的结构 (307)10.3 PCA模块的工作模式 (309)10.3.1 捕获模式 (309)10.3.2 16位软件定时器模式 (310)10.3.3 高速输出模式 (311)10.3.4 脉宽调节模式(PWM) (312)10.4 用PCA功能扩展外部中断的示例程序(C程序和汇编程序) (314)10.5 用PCA功能实现定时器的示例程序(C程序和汇编程序) (318)10.6 PCA输出高速脉冲的示例程序(C程序和汇编程序) (322)10.7 PCA输出PWM的示例程序(C程序和汇编程序) (326)10.8 利用PWM实现D/A功能的典型应用线路图 (330)第11章.同步串行外围接口(SPI接口) (331)11.1 与SPI功能模块相关的特殊功能寄存器 (331)11.2 SPI接口的结构 (334)11.3 SPI接口的数据通信 (335)11.3.1 SPI接口的数据通信方式 (336)11.3.2 对SPI进行配置 (338)11.3.3 作为主机/从机时的额外注意事项 (339)11.3.4 通过SS改变模式 (340)11.3.5 写冲突 (340)11.3.6 数据模式 (341)11.4 适用单主单从系统的SPI功能测试程序 (343)11.4.1 中断方式 (343)11.4.2 查询方式 (349)11.5 适用互为主从系统的SPI功能测试程序 (355)11.5.1 中断方式 (355)11.5.2 查询方式 (361)第12章.STC12C5A60S2系列单片机EEPROM的应用 (367)12.1 IAP及EEPROM新增特殊功能寄存器介绍 (367)12.2 STC12C5A60S2系列单片机EEPROM空间大小及地址 (371)12.3 IAP及EEPROM汇编简介 (373)12.4 EEPROM测试程序 (377)第13章.STC12系列单片机开发/编程工具说明 (385)13.1 在系统可编程(ISP)原理,官方演示工具使用说明 (385)13.1.1 在系统可编程(ISP)原理使用说明 (385)13.1.2 STC12C5A60S2系列在系统可编程(ISP)典型应用线路图 (386)13.1.3 电脑端的ISP控制软件界面使用说明 (388)13.1.4 宏晶科技的ISP下载编程工具硬件使用说明 (390)13.1.5 若无RS-232转换器,如何用宏晶的ISP下载板做RS-232通信转换 (391)13.2 编译器/汇编器,编程器,仿真器 (392)13.3 自定义下载演示程序(实现不停电下载) (394)7STC12C5A60S2系列 1T 8051 单片机中文指南全球最大的8051单片机设计公司S T C M C U L i m i t e d .临时技术支持:139********授权代理:南通国芯微电子有限公司总机:0513-5501 2928 / 2929 / 2966传真:0513-5501 2969 / 2956 / 2947附录A :汇编语言编程...................................398附录B :C 语言编程......................................420附录C :STC12C5A60S2系列单片机电气特性...............430附录D :内部常规256字节RAM 间接寻址测试程序...........432附录E :用串口扩展I/O 接口..............................434附录F :利用STC 单片机普通I/O 驱动LCD 显示..............437附录G :一个I/O 口驱动发光二极管并扫描按键..............444附录H :如何利用Keil C 软件减少代码长度.................445附录I :STC12系列单片机取代传统8051注意事项............446附录J :如何采购和授权分销机构.........................450J.1 如何采购 ................................................450J.2 授权分销机构 ............................................451附录K :每日更新内容的备忘录...........................453附录L :以下是各系列的选型指南. (454)L.1 STC15F828EACS 系列选型指南(2011年5月开始送样) ..........454L.2 STC15F204EA 系列选型指南 ...............................454L.3 STC12C5A60S2系列选型指南 ..............................454L.4 STC11/10xx 系列选型指南 .................................454L.5 STC12C5201AD 系列选型指南 ..............................454L.6 STC12C5620AD 系列选型指南 ..............................454L.7 STC12C5410AD 系列选型指南 ..............................454L.8 STC12C2052AD 系列选型指南 ..............................454L.9 STC89C51/STC90C51系列选型指南 . (454)8STC12C5A60S2系列 1T 8051 单片机中文指南全球最大的8051单片机设计公司临时技术支持:139********S T C M C U L i mi t e d .授权代理:南通国芯微电子有限公司总机:0513-5501 2928 / 2929 / 2966传真:0513-5501 2969 / 2956 / 2947第1章 STC12C5A60S2系列单片机总体介绍1.1.STC12C5A60S2系列单片机简介STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超�抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12 倍。

STC12C5A60S2教程

STC12C5A60S2教程

特殊单元
0003H 外部中断0中断服务程序的入口地址 000BH 定时/计数器0中断服务程序的入口地址 0013H 外部中断1中断服务程序的入口地址 001BH 定时/计数器1中断服务程序的入口地址 0023H 串行通信口1中断服务程序的入口地址 002BH ADC中断服务程序的入口地址 0033H 低电压检测中断服务程序的入口地址 003BH PCA中断服务程序的入口地址 0043H 串行通信口2中断服务程序的入口地址 004BH SPI中断服务程序的入口地址 读取程序存储器中保存的表格常数等内容时,使用MOVC指令。
0592mhz电容c1c2的典型值是47pfxtal1gnd22stc12c5a60s222stc12c5a60s2单片机的结构单片机的结构221stc12c5a60s2221stc12c5a60s2单片机的内部结构单片机的内部结构ram地址寄存器ram电源监控上电复位上电复位掉电复位可配置io口p0p4可配置io口p5程序flash程序地址寄存器缓冲器堆栈指针pc增量器pcpcb寄存器acctmp2tmp11k字节eepomrstale定时和控制逻辑片内rc振荡器dptr硬件看门狗wdt8通道高速adspi2路pwmpcaccu捕获比较单元指令寄存器可配置振荡器alupsw中断uart定时器逻辑xtal1xtal2cpu时钟222cpu以8位算术逻辑运算部件alu为核心加上通过内部总线而挂在其周围的暂存器tmp1tmp2累加器acc寄存器b程序状态标志寄存器psw以及布尔处理机就组成了整个运算器的逻辑电路
FFH 特殊功能寄存器区(80H~FFH) ~ [只能直接寻址访问] 80H 7FH 通用用户RAM和堆栈区(30H~7FH) ~ 30H [可直接或间接字节寻址] 2FH 位寻址区(16字节,共128位) ~ 也可以字节寻址 20H 1FH~ 18H 3区(R7~R0) 2区(R7~R0) 17H~ 10H 4个工作寄存器区 也可做RAM单元使用 0FH~ 08H 1区(R7~R0) 07H~ 00H 0区(R7~R0) 80H~ FFH [只能间接寻址访问 ]

STC12c5a60s2官方手册AD程序(中文注释)

STC12c5a60s2官方手册AD程序(中文注释)
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC的高8位结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC的低2位结果寄存器
sfr P1ASF = 0x9D; //P1辅助功能控制寄存器
/*ADC操作定义常量*/
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
void InitUart();
void SendData(BYTE dat); void Delay(WORD n);
}
/*----------------------------
Uart初始化
----------------------------*/
void InitUart()
{
SCON = 0x5a; //8位数据,无校验位
TMOD = 0x20; //T1为8位自动重载
void InitADC( )
{
P1ASF = 0xff; //设置所有P1为模拟输入端口
ADC_RES = 0; //清除先前的结果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC 延迟启动和启动/转换的电源
while (1);
}
/*----------------------------
ADC函数中断服务例程

简单好用的stc12c5a串口2发送程序!

简单好用的stc12c5a串口2发送程序!

//功能:stc12c5a串口2发送程序,发送0--9,晶振频率11.0592MHz,串行口工作于方式1,波特率为9600#ifndef __STC12C5A60S2_H__#define __STC12C5A60S2_H__//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机内核特殊功能寄存器 C51 Core SFRs// 7 6 5 4 3 21 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OVF1 P 0000,0000//-----------------------------------sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 21 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PDIDL 0001,0000// 7 6 5 4 3 21 0 Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ -DPS 0000,0000/*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。

单片机STC12C5A60S2控制AT24C04的程序(C语言)

单片机STC12C5A60S2控制AT24C04的程序(C语言)
**************************************/
void Delay5ms()
{
WORD n = 2500;
while(n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/**************************************
起始信号
**************************************/
void AT24C04_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
SDA = 1; //产生上升沿
*******************************
发送应答信号
入口参数:ack(0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/

基于STC12CA60S2的简易红外语音传输系统

基于STC12CA60S2的简易红外语音传输系统

l n i t ( v o i d 1 { P 1 AS F I = 0 x 0 2 ; / / P 1 . 1口做为 A D转换通道
R E S = 0 ; 脯 A D转换结果寄存器 C O N T R = 0 x 8 1 ; / / 打开 A D转换器 电源 . 模拟通道选 P 1 . 1 d e l a ym s ( 1 ) ; , / 等待 A D C上电稳定
【 摘 要】 红外通信 以其成 本低 、 实现容 易的优点 , 在短距 离通信 中得 到广泛的应 用。本文探讨使 用 S T C 1 2 C A 6 0 S 2单片机 的内置 MD及
P WM功 能实现 红外语音通信 的一种 简易方 法。
【 关键词】 红外语音通信 ; s T c 1 2 c A 6 0 s 2 ; 信息传输 1 方案设计
v o i d ADC
_
S T C 1 2 C A 6 0 S 2 是 S T C生产 的单时钟/ 机器周 期 ( 1 T ) 的单片机 。 是 高速 、 低功耗 、 超 强抗干扰 的新 一代 8 0 5 1 单片机 . 指令代码完全 兼容 传统 8 0 5 1 , 但 速魔 陕 8 — 1 2 倍。内部集 成 M A X 8 1 0 专用复位 电路 . 2 路 8 位 P WM. 8 路高速 1 0 位A / D转换器。 2 . 2 发送端设计 S T C 1 2 C A 6 0 S 2 时钟 电路 、复位电路可 与传统 5 1 单片机 相同 . 通 过对模拟输入通道功能控制寄存器 P 1 A S F的设置 .采用 P 1 . 1 对应的 通道 1 做 为音频信号 的输入端 . 可将经前置处理好 的模拟 音频 信号从 此脚 引人。 实现音频信号 到数 字信号的转换 通过对工作模式 寄存器 C M O D设置, 采用系统时钟 2 分频做计数脉部源 .实现频率为 2 1 k H z 的P WM信号 . 脉冲宽度实时与采集 到的音 频数字信号成正 比例 对应 ( 仅用高 8 位 )用脉宽直接反 映音频信号的幅值从 P 1 . 3引脚 输出 . 将 P 1 . 3连接到红外 发送管进 行红外 发送 。 2 - 3 接收端设计 接收端直接使用一体化红外接收管结合功率放大 电路接扬声器。

STC12C5A60S2 双串口使用程序

STC12C5A60S2 双串口使用程序

STC12C5A60S2 双串口使用程序(已经验证成功)#include <stc12c5a60s2.h>#include "intrins.h"#define uchar unsigned char#define S2RI 0x01 // 串口2接收中断请求标志位#define S2TI 0x02 // 串口2发送中断请求标志位//================================================// 对于将P4.4、P4.5当做I/O口使用必须添加的定义||//================================================sfr p4sw=0xbb; // 需在主函数文件中做相应设置4、5、6为1(作为I/O口使用)/*sbit button1=P4^3;sbit button2=P4^4;sbit button3=P4^5;sbit button4=P4^6;*/页脚内容1uchar code temp1[]={" 白云:“我可是个名人”"};uchar code temp2[]={" 黑土:“啥名人啊,你就是个人名”"}; uchar code temp3[]={" 小崔:“诶,大叔大妈,你俩都冷静冷静”"}; uchar code temp4[]={" 观众:“哈哈哈哈”"};/*void delay_1ms(uchar ii) // 误差-0.018084490741us{unsigned char a,b;for(; ii>0; ii--)for( b = 18; b>0; b--)for( a = 152; a>0; a--);_nop_(); //if Keil,require use intrins.h}void delay1s(void) //误差-0.000000000125us{unsigned char a,b,c;for( c = 212; c>0; c--)页脚内容2for( b = 160; b>0; b--)for( a = 80; a>0; a--);_nop_(); //if Keil,require use intrins.h_nop_(); //if Keil,require use intrins.h}*///************************ 串口通信部分******************************uchar wj_uun = '!'; // 用于存放串口1接收的字符uchar wj_uun2 = '?'; // 用于存放串口2接收的字符void bt_uart_init() // 单片机双串口初始化{//SCON=0X50; // SM0=0 SM1=1 SM2=0 REN=1SM0 = 0; // 串口工作方式1:1位起始位,8位数据位,1位停止位允许串口接收SM1 = 1;REN = 1; // 允许串口接收页脚内容3//RI=1; // 接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行串口中断)TMOD = 0X20; // 定时器T1工作方式2TH1 = 0XFD; // 9600bit/s下的定时器初值TL1 = 0XFD;TR1 = 1; // 启动定时器T1EA = 1; // 开总中断ES = 1; // 开串行口中断S2CON = 0x50; // 串口2工作在方式1 10位异步收发S2SM0=0 S2SM1=1 S2REN=1允许接收BRT = 0XFD; // 9600bit/s下的独立波特率发生器初值AUXR = 0x10; // 辅助寄存器:0001 0000 ->BRTR=1:独立波特率发生器开始计数,S2SMOD=0:波特率不加倍,BRTx12=0:独立波特率每12个时钟计数一次IE2 = 0x01; // 开串口2中断0000 0001->ES2=1// AUXR1 = 0x10; // 0001 0000->S2_P4=1:UART2从P1口(RxD2:P1.2 TxD2:P1.3)切换到P4口(RxD2:P4.2 TxD2:P4.3) 否则默认都为P1口}/************** 串口1发送函数*****************/页脚内容4void s1_send_char(uchar dat) // 发送端(发送的是字符){SBUF = dat; // 将字符送入发送缓冲寄存器while(!TI); // TI为发送状态标志位,0:发送中1:发送结束TI = 0; // 手动清零标志位}void s1_send_string(uchar *pt) // 通过调用发送字符函数来发送字符数组{while(*pt != '\0'){s1_send_char(*pt++);}}/************** 串口2发送函数*****************/void s2_send_char(uchar dat2) // 发送端(发送的是字符){页脚内容5S2BUF = dat2; // 将字符送入串口2的发送缓冲寄存器while(!(S2CON&S2TI)); // 判断发送是否结束:S2CON.bit2 = 0:发送中1:发送结束S2CON &= ~S2TI; // 手动清零标志位,令S2CON.bit2 = 0}void s2_send_string(uchar *pt2) // 通过调用发送字符函数来发送字符数组{while(*pt2!='\0'){s2_send_char(*pt2++);}}/************** 串口1中断程序*****************/void bt_serial_1() i nterrupt 4 // 中断编号4为串行口1中断{if(RI) // 接收标志位,0:正在接收1:接收完毕(如果RI=1就一直执行中断){页脚内容6RI = 0; // 同样需要手动清零wj_uun = SBUF; // 将接收缓冲器接收的字符送入变量中}}/************** 串口2中断程序*****************/void bt_serial_2() interrupt 8 // 中断编号8为串行口2中断{if(S2CON&S2RI) // 接收标志位: S2CON.bit1 = 0:正在接收1:接收完毕(如果RI=1就一直执行中断){S2CON &= ~S2RI; // 同样需要手动清零,令S2CON.bit1 = 0wj_uun2 = S2BUF; // 将串口2接收到的字符送入变量中}}页脚内容7void main(void){bt_uart_init(); // 串口初始化p4sw = 0x70; // 0111 0000 对应的4、5、6脚设置成功通用I/O口while(1){/*if(wj_uun != '!') // 串口1接收{s1_send_char(wj_uun); // 串口1发送wj_uun = '!';}*/if(wj_uun2 != '?') // 串口2接收{s2_send_char(wj_uun2); // 串口2发送wj_uun2 = '?';}}页脚内容8}页脚内容9。

STC12C5A60S2单片机各个模块程序代码

STC12C5A60S2单片机各个模块程序代码

.//****************************************************************************////STC12C5A60S2 可编程时钟模块//////说明: STC12C5A60S2 单片机有三路可编程时钟输出CLKOUT0/T0/P3.4//CLKOUT1/T1/P3.5、CLKOUT2/P1.0////涉及寄存器: AUXR( 辅助寄存器 )、 WAKE_CLKO( 时钟与系统掉电唤醒控制寄存器 )//BRT( 独立波特率发生器定时器寄存器)////程序说明://本程序可选实现P3.4 输出 CLKOUT0时钟、P3.5输出CLKOUT1时钟//P1.0 输出 CLKOUT2时钟//////****************************************************************************//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT//如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT/* 条件编译独立波特率发生器时钟输出*///*********************************////CLKOUT2时钟初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许 P1.0 配置为独立波特率发生器的时钟输出//BRT 工作在 1T 模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT工作在 12T 模式下时输出频率 = Sysclk/12/(256-BRT)/2 AUXR= 0x14;//Bit4-BRTR允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT= 0xff;// 更改该寄存器的值可实现对输出的时钟频率进行分频}#else/* 条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03;//允许将 P3.4/T0 脚配置为定时器0 的时钟输出CLKOUT0//T0 工作在 1T 模式时的输出频率= SYSclk/(256-TH0)/2//T0 工作在 12T 模式时的输出频率= SYSclk/12/(256-TH0)/2//1T 指的是每 1 个时钟加1,是普通 C51 的 12 倍//12T 指的是每 12 个时钟加 1 与普通 C51 一样//允许将 P3.5/T1 脚配置为定时器 1 的时钟输出CLKOUT1,只能工作在定时器模式 2 下//T1 工作在 1T 模式时的输出频率 = SYSclk/(256-TH0)/2 //T1 工作在 12T 模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T 指的是每 1 个时钟加 1,是普通 C51 的 12 倍 //12T 指的是每 12 个时钟加 1 与普通 C51 一样AUXR= 0xc0;//T0 定时器速度是普通8051 的 12 倍 ,即工作在1T 模式下//T1 定时器速度是普通8051 的 12 倍 ,即工作在1T 模式下TMOD= 0x22;//定时器 0 工作模式为方式2,自动装载时间常数//定时器 1 工作模式为方式2,自动装载时间常数TH0= 0xff;// 更改该寄存器的值可实现对输出的时钟频率进行分频TL0= 0xff;TH1= 0xff;// 更改该寄存器的值可实现对输出的时钟频率进行分频TL1= 0xff;TR1= 1;TR0= 1;}#endif//**********************************////主程序////**********************************//void main(){CLKOUT_init();while(1);}//****************************************************************************////STC12C5A60S2 系统时钟模块//////说明:STC12C5A60S2单片机有两个时钟源,内部R/C 振荡时钟和外部晶体时钟//出厂标准配置是使用外部晶体或时钟//////涉及寄存器:CLK_DIV(时钟分频寄存器)//由该寄存器的Bit0-2 组合可实现对时钟源进行0、 2、 4、 8、16 //32、 64、 128 分频//////程序说明://对外部时钟进行分频得到Sysclk, 然后经过P1.0 的独立波特率//时钟输出功能Sysclk/2 输出时钟频率//****************************************************************************//#include <STC12C5A60S2.h>#include <intrins.h>#define Bus_clk 12//若要修改系统时钟直接在此处修改//12为12M的 sysclk//6为6M的 sysclk//3为3M的 sysclk//1500为 1.5M的 sysclk//750为750kHz的 sysclk//375为375kHz的 sysclk//187500为187.5kHz的 sysclk//93750为93.75kHz的 sysclk//*********************************************////系统时钟初始化////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04;// 配置 P1.0 口为频率输出AUXR= 0x14;// 允许波特率时钟工作// 工作模式为1TBRT= 0xff;#if( Bus_clk == 12 )CLK_DIV = 0x00;#elif( Bus_clk == 6 )CLK_DIV= 0x01;#elif( Bus_clk == 3 )CLK_DIV= 0x02;#elif( Bus_clk == 1500 )CLK_DIV= 0x03;#elif( Bus_clk == 750 )CLK_DIV= 0x04;#elif( Bus_clk == 375 )CLK_DIV= 0x05;#elif( Bus_clk == 187500 )CLK_DIV= 0x06;#elif( Bus_clk == 93750 )CLK_DIV= 0x07;#endif}//**********************************************////主程序////**********************************************//void main(){Sysclk_init();while(1);}//****************************************************************************////STC12C5A60S2系统省电模块//////说明:STC12C5A60S2 单片机有三种省电模式以降低功耗.空闲模式,低速模式//掉电模式//////涉及寄存器: PCON( 电源控制寄存器 )//Bit0 - IDL控制单片机进入 IDLE 空闲模式//Bit1 - PD控制单片机进入掉电模式//////程序说明:程序实现让单片机先工作一阵子(通过 P0^3 指示灯显示 )//然后进入掉电状态,利用外部中断0 口来唤醒单片机工作//唤醒后单片机将通过P0^0-3 口的灯闪烁显示开始工作////****************************************************************************/ /#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0;// 进入掉电状态标志sbit Chip_Start_LED= P0^0;//单片机开始工作指示灯sbit Power_Down_LED_INT0= P0^1;//INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2;//INT0口没有唤醒指示灯sbit Normal_Work_LED= P0^3;// 正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2;//外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************////软件延时////***********************************//void Delay_ms( uint time ){uint t;// 延时时间= (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************////正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************////中断初始化////***********************************//void Intp_init(void){IT0 = 0;// 外部中断源0 为低电平触发EX0 = 1;//允许外部中断EA = 1;//开总中断}//***********************************////主程序////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0;//记录掉电次数P0 = 0x00;Chip_Start_LED= 1;// 单片机开始工作Intp_init();// 外中断 0 初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work();// 系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down();// 掉电唤醒后}}//**********************************////中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag )//掉电唤醒状态指示{Power_Down_Flag= 0;Power_Down_LED_INT0= 1;while( Power_Down_Wakeup_INT0 == 0 ){_nop_();//等待高电平}Power_Down_LED_INT0= 0;}else// 未掉电状态{N_Power_Down_LED_INT0 = 1;// 不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//****************************************************************************////STC12C5A60S2A/D 转换模块//////说明:STC12C5A60S2 单片机有 8 路 10位高速 AD 转换器 ,P1^0-P1^7////涉及寄存器: P1ASF( 模拟功能控制寄存器)、 ADC_CONTR(ADC控制寄存器 )//ADC_RES 、 ADC_RESL( 转换结果寄存器 )////注意 :1、初次打开内部 A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D 转换//启动 A/D 后 ,在转换结束前不改变任何I/O 口的状态 ,有利于高精度A/D 转换//若能将定时器 /串行 /中断系统关闭更好。

STC12C5A60S2控制温度传感器DS18B20 c程序

STC12C5A60S2控制温度传感器DS18B20 c程序

STC12C5A60S2 控制温度传感器DS18B20 c 程序STC12C5A60S2 控制温度传感器DS18B20 c 程序工作频率:12.000MHz #include”REG51.H”#include”INTRINS.H”typedefunsignedcharBYTE; sbitDQ=P3;//DS18B20的数据口位P3.3BYTETPH;//存放温度值的高字节BYTETPL;//存放温度值的低字节voidDelayXus(BYTEn); voidDS18B20_Reset(); voidDS18B20_WriteByte(BYTEdat); BYTEDS18B20_ReadByte(); voidmain() { DS18B20_Reset();//设备复位DS18B20_WriteByte(0xCC);//跳过ROM 命令DS18B20_WriteByte(0x44);//开始转换命令while(!DQ);//等待转换完成DS18B20_Reset();//设备复位DS18B20_WriteByte(0xCC);//跳过ROM 命令DS18B20_WriteByte(0xBE);//读暂存存储器命令TPL=DS18B20_ReadByte();//读温度低字节TPH=DS18B20_ReadByte();//读温度高字节while(1); } /************************************** 延时X 微秒(STC12C5A60S2@12M) 不同的工作环境,需要调整此函数此延时函数是使用1T 的指令周期进行计算,与传统的12T 的MCU 不同**************************************/ voidDelayXus(BYTEn) { while(n--){ _nop_(); _nop_(); } } /************************************** 复位DS18B20,并检测设备是否存在**************************************/voidDS18B20_Reset() { CY=1; while(CY) { DQ=0;//送出低电平复位信号DelayXus(240);//延时至少480us DelayXus(240); DQ=1;//释放数据线DelayXus(60);//等待60us CY=DQ;//检测存在脉冲DelayXus(240);//等待设备释放数据线DelayXus(180); } } /************************************** 从DS18B20 读1 字节数据**************************************/。

stc12c5a60s2 AD 程序

stc12c5a60s2  AD 程序
//AD速度设置。
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define uchar unsigned char
#define uint unsigned int
/*LCD 各种端口的设置 */
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^3;
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC开始标志位。
/*可写入 4*8 汉字,x的范围是1到4,y的范围是1到8*/
void lcd_string(uchar x,uchar y,char*str)
{
static uchar flag = 0;
uchar i = 0;
if(!flag)
{
lcd_init();
flag = 1;
case 3 : temp = 0x88;
break;
case 4 : temp = 0x98;
break;
default : temp = 0x80;
break;
}
pos = temp + col-1;
LCD_0(0,pos);
}
}
/*字符位置的选定*/

c51红外遥控代码

c51红外遥控代码
{
EA=1;
EX0=1;
TCON=0x01;
}
void scan()interrupt 0
{
uint i,ti,lo,t=0;
uchar user=0,datai=0;
signal=1;
EX0=0;
for(lo=0;lo<36;lo++)
{
ti=0;
do
{
t=0;
js=1;
while(js)
{
t++;
{
if(key==hwc[i])
key=i;
}
if(t!=0)
signal=1;
EX0=1;
}
本程序只适用于本图所显示的遥控器以及stc12c5a60s2的单片机并且晶振是11.0592M的:
使用方法:
软件上将下列.c和.h加入c51工程,在主程序运行前加入红外初始化ini_hw()函数,然后运行程序的时候,如果signal=1,代表接收到按下的按键,用完后注意清零。读key就是红外按键的值(1,2,3······代表按键依次的按键值),读kr就是按键的键值。
_nop_();
for(i=0;i<80;i++)
_nop_();
if(t==255)
{
if(lo==0)
signal=0;
break;
}
if(!signal)
break;
}
if(t==255)
ti++;
if(ti==3)
break;
}while(t==255||t==0);
if(!signal)
break;
uchar pdata a[I*10],b[40],c[12]={0,128,64,32,16,8,4,2,1,0,0,0};

STC红外线测试C程序

STC红外线测试C程序
/*****************技术支持yuzhongjun8@*****************************/
/***应用与51系列、STC系列、经本人测试无误************************************************************/
WriteCMD(0x80+5);
LCD_write_string(TimeNum);//显示处理过后的码值
delay(1);
WriteCMD(0x80+40);
LCD_write_string("KEY:");
WriteCMD(0x80+0x40+0x04);
switch(IRcord[2])
{
case 0xb6:LCD_write_string("1");break;
default:break;
delay(1);
}
irpro_ok=0; //处理完成后清楚标志位
}
/******************************************************************/
/*定时器2初始化*/
/******************************************************************/
void Time2_EXF2 (void) interrupt 5 //T2EX中断
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位
if(TF2)
{irtime++; //有多少个256us、用于计数2个下降沿之间的时间

STC12C5A60S2单片机课程设计报告

STC12C5A60S2单片机课程设计报告

一、课程设计基本情况介绍课程设计的基本目的与任务本课程设计旨在驾驭本专业学生理论指导实践能力以及电子产品工程设计与开发能力。

本实践课所要达到的主要目的是:1、通过本次课程设计,是对学生综合能力的检,提高学生综合运用专业知识,强化单片机应用系统设计与防震能力。

2、本次课程设计是在生产实习所完成的“单片机核心板+电子钟模块+MP3模块+RFID模块+无线传输模块+GPS模块+脉搏传感模块”的基础上设计该硬件系统的工作程序。

课程设计的基本内容1、在生产实习设计单片机硬件系统的基础上,设计相应的应用软件系统。

2、在LCD1602上显示学号程序设计。

3、基于DS1302的实时时钟软件设计。

4、基于DS18B20的温度测量软件设计。

5、基于TL1838A的红外遥控解码软件设计。

6、设计应用软件系统框图和流程图,完成所设计软件的调试。

课程设计的教学要求1、通过资料查阅及学习了解单片机应用系统的软件设计方法及单片机编程、软硬件联机调试技巧。

2、独立设计并编写下列应用程序:(1)LCD1602学号显示程序;(2)DS1302实时时钟程序;(3)DS18B20温度测量程序;(4)TL1838A红外遥控解码程序;3、独立完成所设计程序与硬件系统的联机仿真。

二、整机系统框图(硬件、软件)该设计方案是以STC12C5A60S2单片机为核心,采用LCD液晶屏幕显示模块、实时时钟模块、温度测量模块、红外遥控解码等模块所构建的系统,能在LCD1602液晶屏上显示当前的日期(年、月、日)、时间(时、分、秒)数据、当前环境温度值和红外遥控解码值。

用户可通过遥控器或单片机核心板上的按键来进行日期和时间的设置。

本系统设计大部分功能由软件来实现,电路简单明了,系统稳定性也得到大大提高。

1、总体硬件设计框架图:2、总体软件设计框架图图为电子时钟程序设计流程图。

图电子时钟程序设计流程图 2、温度测量模块温度测量程序主要包括主程序,读出温度子程序,温度转换子程序,计算温度子程序,显示数据子程序等。

STC 12C5A60S2芯片的实验板报告

STC 12C5A60S2芯片的实验板报告

目录第一章实习的目的及意义 (1)1.1生产实习的目的 (1)1.2生产实习的意义 (1)1.3生产实习的重要性 (1)第二章单片机的最小系统 (2)2.1部分芯片介绍 (2)2.1.1 AT89S52芯片 (2)2.1.2 MAX232芯片 (3)2.1.3 LCD1602液晶显示器 (4)2.1.4 DS12887芯片 (5)2.1.5 74HC573 (7)第三章单片机电路板焊接 (8)3.1 单片机焊接 (8)3.2焊接元件清单 (8)3.3 焊接注意事项 (10)第四章 C51语言的应用程序 (12)4.1 Keil uVision的使用 (12)4.2 流水灯程序 (12)4.3 流水灯高地位循环闪烁 (13)4.4 AD转换测温度 (15)4.5 按键控制1602 (21)4.6 调试中出现的问题 (28)第五章单片机开发板的应用 (29)5.1 应用程序 (29)第六章实习体会 (33)第一章实习的目的及意义1.1生产实习的目的此次生产实习的目的是在理论学习的基础上,通过完成一个设计51单片机的多种资源应用并具有综合功能的最小系统目标板的设计与编程应用。

1.2生产实习的意义将理论知识与实际应用相结合,从实际出发分析问题、研究问题和解决问题,将单片机的知识系统化,并能对电子电路、电子元器件、印制电路板等方面的知识有进一步的加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机的应用系统的开发设计打下一定基础。

1.3生产实习的重要性生产实习是电子信息工程专业教学计划的一个重要部分,是培养学生理论学习与实践相结合的重要实践性教学环节。

通过生产实习使学生了解实习单位的工作方式和工作流程;对以后大单片机课程设计,帝业设计做基础,了解一个开发板的开发制作的整个过程以及元器件的采购;对生产现场、生产过程中的电子信息设备、计算机设备的应用状况有较为深刻的认识,掌握常规电子信息设备的使用维护方法;在实践中进一步加强专业教育,了解本专业工程技术岗位和生产劳动岗位的工作情况和工作内容,培养团队精神和吃苦耐劳的精神;同时可以使学生学到企业的管理经验和工人师傅的艰苦创业精神,激励学生奋发向上的开拓精神。

单片机NEC红外信号接收处理,STC12C5A60S2单片机双串口应用

单片机NEC红外信号接收处理,STC12C5A60S2单片机双串口应用
* 输出 : 无
*******************************************************************************/
void ReadIr() interrupt 0
{
unsigned char j,k;
* 函数功能 : 串行口1发送
* 输出 : 无
*******************************************************************************/
void DelayMs(unsigned int x) //0.13961ms 0.14ms误差 0.39us
IrValue[k]<<=1; //左移 最低位为0
if(Time>=8) //如果高电平出现大于565us,那么是1 0.14X8=1.12ms 1.12ms大于0.565小于1.69
{
//IrValue[k]|=0x80; // "|="表示按位相或 位操作,就是逐位取“或”。 最高位置1
//如果串口1接收到数据,将此数据由串口2发送
if(flag1==1)
{
flag1=0;
UART_2SendOneByte(temp1);
}
//如果串口2接收到数据,将此数据由串口1发送
if(flag2==1)
{
flag2=0;
UART_1SendOneByte(temp2);
***********************************************************************/

STC12单片机红外发送程序,已测可用

STC12单片机红外发送程序,已测可用

STC12单片机红外发送程序,已测可用#includeunsigned int count; //延时计数器unsigned int endcount; //终止延时计数bit flag; //红外发送标志sbit IR=P1^0; //控制红外发送端口unsigned char iraddr1; //十六位地址的第一个字节unsigned char iraddr2; //十六位地址的第二个字节void SendIRdata(unsigned char); //发送一帧void SendOneByte(unsigned char); //发送一字节void Init(void){TMOD = 0x22; //设定时器0和1为16位模式2,8位自动装置模式SCON = 0x50;TH0 = 0xF4;TL0 = 0xF4; //设定时值0为38K 也就是每隔13us中断一次TH1 = 0xFD;TL1 = TH1; //设定定时器1值,9600波特率PCON = 0x00;TF0 = 0;EA = 1; //打开总中断ES = 1; //打开串口中断ET0 = 0; //关闭定时器T0中断,在后面发送打开,发送完后又关闭,因其优先级高于串口,所以等待串口时关断IP = 0x02; //设置定时器0中断优先级为高级TR1 = 1; //定时器1开始计数TR0 = 0; //定时器0关闭计数}void main(void){Init();endcount=0;count = 0;flag = 0; //无载波IR = 1; //初始化 //开始计数iraddr1 = 14; //自定义的一个地址iraddr2 = 14; //地址反码flag=1;TR0=0;while(1){;}}/*定时器0中断处理*/void Timer0Interrupt(void) interrupt 1 { //设定时值为38K 也就是每隔13us中断一次if(flag) //载波有效IR=~IR;elseIR=1; //载波无效count++;}/*串口中断*/void UARTInterrupt(void) interrupt 4{unsigned char dat0;if(RI==1){dat0=SBUF;SendIRdata(dat0);SBUF=dat0;while(!TI);TI=0;RI=0;}elseTI = 0;}void SendIRdata(char p_irdata) //发送数据子函数{unsigned char i=0,irdata=p_irdata;/*起始码之前的引导码*/flag=1;endcount=18; //高电平234us 载波count=0;TR0 = 1;ET0=1; //开始发送,打开定时器0中断while(countTR0=0; //赋值时关闭计时flag=0;endcount=18; //低234us 无载波count=0;while(count/*发送9ms的起始码(高电平),并是载波模式有效*/ TR0=0; //赋值时关闭计时endcount = 692; //高电平9ms 载波flag = 1;count = 0;TR0=1; //赋值完毕后打开计时while(count/*发送4.5ms的结果码(低电平),并是载波模式无效*/ TR0=0; //赋值时关闭计时flag=0;endcount=346; //低电平4.5ms 无载波count=0;TR0=1; //赋值完毕后打开计时while(countSendOneByte(iraddr1); //发送地址高8位SendOneByte(iraddr2); //发送地址低8位SendOneByte(irdata); //发送按键码SendOneByte(~irdata); //发送按键反码/*停止位*/TR0=0; //赋值时关闭计时flag=1;endcount=43; //高0.56ms 载波count=0;while(count<endcount);IR=1; //发送完毕,关闭红外ET0=0; //发送完毕关闭定时器中断。

STC12C5A60S2精简开发板产品使用手册

STC12C5A60S2精简开发板产品使用手册

STC12C5A60S2单片机开发学习板产品使用手册【简要说明】一、尺寸:长83mmX宽79mmX高18mm二、主要芯片:STC12C5A60S2单片机三、工作电压:直流6~15伏四、、特点:1、具有电源指示;2、所有I/O口已引出;3、可以实现与电脑串口通信;4、可以实现双串口通讯;5、具有上电复位和手动复位;6、附带SD卡读写接口;7、支持STC串口下载;8、双串口通讯(注:只能使用COM1下载程序);9、八路LED灯(注:可拔出短路帽,断开LED灯);10、可端子接线供电、可排针引电;11、7805供电,输入电压范围宽,且确保AD参考电压准确(注:因无外部参考电压点)五、提供相关软件、资料、原理图适用场合:单片机学习、电子竞赛、产品开发、毕业设计。

注意啦:本产品提供的所有程序都附带原理图以及说明!【图片标注】【原理图】(放大可以看清楚)【PCB尺寸图】【开发板支持同系列单片机的型号】STC单片机最新型号——STC12C5A60S2STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz;4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节;5.片上集成1280字节RAM;6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55Ma;7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM);9. 看门狗;10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);11.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%;12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz,3.3V单片机为:8MHz~12MHz,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准;13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器;14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块, Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3);16. PWM(2路)/PCA(可编程计数器阵列,2路):——也可用来当2路D/A使用——也可用来再实现2个定时器——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口;19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3);20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。

基于STC12C5A60S2单片机的水弹感应靶

基于STC12C5A60S2单片机的水弹感应靶

基于STC12C5A60S2单片机的水弹感应靶摘要:本文介绍了一种基于STC12C5A60S2单片机实现的水弹感应靶设计。

该设计采用了红外线接收传感器和水气压传感器,结合了可重复充气的防撞材料,实现了对水弹撞击的检测和响应。

单片机采用了高速计数器实现计时和计数功能,在ARM公司提供的嵌入式系统设计集成开发环境Keil C51中对程序进行编写和优化。

实验结果表明,该设计能够快速准确地检测水弹的射击情况,满足了水弹靶的实际需求。

关键词:水弹感应靶;单片机;红外线传感器;水气压传感器;计时计数引言水弹靶游戏是一种近年来比较流行的户外游戏项目。

它以水弹击中靶子为游戏目的,要求玩家在规定的时间内击中尽可能多的靶子,测试玩家的快速反应能力和枪械控制能力。

因此,设计一种实用的水弹感应靶非常实用,可以大大提高游戏的趣味性和竞争性,更好地满足玩家的需求。

本文采用了STC12C5A60S2单片机,加入了红外线接收传感器和水气压传感器等元器件,设计了一种实用的水弹感应靶。

它能够通过计数记录玩家的射击次数,并利用计时器记录比赛时长。

本文将详细介绍该设计的构造、电路原理、程序设计、实验结果及其性能优化。

设计原理水弹感应靶的实现原理主要有以下三个方面:(1)感应水弹,触发相应的电子响应。

(2)记录伤害值以及射击次数,保存与数据信息。

(3)比赛结束后,输出游戏结果。

用于构建水弹感应靶的元器件有红外线传感器,水气压传感器,可重复充气的防撞材料等。

其中,红外线传感器以探测玩家射击水弹的情况,水气压传感器则以检测水弹撞击的强度和压力。

水弹感应靶由共计15个等分区域组成,其中10个为设定的比赛开局值,5个则为额外加分区域。

在设计中,使用可重复充气的防撞材料作为靶子外壳,从而达到减少水弹撞击对靶子的损坏;红外线传感器则以探测水弹穿过防撞材料红外线所发射出的区域且命中靶子的情况;水气压传感器则以检测水弹的力度,减少水弹松散的情形。

实现方案2、使用红外线接收传感器和水气压传感器两种传感器来实现水弹的感应。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

endcount=20;
flag=1;
count=0;
do{}while(count<endcount); //停止发送红外信号即编码中的高电平
//if(irdata&0X01) //判断二进制数个位为1还是0
if(irdata-(irdata/2)*2)
case(0xdd):senddat[n]=5,display(5),++n;break;
case(0xbd):senddat[n]=6,display(6),++n;break;
case(0x7d):senddat[n]=7,display(7),++n;break;
}
P1=0xfb;
/*
移植时注意与传统8051单片机的软件延时不同,因12c系列处理速度更快!!!
*/
#include"STC12C5A60S2.h"
#define uchar unsigned char //数据类型的宏定义
#define uint unsigned int //数据类型的宏定义
sbit OUT=P3^4;
// case(0x7b):senddat=table[11];break;
}
/*P1=0xf7;
temp=P1;
switch(temp)
{
case(0xe7):senddat=table[12];break;
case(0xd7):senddat=table[13];break;
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}
}
}
void display(unsigned char i)
{
P27=0; //选通最有端的数码管显示
case(0xb7):senddat=table[14];break;
case(0x77):senddat=table[15];break;
}
*/
}
}
//SendIRdata(senddat);
//delay() ;
//P1=0XFE;
}
}
/* do{
}
P1=0XFF;
}while(1);
}
//外部中断0处理
void exint(void) interrupt 0
{
// IE0=0;
}*/
//定时器0中断处理
void timeint(void) interrupt 1
{
endcount=80; //1为宽的高电平
}
else
{
endcount=40; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
//if(irdata&0X01)
{
endcount=81;
}
IT0=1;
EX0=1;
EA=1;
iraddr1=0x00;
iraddr2=0x01;
while(1)
{
P1=0xff; //先向P1口写1;端口读状态
P1=0xf0;
temp=P1;
if(temp!=0xf0)
{
delay1ms(700);
sbit KEY=P2^4;
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
if(irdata-(irdata/2)*2)
{
endcount=80;
}
else
{
endcount=40;
}
flag=0;
count=0;
do{}while(count<endcount);
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
OUT = OP;
if(temp!=0xf0)
{
P1=0xfe;
temp=P1;
switch(temp)
{
case(0xee):senddat[n]=0,display(0),++n;break;
case(0xde):senddat[n]=1,display(1),++n;break;
// if(irdata&0X01)
if(irdata-(irdata/2)*2)
{
endcount=80;
}
else
{
endcount=40;
}
flag=0;
delay();
while(KEY);
DelayMs(10);
if(!KEY)
{
SendIRdata(senddat);
P1=0XFE;
}
else
{
DelayMs(1); 来自else {
endcount=40;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送后八位数据
temp=P1;
switch(temp)
{
case(0xeb):senddat[n]=8,display(8),++n;break;
case(0xdb):senddat[n]=9,display(9),++n;break;
case(0xbb):display(10),n=0,SendIRdata(senddat),delay(); break;
void delay();
sbit P27=P2^7;
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};
//共阳数码管显示字型码数组 1011 1111 "-"
irdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=20;
flag=1;
count=0;
do{}while(count<endcount);
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void delay()
{
irdata=irdata>>1;
}
endcount=20;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void DelayUs2x(unsigned char t)
irdata=p_irdata[1];
for(i=0;i<8;i++)
{
endcount=20;
flag=1;
count=0;
do{}while(count<endcount);
//if(irdata&0x01)
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据
irdata=p_irdata[0];
for(i=0;i<8;i++)
{
endcount=20;
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
char senddat[5];
相关文档
最新文档