stc15f2k602s写dac8522源代码---白云VS悠悠
- 格式:docx
- 大小:14.08 KB
- 文档页数:3
STC15F2K60S2单片机与CAN总线接口的实现
STC15F2K60S2单片机与CAN总线接口的实现
胡家华;付文广;郜事成;李文静;曹永根;周前;朱清发;吕永春
【期刊名称】《微型机与应用》
【年(卷),期】2014(033)017
【摘要】分析了CAN总线通信的性能和技术特点,介绍了CAN总线结构的模式及应用趋势.针对采用单片机实现与CAN总线接口的问题,详细探讨了用STC15F2K60S2单片机结合总线控制器SIA1000和总线收发器PCA82C250芯片构成CAN总线接口电路的实现,并介绍了接口驱动软件的编制流程.
【总页数】4页(55-58)
【关键词】CAN总线;控制器;收发器;单片机;通信;接口
【作者】胡家华;付文广;郜事成;李文静;曹永根;周前;朱清发;吕永春【作者单位】哈尔滨理工大,黑龙江哈尔滨150080;哈尔滨理工大,黑龙江哈尔滨150080;哈尔滨理工大,黑龙江哈尔滨150080;哈尔滨理工大,黑龙江哈尔滨150080;哈尔滨理工大,黑龙江哈尔滨150080;哈尔滨理工大,黑龙江哈尔滨150080;黑龙江电器集团有限公司,黑龙江哈尔滨150080;黑龙江电器集团有限公司,黑龙江哈尔滨150080 【正文语种】中文
【中图分类】TP393
【相关文献】
1.带有CAN总线接口的Philips P8XC592单片机 [J], 满庆丰
2.基于CAN总线实现的PC机与单片机的通信[J], 冯瑛; 张泰山; 余君兰
3.基于CAN总线实现的PC机与单片机的通信[J], 冯瑛; 张泰山; 余君兰。
STC15单片机开发板使用说明书(V1.0版)目录一.功能特色 (3)二.硬件部分 (3)1.功能模块 (3)2.实训STC15单片机开发板平台布局 (4)3.跳线说明 (5)4.电位器功能说明 (5)5.接口说明 (5)三.驱动安装及程序下载 (6)1.安装驱动 (6)2.程序下载 (6)一.功能特色1.采用宏晶公司最新STC15系列IAP15F2K61S2芯片。
ISP/IAP,在系统可编程/在应用可编程,无需编程器,无需仿真器。
可当仿真器使用。
2.增强型8051CPU,1T,单时钟/机器周期,速度比普通8051快8-12倍3.61K字节片内片内Flash程序存储器,擦写次数10万次以上4.片内大容量2048字节的SRAM5.大容量片内EEPROM,擦写次数10万次数以上6.共8通道10位高速ADC,速度可达30万次/秒,3路PWM还可当3路D/A 使用7.共3通道捕获/比较单元(CCP/PWM/PCA)8.内部高可靠复位,8级可选复位门槛电压,彻底省掉外部复位电路9.内部高精度R/C时钟,内部时钟从5MHz~35MHz可选,相当于普通8051的60MHz~420MHz10.两组高速异步串行通信端口(可同时使用),可在5组管脚之间进行切换,分时复用可当5组串口使用。
11.一组高速异步串行通信端口SPI。
12.各种接口扩展齐全。
13.一根优质USB线实现系统供电、程序下载、通信功能。
二.硬件部分1.功能模块STC15单片机开发板由以下基本功能模块组成。
(1)单片机芯片配置40脚STC15系列单片机插座;采用宏晶公司最新STC15系列IAP15F2K61S2。
(2)显示模块配置8路LED输出;配置8位8段共阳数码管;配置LCD1602、LCD12864和TFT液晶接口。
(3)输入/输出模块配置4×4键盘矩阵,其中16个按键可通过跳线配置为独立按键;配置ULN2003功率放大电路,驱动继电器、蜂鸣器、步进电机、直流电机。
#ifndef __STC15F2K60S2_H_#define __STC15F2K60S2_H_///////////////////////////////////////////////////注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5////////////////////////////////////////////////////////////////////////////////////////////////////包含本头文件后,不用另外再包含"REG51.H"//内核特殊功能寄存器// 复位值描述sfr ACC = 0xE0; //0000,0000 累加器Accumulatorsfr B = 0xF0; //0000,0000 B寄存器sfr PSW = 0xD0; //0000,0000 程序状态字页脚内容1sbit 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; //0000,0111 堆栈指针sfr DPL = 0x82; //0000,0000 数据指针低字节sfr DPH = 0x83; //0000,0000 数据指针高字节//I/O 口特殊功能寄存器sfr P0 = 0x80; //1111,1111 端口0sbit P00 = P0^0;sbit P01 = P0^1;sbit P02 = P0^2;sbit P03 = P0^3;页脚内容2sbit P04 = P0^4;sbit P05 = P0^5;sbit P06 = P0^6;sbit P07 = P0^7;sfr P1 = 0x90; //1111,1111 端口1sbit P10 = P1^0;sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit P14 = P1^4;sbit P15 = P1^5;sbit P16 = P1^6;sbit P17 = P1^7;sfr P2 = 0xA0; //1111,1111 端口2sbit P20 = P2^0;sbit P21 = P2^1;sbit P22 = P2^2;页脚内容3sbit P23 = P2^3;sbit P24 = P2^4;sbit P25 = P2^5;sbit P26 = P2^6;sbit P27 = P2^7;sfr P3 = 0xB0; //1111,1111 端口3sbit P30 = P3^0;sbit P31 = P3^1;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;sbit P36 = P3^6;sbit P37 = P3^7;sfr P4 = 0xC0; //1111,1111 端口4sbit P40 = P4^0;sbit P41 = P4^1;页脚内容4sbit P42 = P4^2;sbit P43 = P4^3;sbit P44 = P4^4;sbit P45 = P4^5;sbit P46 = P4^6;sbit P47 = P4^7;sfr P5 = 0xC8; //xxxx,1111 端口5sbit P50 = P5^0;sbit P51 = P5^1;sbit P52 = P5^2;sbit P53 = P5^3;sbit P54 = P5^4;sbit P55 = P5^5;sbit P56 = P5^6;sbit P57 = P5^7;sfr P6 = 0xE8; //0000,0000 端口6sbit P60 = P6^0;页脚内容5sbit P61 = P6^1;sbit P62 = P6^2;sbit P63 = P6^3;sbit P64 = P6^4;sbit P65 = P6^5;sbit P66 = P6^6;sbit P67 = P6^7;sfr P7 = 0xF8; //0000,0000 端口7sbit P70 = P7^0;sbit P71 = P7^1;sbit P72 = P7^2;sbit P73 = P7^3;sbit P74 = P7^4;sbit P75 = P7^5;sbit P76 = P7^6;sbit P77 = P7^7;sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0页脚内容6sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1//系统管理特殊功能寄存器页脚内容7sfr PCON = 0x87; //0001,0000 电源控制寄存器sfr AUXR = 0x8E; //0000,0000 辅助寄存器sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器//中断特殊功能寄存器sfr IE = 0xA8; //0000,0000 中断控制寄存器sbit EA = IE^7;sbit ELVD = IE^6;sbit EADC = IE^5;sbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;页脚内容8sbit ET0 = IE^1;sbit EX0 = IE^0;sfr IP = 0xB8; //0000,0000 中断优先级寄存器sbit PPCA = IP^7;sbit PLVD = IP^6;sbit PADC = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器//定时器特殊功能寄存器sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器页脚内容9sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器sfr TL0 = 0x8A; //0000,0000 T0低字节sfr TL1 = 0x8B; //0000,0000 T1低字节sfr TH0 = 0x8C; //0000,0000 T0高字节sfr TH1 = 0x8D; //0000,0000 T1高字节sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器sfr T4H = 0xD2; //0000,0000 T4高字节sfr T4L = 0xD3; //0000,0000 T4低字节页脚内容10sfr T3H = 0xD4; //0000,0000 T3高字节sfr T3L = 0xD5; //0000,0000 T3低字节sfr T2H = 0xD6; //0000,0000 T2高字节sfr T2L = 0xD7; //0000,0000 T2低字节sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器//串行口特殊功能寄存器sfr SCON = 0x98; //0000,0000 串口1控制寄存器sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;页脚内容11sbit RI = SCON^0;sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器sfr S4CON = 0x84; //0000,0000 串口4控制寄存器sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器sfr SADDR = 0xA9; //0000,0000 从机地址寄存器sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器//ADC 特殊功能寄存器sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位//SPI 特殊功能寄存器sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器页脚内容12sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器//IAP/ISP 特殊功能寄存器sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器//PCA/PWM 特殊功能寄存器sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器sbit CF = CCON^7;sbit CR = CCON^6;sbit CCF2 = CCON^2;sbit CCF1 = CCON^1;sbit CCF0 = CCON^0;页脚内容13sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器sfr CL = 0xE9; //0000,0000 PCA计数器低字节sfr CH = 0xF9; //0000,0000 PCA计数器高字节sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节//比较器特殊功能寄存器页脚内容14sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2//增强型PWM波形发生器特殊功能寄存器sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器//如下特殊功能寄存器位于扩展RAM区域//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写#define PWMC (*(unsigned int volatile xdata *)0xfff0)#define PWMCH (*(unsigned char volatile xdata *)0xfff0)#define PWMCL (*(unsigned char volatile xdata *)0xfff1)#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)#define PWM2T1 (*(unsigned int volatile xdata *)0xff00)#define PWM2T1H (*(unsigned char volatile xdata *)0xff00)#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)页脚内容15#define PWM2T2 (*(unsigned int volatile xdata *)0xff02) #define PWM2T2H (*(unsigned char volatile xdata *)0xff02) #define PWM2T2L (*(unsigned char volatile xdata *)0xff03) #define PWM2CR (*(unsigned char volatile xdata *)0xff04) #define PWM3T1 (*(unsigned int volatile xdata *)0xff10) #define PWM3T1H (*(unsigned char volatile xdata *)0xff10) #define PWM3T1L (*(unsigned char volatile xdata *)0xff11) #define PWM3T2 (*(unsigned int volatile xdata *)0xff12) #define PWM3T2H (*(unsigned char volatile xdata *)0xff12) #define PWM3T2L (*(unsigned char volatile xdata *)0xff13) #define PWM3CR (*(unsigned char volatile xdata *)0xff14) #define PWM4T1 (*(unsigned int volatile xdata *)0xff20) #define PWM4T1H (*(unsigned char volatile xdata *)0xff20) #define PWM4T1L (*(unsigned char volatile xdata *)0xff21) #define PWM4T2 (*(unsigned int volatile xdata *)0xff22) #define PWM4T2H (*(unsigned char volatile xdata *)0xff22) #define PWM4T2L (*(unsigned char volatile xdata *)0xff23)页脚内容16#define PWM4CR (*(unsigned char volatile xdata *)0xff24) #define PWM5T1 (*(unsigned int volatile xdata *)0xff30) #define PWM5T1H (*(unsigned char volatile xdata *)0xff30) #define PWM5T1L (*(unsigned char volatile xdata *)0xff31) #define PWM5T2 (*(unsigned int volatile xdata *)0xff32) #define PWM5T2H (*(unsigned char volatile xdata *)0xff32) #define PWM5T2L (*(unsigned char volatile xdata *)0xff33) #define PWM5CR (*(unsigned char volatile xdata *)0xff34) #define PWM6T1 (*(unsigned int volatile xdata *)0xff40) #define PWM6T1H (*(unsigned char volatile xdata *)0xff40) #define PWM6T1L (*(unsigned char volatile xdata *)0xff41) #define PWM6T2 (*(unsigned int volatile xdata *)0xff42) #define PWM6T2H (*(unsigned char volatile xdata *)0xff42) #define PWM6T2L (*(unsigned char volatile xdata *)0xff43) #define PWM6CR (*(unsigned char volatile xdata *)0xff44) #define PWM7T1 (*(unsigned int volatile xdata *)0xff50) #define PWM7T1H (*(unsigned char volatile xdata *)0xff50)页脚内容17#define PWM7T1L (*(unsigned char volatile xdata *)0xff51) #define PWM7T2 (*(unsigned int volatile xdata *)0xff52) #define PWM7T2H (*(unsigned char volatile xdata *)0xff52) #define PWM7T2L (*(unsigned char volatile xdata *)0xff53) #define PWM7CR (*(unsigned char volatile xdata *)0xff54)/////////////////////////////////////////////////#endif页脚内容18。
STC15F2K60S2单片机定时器编程一、STC15F2K60S2 单片机定时器概述STC15F2K60S2 单片机内部集成了 5 个定时器,分别是 2 个 16 位的定时器/计数器 T0 和 T1,2 个 8 位的定时器 T2 和 T3,以及 1 个独立波特率发生器定时器T4。
这些定时器都具有不同的特点和应用场景。
T0 和 T1 是传统的 16 位定时器/计数器,可以工作在定时模式和计数模式。
在定时模式下,通过设置定时器的初值和溢出周期,可以实现精确的定时功能;在计数模式下,可以对外部脉冲进行计数。
T2 和 T3 是 8 位定时器,具有自动重载功能,使用起来更加方便。
T4 是独立波特率发生器定时器,主要用于串行通信中的波特率设置。
二、定时器的工作模式1、定时模式在定时模式下,定时器对内部的系统时钟进行计数。
通过设置定时器的初值和溢出周期,可以实现不同时长的定时功能。
例如,如果系统时钟频率为 12MHz,要实现 1ms 的定时,我们可以计算出定时器的初值为 65536 1000,然后将初值写入定时器的寄存器中。
2、计数模式在计数模式下,定时器对外部引脚输入的脉冲进行计数。
当计数值达到设定的阈值时,产生溢出中断。
三、定时器的相关寄存器1、定时器控制寄存器(TCON)TCON 寄存器用于控制定时器的启动、停止、溢出标志等。
例如,TR0 和 TR1 位分别用于控制 T0 和 T1 的启动和停止,TF0 和 TF1 位则分别表示 T0 和 T1 的溢出标志。
2、定时器模式寄存器(TMOD)TMOD 寄存器用于设置定时器的工作模式和计数方式。
例如,可以通过设置 TMOD 寄存器的某些位来选择定时器是工作在定时模式还是计数模式,以及是 8 位模式还是 16 位模式。
3、定时器初值寄存器(TH0、TL0、TH1、TL1、TH2、TL2、TH3、TL3)这些寄存器用于存储定时器的初值。
在定时模式下,通过设置初值可以控制定时器的溢出周期;在计数模式下,初值则决定了计数的阈值。
STC15F2K60S2串口2程序下面是串口2 的程序,昨天一直没调出来的原因是由于串口发送完中断标志位,置位和清零上出了问题。
其中为什么要把它,照着资料手册上那种方式写才行,这我现在也没大清楚,我想可能这需要反汇编才看的出来,由于竞赛时间紧,只有暂且放下进一步的分析,下面是程序代码。
#include “reg51.h”sfrP4 = 0xc0;sfr P5 = 0xc8;sfr AUXR = 0x8e ;sfr S2CON = 0x9a ;sfr S2BUF = 0x9b ;sfr T2H = 0xd6 ;sfr T2L = 0xd7 ;sfr IE2 = 0xaf ;sfr IP2 = 0xb5 ;#define S2RI 0x01 // S2CON.0#define S2TI 0x02 // S2CON.1unsigned char temp ;bit flag1 = 0 , flag2 = 0 , busy = 0 ; unsigned char xdata Uart1TxBuffer [20] = “杜兴杰你必须加油个”; //void SendData ( unsigned char date ) ; //数据发送函数定义void Uart2Init(void)//9600bps@11.0592MHz{S2CON = 0x50; //8 位数据,可变波特率AUXR |= 0x04; //定时器2 时钟为Fosc,即1TT2L = 0xE0; //设定定时初值T2H = 0xFE; //设定定时初值AUXR |= 0x14; //启动定时器2 4 注意这里EA = 1 ;IE2 = 0x01 ; //开启串口中断ES2IP2 |= 0x00 ; //串口2 优先级0}void main( void ){char i ;P0 = 0;Uart2Init() ;SendData (C) ;SendData (C) ;for ( i = 0 ; i {SendData (Uart1TxBuffer[i]) ;}for ( i = 0 ; i {SendData (Uart1TxBuffer[i]) ;} SendData (C) ;SendData (C);while(1){if( flag2 == 1 ){SendData ( temp );flag2 = 0 ;}}}void Uart2( void ) interrupt 8{if( S2CON & S2RI ){S2CON &= ~ S2RI ; temp = S2BUF ;flag2 = 1 ;}if(S2CON & S2TI ){S2CON &= ~ S2TI ;busy = 0 ;}}void SendData ( unsigned char date ){while ( busy ) ; //busy = 1 ;S2BUF = date ;// while ( !( S2CON & 0x02 ) ) ;// S2CON &= ~ S2TI ;}下一步是把串口1 和串口2 加在一起,还有就是加入循环队列实现流控等tips:感谢大家的阅读,本文由我司收集整编。
基于STC15F2K61S2的计算器设计作者:韩光江孙鹏何梦雪余晓铭来源:《科技与创新》2015年第10期摘要:提出了一种可进行连续四则运算的计算器设计方案,主要从硬件部分和软件部分两方面介绍此设计方案。
在硬件部分中,说明了所选用的STC公司最新的STC15F2K61S2微控制器相比于传统C51单片机的优势,提出了仅用3个引脚驱动8位数码管的方法,并介绍了4×4矩阵键盘的驱动方案;在软件部分中,给出了计算器程序执行流程图,并提出了一种实现计算器四则运算的算法。
关键词:计算器;单片机;驱动方案;数码管中图分类号:TP368.1 文献标识码:A DOI:10.15913/ki.kjycx.2015.10.101随着嵌入式技术的不断发展,计算器在生活中的应用越来越广泛,便携式计算器日益成为人们工作、学习中不可或缺的工具。
因此,采用STC公司最新的STC15F2K61S2单片机,并结合数码管、矩阵键盘等模块完成了一种可进行8位数以内四则运算的计算器设计。
其能进行连续的四则运算,并能实时显示当前输入数据和输出结果,具有计算可靠、制作简单、集成度高、成本低等优点。
1 计算器硬件设计部分1.1 微控制器STC15F2K61S2系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是高速、高可靠性的新一代8051单片机,ISP编程时时钟频率可设置为5~35 MHz,可彻底省掉外部晶振。
其内部已集成了高可靠性的复位电路,无需再设计外部复位电路。
此外,STC15F2K61S2相比于传统的C51系列单片机而言,具有良好的在线仿真功能,可直接在集成开发环境Keil中进行在线仿真调试,极大地提高了软件开发的效率。
1.2 数码管显示模块本模块包含8个数码管。
在传统的数码管驱动方法中,需要采用8个引脚段选,极大地浪费了微控制器的引脚资源。
因此,本设计采用2片74HC595芯片,实现了采用3个引脚就能完成8位数码管的驱动,很好地节省了有限的控制器资源。
STC15F2K60S2定时器2测试。
C//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译//假定测试芯片的工作频率为18.432MHz#include "stc15f2k60s2.h"unsigned char int_sec;//-----------------------------------------------sbit LED = P0^0;sbit d4 =P2^3; //将d4位定义为压轮升降开sbit d5 =P2^2; //将d4位定义为压轮升降关//-----------------------------------------------void Delay2(unsigned int i) //1MS{unsigned int j;for(;i>0;i--)for(j=0;j<125;j++);}/* main program */void main(){AUXR &= 0xFB; //定时器2为12T模式T2L=0x00; //设置定时初值T2H=0x4C; //设置定时初值IE2 |= 0x04; //开定时器2中断AUXR |= 0x10; //定时器2开始计时int_sec=0;while (1){if(d4==0){Delay2(20); //延时一段时间再次检测if(d4==0) //按键K4的确被按下{EA=0;}}if(d5==0){Delay2(20); //延时一段时间再次检测if(d5==0) //按键K4的确被按下{EA = 1;}}}}//----------------------------------------------- //中断服务程序void t2int() interrupt 12 //中断入口{T2L=0x00; //设置定时初值T2H=0x4C; //设置定时初值int_sec++;if(int_sec==20){int_sec=0;LED = !LED; //将测试口取反}}//包含本头文件后,不用另外再包含"REG51.H" #ifndef __STC15F2K60S2_H__#define __STC15F2K60S2_H__//内核特殊功能寄存器// 复位值描述sfr ACC = 0xE0; //0000,0000 累加器Accumulator sfr B = 0xF0; //0000,0000 B寄存器sfr PSW = 0xD0; //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; //0000,0111 堆栈指针sfr DPL = 0x82; //0000,0000 数据指针低字节sfr DPH = 0x83; //0000,0000 数据指针高字节//I/O 口特殊功能寄存器sfr P0 = 0x80; //1111,1111 端口0sbit P00 = P0^0;sbit P01 = P0^1;sbit P02 = P0^2;sbit P03 = P0^3;sbit P04 = P0^4;sbit P05 = P0^5;sbit P06 = P0^6;sbit P07 = P0^7;sfr P1 = 0x90; //1111,1111 端口1sbit P10 = P1^0;sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit P14 = P1^4;sbit P15 = P1^5;sbit P16 = P1^6;sbit P17 = P1^7;sfr P2 = 0xA0; //1111,1111 端口2 sbit P20 = P2^0;sbit P21 = P2^1;sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit P25 = P2^5;sbit P26 = P2^6;sbit P27 = P2^7;sfr P3 = 0xB0; //1111,1111 端口3 sbit P30 = P3^0;sbit P31 = P3^1;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;sbit P36 = P3^6;sbit P37 = P3^7;sfr P4 = 0xC0; //1111,1111 端口4 sbit P40 = P4^0;sbit P41 = P4^1;sbit P42 = P4^2;sbit P43 = P4^3;sbit P44 = P4^4;sbit P45 = P4^5;sbit P46 = P4^6;sbit P47 = P4^7;sfr P5 = 0xC8; //xxxx,1111 端口5sbit P50 = P5^0;sbit P51 = P5^1;sbit P52 = P5^2;sbit P53 = P5^3;sbit P54 = P5^4;sbit P55 = P5^5;sbit P56 = P5^6;sbit P57 = P5^7;sfr P6 = 0xE8; //0000,0000 端口6sbit P60 = P6^0;sbit P61 = P6^1;sbit P62 = P6^2;sbit P63 = P6^3;sbit P64 = P6^4;sbit P65 = P6^5;sbit P66 = P6^6;sbit P67 = P6^7;sfr P7 = 0xF8; //0000,0000 端口7sbit P70 = P7^0;sbit P71 = P7^1;sbit P72 = P7^2;sbit P73 = P7^3;sbit P74 = P7^4;sbit P75 = P7^5;sbit P76 = P7^6;sbit P77 = P7^7;sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器 1 sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1//系统管理特殊功能寄存器sfr PCON = 0x87; //0001,0000 电源控制寄存器sfr AUXR = 0x8E; //0000,0000 辅助寄存器sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器sfr P_SW2 = 0xBA; //xxxx,x000 外设端口切换寄存器//中断特殊功能寄存器sfr IE = 0xA8; //0000,0000 中断控制寄存器sbit EA = IE^7;sbit ELVD = IE^6;sbit EADC = IE^5;sbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;sfr IP = 0xB8; //0000,0000 中断优先级寄存器sbit PPCA = IP^7;sbit PLVD = IP^6;sbit PADC = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器//定时器特殊功能寄存器sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器sfr TL0 = 0x8A; //0000,0000 T0低字节sfr TL1 = 0x8B; //0000,0000 T1低字节sfr TH0 = 0x8C; //0000,0000 T0高字节sfr TH1 = 0x8D; //0000,0000 T1高字节sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器sfr T4H = 0xD2; //0000,0000 T4高字节sfr T4L = 0xD3; //0000,0000 T4低字节sfr T3H = 0xD4; //0000,0000 T3高字节sfr T3L = 0xD5; //0000,0000 T3低字节sfr T2H = 0xD6; //0000,0000 T2高字节sfr T2L = 0xD7; //0000,0000 T2低字节sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器//串行口特殊功能寄存器sfr SCON = 0x98; //0000,0000 串口1控制寄存器sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器sfr S4CON = 0x84; //0000,0000 串口4控制寄存器sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器sfr SADDR = 0xA9; //0000,0000 从机地址寄存器sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器//ADC 特殊功能寄存器sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位//SPI 特殊功能寄存器sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器//IAP/ISP 特殊功能寄存器sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器//PCA/PWM 特殊功能寄存器sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器sbit CF = CCON^7;sbit CR = CCON^6;sbit CCF2 = CCON^2;sbit CCF1 = CCON^1;sbit CCF0 = CCON^0;sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器sfr CL = 0xE9; //0000,0000 PCA计数器低字节sfr CH = 0xF9; //0000,0000 PCA计数器高字节sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节#endif。
STC15F2K60S2单片机中断编程在单片机的世界里,中断就像是一位特殊的“信使”,能够在关键时刻打断单片机的正常工作流程,让它优先处理一些紧急而重要的任务。
STC15F2K60S2 单片机作为一款功能强大的微控制器,其中断系统为我们提供了高效、灵活的事件处理方式。
接下来,让我们一起深入探索 STC15F2K60S2 单片机中断编程的奥秘。
一、中断的概念中断,简单来说,就是当单片机正在执行一个任务时,突然收到一个外部或内部的信号,这个信号会让单片机暂停当前任务,转而去处理更紧急的事情。
处理完紧急任务后,再返回原来被中断的地方继续执行之前的任务。
想象一下,你正在专心看书(单片机正在执行主程序),突然有人敲门(中断发生),你会先放下书去开门(处理中断),然后再回来继续看书(返回主程序)。
二、STC15F2K60S2 单片机的中断源STC15F2K60S2 单片机拥有丰富的中断源,包括外部中断、定时/计数器中断、串行口中断等。
外部中断可以通过引脚的电平变化或者边沿触发来产生中断请求。
比如,当连接在某个引脚的传感器检测到特定状态时,就会触发中断。
定时/计数器中断则可以用于实现精确的定时控制或者对外部脉冲进行计数。
当定时时间到或者计数器计满时,就会产生中断。
串行口中断则用于处理串行通信过程中的各种事件。
三、中断优先级在多个中断同时发生的情况下,中断优先级就显得尤为重要。
STC15F2K60S2 单片机为每个中断源都设置了不同的优先级。
高优先级的中断可以打断正在执行的低优先级中断。
就好像在医院里,病危的病人会优先得到医生的救治。
通过合理设置中断优先级,可以确保关键任务能够及时得到处理。
四、中断编程的步骤要进行 STC15F2K60S2 单片机的中断编程,通常需要以下几个步骤:1、开启中断允许在单片机的特殊功能寄存器中,有相应的控制位来允许或禁止中断。
我们需要将这些控制位置为允许状态,才能使中断生效。
2、配置中断源根据我们使用的中断源,设置相应的触发方式、工作模式等参数。
STC15F2K60S2应⽤笔记STC15F2K60S2系列单⽚机是STC⽣产的单时钟/机器周期的单⽚机。
是⾼速/⾼可靠/低功耗/超强抗⼲扰的新⼀代8051单⽚机。
采⽤第⼋代加密技术,加密型超强,指令代码完全兼容传统的8051,速度快8~12倍。
内部集成⾼精度R/C时钟,+/-1%温漂,常温下温漂5%,5MHz~35MHz宽范围可设置,可彻底省去昂贵晶振电路和外部复位电路。
之前在犹豫做机器⼈到底是⽤单⽚机控制还是ARM芯⽚,现在终于决定了,由于好多传感器的电源电压都是5V的,信号接受也是5V,于是决定部分传感器由单⽚机控制,然后在与ARM控制器进⾏通讯,将单⽚机与ARM控制器结合起来。
但是不知为何,在设计单⽚机控制模块的时候在对单⽚机型号进⾏选型时,也许是想尝试新技术——选择了2012年才开始供货的STC15F2K60S2,其中有⼏个原因:1. 它的存储容量⼤,考虑到之前⽤到的STC8952单⽚机,flash才有8K,移植⼀个ucousII都不够。
2. 不⽤外接晶振电路和复位电路,这将节省了电路板的空间。
3. 接⼝丰富,因为需要与ARM进⾏通讯,STC15F2K60S2有两个独⽴串⼝。
4. 有PWM控制输出模块,4个中断,完全满⾜机器⼈的电机驱动和传感器的控制。
5. ⼀般都是LQFN-44封装,⼩指指甲那么⼤的⾯积,很容易⼿⼯焊接。
选定单⽚机型号后,把电路板设计好后,等到我去成都的电⼦元器件交易市场——城隍庙的时候,问了好多家店,都没有这系列的芯⽚,原因是这块芯⽚太新了,店家们都还没有开始供货。
没办法,只有到淘宝上买,很便宜6.5元/⽚,我权衡了⼀下买了三⽚。
刚拿到后就开始打算焊到板⼦上,这种贴⽚式封装的我还是第⼀次焊,不过看过⽜⼈焊过贴⽚式的芯⽚,⽆⾮就是先把引脚对齐;加焊锡固定并⼤量上錫;在⽤扁平的电烙铁将焊锡除去,OK!焊好后,因为我之前有STC-ISP下载模块,USB接⼝的,但是我按原理图接上,TXD——RXD的原则,在下载最新的STC-ISP(V6.33),这软件改变的很多,增加了很多⼯具,对于开发⼈员很⽅⾯,就连延时函数都不⽤⾃⼰调试,直接给你⽣成汇编或者C代码。