用纯C语言实现C8051F单片机的在线程序更新
C8051F020单片机初始化程序和编译步骤
C8051F020单片机初始化程序和编译步骤2011-02-15 12:20:06| 分类:默认分类| 标签:|字号大中小订阅C8051F020编程步骤一、编程步骤:1、看门狗设置2、系统初始化3、端口初始化4、对应功能初始化(如:串口,定时器,I2C,SPI,PCA,DAC/ADC,中断等等)5、功能函数或中断函数(如需要)6、包含的头文件7、项目说明二、对应功能初始化要点:1、Uart:(1)串口工作模式由SCON设定(2)定时器工作方式设定TMOD (3)波特率TH 载入值设定(4)启动TR1 (5)时钟基准CKCON (6)波特率加倍设定PCON(7)开中断使能TI2、Time:(1)工作方式设定TMOD (2)定时器时钟基准CKCON (3)启动/停止TCON设定TRn3、Interrupt:(1)中断允许IE (2)触发方式设定(上下沿,电平)(3)对应控制位允许设定,如ES串口允许C8051F020单片机初始化程序; $INCLUDE (C8051F020.inc) /C8051F020单片机功能强大,初始化也比较繁杂,为了便于初始化各功能模块,我们编了此程序可看着“说明”初始化。
ORG SYS_INIT;※▲◆●◎★☆△;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;■-- <1> --电源管理; PCON ; POWER CONTROL;■-- <2> --系统时钟和振荡器; OSCXCN ; EXTERNAL OSCILLA TOR CONTROL; OSCICN ; INTERNAL OSCILLA TOR CONTROL;■-- <3> --复位及看门狗管理; RSTSRC ; RESET SOURCE; WDTCN ; W A TCHDOG TIMER CONTROL;■-- <4> --FLASH存储器编程和安全管理; FLSCL ; FLASH MEMORY TIMING PRESCALER; PSCTL ; PROGRAM STORE R/W CONTROL; FLACL ; FLASH ACESS LIMIT;■-- <5> --中断控制; IE ; INTERRUPT ENABLE; EIE1 ; EXTERNAL INTERRUPT ENABLE 1; EIE2 ; EXTERNAL INTERRUPT ENABLE 2; IP ; INTERRUPT PRIORITY; EIP1 ; EXTERNAL INTERRUPT PRIORITY REGISTER 1; EIP2 ; EXTERNAL INTERRUPT PRIORITY REGISTER 2; P3IF ; PORT 3 EXTERNAL INTERRUPT FLAGS;■-- <6> --端口IO初始化及交叉开关设置; XBR0 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 0; XBR1 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 1; XBR2 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 2; P0MDOUT ; PORT 0 OUTPUT MODE CONFIGURA TION; P1MDOUT ; PORT 1 OUTPUT MODE CONFIGURA TION; P2MDOUT ; PORT 2 OUTPUT MODE CONFIGURA TION; P3MDOUT ; PORT 3 OUTPUT MODE CONFIGURA TION; P74OUT ; PORTS 4 - 7 OUTPUT MODE;■-- <7> --外部RAM和片内XRAM; EMI0CN ; EXTERNAL MEMORY INTERFACE CONTROL; EMI0CF ; EXTERNAL MEMORY INTERFACE (EMIF) CONFIGURA TION ; EMI0TC ; EXTERNAL MEMORY;■-- <8> --定时器设置; TMOD ; TIMER MODE; TCON ; TIMER CONTROL; T2CON ; TIMER 2 CONTROL; T4CON ; TIMER 4 CONTROL; TMR3CN ; TIMER 3 CONTROL; TMR3RLL ; TIMER 3 RELOAD REGISTER - LOW BYTE; TMR3RLH ; TIMER 3 RELOAD REGISTER - HIGH BYTE; TMR3L ; TIMER 3 - LOW BYTE; TMR3H ; TIMER 3 - HIGH BYTE;■-- <9> --串行通讯; SCON0 ; SERIAL PORT 0 CONTROL; SCON1 ; SERIAL PORT 1 CONTROL; SBUF1 ; SERAIL PORT 1 DA TA; SADDR1 ; SERAIL PORT 1; PCON ; POWER CONTROL; RCAP2L ; TIMER 2 CAPTURE REGISTER - LOW BYTE; RCAP2H ; TIMER 2 CAPTURE REGISTER - HIGH BYTE; RCAP4L ; TIMER 4 CAPTURE REGISTER - LOW BYTE; RCAP4H ; TIMER 4 CAPTURE REGISTER - HIGH BYTE; SADDR0 ; SERIAL PORT 0 SLA VE ADDRESS;■-- <10> --可编程计数器阵列; PCA0CN ; PCA 0 COUNTER CONTROL; PCA0MD ; PCA 0 COUNTER MODE; PCA0CPM0 ; CONTROL REGISTER FOR PCA 0 MODULE 0; PCA0CPM1 ; CONTROL REGISTER FOR PCA 0 MODULE 1; PCA0CPM2 ; CONTROL REGISTER FOR PCA 0 MODULE 2; PCA0CPM3 ; CONTROL REGISTER FOR PCA 0 MODULE 3; PCA0CPM4 ; CONTROL REGISTER FOR PCA 0 MODULE 4;■-- <11> --SMBus通讯; SMB0CN ; SMBUS 0 CONTROL; SMB0CR ; SMBUS 0 CLOCK RA TE; SMB0STA; SMBUS 0 STA TUS; SMB0DA T ; SMBUS 0 DA TA; SMB0ADR ; SMBUS 0 SLA VE ADDRESS;■-- <12> --SPI总线通讯; SPI0CKR ; SERIAL PERIPHERAL INTERFACE 0 CLOCK RA TE CONTROL ; SPI0DA T ; SERIAL PERIPHERAL INTERFACE 0 DA TA; SPI0CFG ; SERIAL PERIPHERAL INTERFACE 0 CONFIGURA TION; SPI0CN ; SERIAL PERIPHERAL INTERFACE 0 CONTROL;-- <13> --ADC转换; AMX0CF ; ADC 0 MUX CONFIGURA TION; AMX0SL ; ADC 0 MUX CHANNEL SELECTION; ADC0CF ; ADC 0 CONFIGURA TION; ADC0CN ; ADC 0 CONTROL; ADC0L ; ADC 0 DA TA - LOW BYTE; ADC0H ; ADC 0 DA TA - HIGH BYTE; ADC1CF ; ADC 1 ANALOG MUX CONFIGURA TION; AMX1SL ; ADC 1 ANALOG MUX CHANNEL SELECT; ADC1CN ; ADC 1 CONTROL; ADC0GTL ; ADC 0 GREA TER-THAN REGISTER - LOW BYTE; ADC0GTH ; ADC 0 GREA TER-THAN REGISTER - HIGH BYTE; ADC0LTL ; ADC 0 LESS-THAN REGISTER - LOW BYTE; ADC0LTH ; ADC 0 LESS-THAN REGISTER - HIGH BYTE; REF0CN ; VOLTAGE REFERENCE 0 CONTROL; ADC1 ; ADC 1 DA TA;■-- <14> --DAC转换; PCA0L ; PCA 0 TIMER - LOW BYTE; PCA0H ; PCA 0 TIMER - HIGH BYTE; DAC0CN ; DAC 0 CONTROL; DAC1L ; DAC 1 REGISTER - LOW BYTE; DAC1H ; DAC 1 REGISTER - HIGH BYTE; DAC1CN ; DAC 1 CONTROL;■-- <15> --比较器设置; CPT0CN ; COMPARA TOR 0 CONTROL; CPT1CN ; COMPARA TOR 1 CONTROL; EMI0TC ; EMIF TIMING CONTROL;■-- <16> --时钟/电压基准设置; CKCON ; CLOCK CONTROL; SADEN1 ; SERIAL PORT 1 SLA VE ADDRESS MASK; SADEN0 ; SERIAL PORT 0 SLA VE ADDRESS MASK; P1MDIN ; PORT 1 INPUT MODE; PSW ; PROGRAM STA TUS WORD; B ; B REGISTER; WDTCN ; W A TCHDOG TIMER CONTROL;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;;==================================================================== ; function: Init_CTS 定时器/计数器,中断和串行通讯初始化子程序; input: -----------------; output: -----------------; usage: -----------------;==================================================================== THS0 equ 0a8hTLS0 equ 09ah; THS1 equ 0fah;0feh;0fah;-4800;0f4h; TLS1 equ 0fah;0feh;0fah;-4800;0f4h;; THS2 equ 0ffh;0feh;0fah;-4800;0f4h; TLS2 equ 0b8h;0feh;0fah;-4800;0f4hInit_TCS: ;定时器/计数器,中断和串行通讯初始化子程序;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓; ◆◆◆8051内部控制寄存器◆◆◆;****************************************************************************** ******;|名称| 代号| 地址|位寻| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|电源控制| PCON | 87H | NO |SMOD | -- | -- | -- | GF1 | GF0 | PD | IDL |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时控制| TCON | 88H | YE |TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时模式| TMOD | 89H | NO |1GA TE| 1C/T | 1M1 | 1M0 | 0GA TE| 0C/T | 0M1 | 0M0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|串行控制| SCON | 98H | YE |SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断允许| IE | A8H | YE |EA| -- | ET2 | ES | ET1 | EX1 | ET0 | EX0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断优先| IP| B8H | YE |-- | -- | PT2 | PS | PT1 | PX1 | PT0 | PX0 |;****************************************************************************** ******;时钟频率为:11.059200MHz;;机器周期为:12/fosc=1.085069μs;;CT0定时器设定延时为:2000μs;;CT0定时器工作于模式0;;CT0溢出处理采用中断方式;;CT0选择内部时钟;;CT0启动由TR0的0/1决定;;设定波特率为:4800bps;;串口0工作于方式1--T1定时器工作于方式2;;串口1工作于模式3--T2定时器用于波特率发生器4800bpsmov TH0, #THS0mov TL0, #TLS0; mov TH1, #THS1; mov TL1, #TLS1; mov TH2, #THS2; mov TL2, #TLS2;▲■-- <1> --电源管理;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓;87H---PCON-------电源控制寄存器;复位值: 00000000;位7-2:保留。
基于单片机C8051F的智能温控系统的设计与实现
基于单片机C8051F的智能温控系统的设计与实现.txt“我羡慕内些老人羡慕他们手牵手一直走到最后。
━交话费的时候,才发现自己的话那么值钱。
·490·计算机测量与控制.2009.17(3)Computer Measurement & Control 控制技术中华测控网收稿日期:2008-07-27; 修回日期:2008-08-30。
基金项目:西北工业大学创新实验室资助项目(07031)作者简介:赵跃齐(1983-),在读研究生,主要从事计算机测控技术方向的研究。
马瑞卿(1963-),教授,博士,主要从事电机智能控制技术方向的研究。
文章编号:1671-4598(2009)03-0490-02 中图分类号:TP274·5文献标识码:A基于单片机C8051F的智能温控系统的设计与实现赵跃齐,马瑞卿,梁贵毅,曾重,梁波(西北工业大学自动化学院,陕西西安710072)摘要:随着自动化水平的不断提高,工业现场对温度的控制越来越高,设计了一种适用于现代工业现场的实时高精度温度监控系统;采用单片机C8051F020和PC机相结合,具有数据采集、数据显示、数据通信及数据存储等功能,通过RS485总线和上位机相连,上位机可以通过软件对系统进行设置和控制,系统同时通过液晶模块实时显示监测到的温度和万年历;试验证明,本系统具有一定的实时高精度性能,有着很强的推广价值。
关键词:单片机;智能温控;液晶模块;上位机Design and Realization of Intelligent Temperature Control SystemBased on C8051F MicrocontrollersZhao Yueqi, Ma Ruiqing, Liang Guiyi, Zeng Zhong, Liang Bo(Automation College, Northwestern Polytechnical University, Xi an 710072, China) Abstract:With the continuous improvement of automated level, the requirements for temperature control is more and more high in in-dustry scene. This article develops a temperature control system, which can suit to modern industry, use single chip computer C8051F020and personal computer together, have the functions of data acquisition, data display, data communication and data storage. implementedthrough RS485 connect to host conputer, the host computer can use software to control and setting the system , at the same time, the sys-tem can display the temperature and calendar by LCD module in time. The practical results has proved that this system has high precisionand worthy of using abroad.Key words:microcontrollers; intelligent temperature control; LCD module; host computer0 引言现代工业技术的自动化程度在不断提高。
C8051F02X系列例程源代码
AN022
相关器件
此应用笔记适用于下列器件 C8051F020 C8051F021 C8051F022 C8051F023
C8051F02X系列带注释
C
例程
引言
本应用笔记包含用C语言编写的例程代码是使用C8051F02X系列器件应用软件开发的起点
按外设划分的程序索引
下面的简要描述提供了附件程序的索引 按外设划分
DAC0_DTMF1.c
次例程源代码在ADC0输出双音多频音调 用定时器4管理和定时 根据常数<SAMPLERATED>确定的速率定时更新DAC0的输出 并使
振荡_Cry1.c
此例程说明如何配置外部振荡器驱动22.1184Mhz晶体 及如何选择此外部振荡器作为系统时钟 同时使能 丢失时钟检测器复位功能 假定22.1184Mhz晶体连接在XTAL1和XTAL2之间
C
例程
ADC0转换的结果经计算得温度值从UART0传输
ADC0_Poll1.c
此例程说明了ADC0在查询模式的操作 ADC0设置为写AD0BUSY作为其转换开始信号 器的输出 温度传感器的输出转换成摄氏度并从UART0传输 并测量片内温度传感
DAC0举例
下面是DAC0的使用例程 如果有必要很容易将其变成DAC1的例程
ADC0_Int1.c
此程序为使用ADC0的例程 在中断模式使用定时器3溢出作为开始启动信号测量片内温度传感器的输出 ADC0的转化结果经计算的温度从UART0传输
ADC0_Int2m.c
此程序为使用ADC0的例程 在中断模式使用定时器3溢出作为开始启动信号测量从AIN0到AIN7的电压和温 度传感器 ADC0转换结果经计算从UART0传输
ADC0_OSA1.c
C8051F系列单片机开发与C语言编程
C8051F系列单片机开发与C语言编程张喜红;祁怀远;李鹏【摘要】Silicon Laboratories公司出品的C8051F单片机是一种完全集成的混合信号系统级芯片(SOC),具有与MCS-51完全兼容的指令内核.该系列单片机采用流水线处理技术,不再区分时钟周期和机器周期,能够在执行指令期间预处理下一条指令,从而提高了指令的执行效率.【期刊名称】《电子产品可靠性与环境试验》【年(卷),期】2011(029)003【总页数】4页(P40-43)【关键词】单片机;模块;编程【作者】张喜红;祁怀远;李鹏【作者单位】陕西烽火通信集团有限公司,陕西,宝鸡,721006;陕西烽火通信集团有限公司,陕西,宝鸡,721006;陕西烽火通信集团有限公司,陕西,宝鸡,721006【正文语种】中文【中图分类】TP368.11 引言C8051F系列单片机为CIP51处理器,在指令集上与传统MCS-51完全兼容;然而在系统构架、外围设备等方面有很大的改进,使得集成度更高,运行速度更快。
与传统51单片机相比,C8051F系列单片机有以下特征:1)低电压供电(2.7~3.6 V),输入端口兼容 5 V电压,输出有开漏和推挽模式;2)集成JTAG调试器,可在线调试和下载;3)多复位源,有看门狗复位、电源电平监视复位、时钟失步复位及比较器复位等,以满足各种需求;4)处理器最高运行时钟可达25 MHz,可用片内时钟,也可用外部时钟;5)2个12位DAC模块,DAC为电压输出型,输出无需再接运放而将电流转化为电压;6)1个12位ADC模块和1个8位ADC模块;7)一个芯片温度传感器,可检测芯片温度;8)3个史密斯比较器模块;9)集成CAN控制器,带有32个消息对象,每个消息对象有独立的地址;10)5个定时器,其中T2、T3和T4为增强型定时器,可灵活地配置成频率可调方波输出和事件捕捉;11)6个PCA模块,可实现PWM输出、方波输出和事件捕捉等;12)1个SPI串行外围设备接口控制器;13)1个SMBUS总线控制器,与I2C总线完全兼容;14)1个带硬件地址控制的串行总线UART0和1个普通串行总线UART1;15)2个外部事件中断;16)中断源一共可达20个;17)64 kB Flash ROM,256字节片内内存和4 kB外部内存;18)引入交叉开关配置,可将外围设备灵活地配置到 P0~P3口。
在KEIL4环境下开发C8051F系列的单片机
在KEIL4环境下开发C8051F系列的单片机:在安装完KIEL4以后还需要安装C8051F_uVision.exe(由Silicon laboratory公司提供的AGDI,在其官网上下载);此AGDI提供以下三个方面的功能:1:提供最新的C8051F系列单片机的器件数据库2:提供通过ECX系列或其他兼容在线调试器提供调试接口3:提供对C8051F系列单片机的FLASH接口安装Sic8051F_uVision.exe文件需在Keil安装目录中有TOOLS.INI文件,其内容主要如下:[UV4]ORGANIZATION="sdstar"NAME="Hua_ming", "Yu"EMAIL="sy.m@"BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN)[C51]PATH="C:\Program Files\keil\C51\"VERSION=V9.01TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")TDRV2=BIN\SIC8051F.DLL ("SILICON LABS C8051Fxxx Driver")RTOS0=Dummy.DLL("Dummy")RTOS1=RTXTINY.DLL ("RTX-51 Tiny")RTOS2=RTX51.DLL ("RTX-51 Full")LIC0=UJ512-98S0H-ZGW7Q-NWPHT-8IHFH-6658M其中TDRV0~2 为8051的驱动程序,在安装好Sic8051F_uVision.exe文件后就会在Keil安装目录下生成SIC8051F.DLL文件,安装完毕后,任意打开C51的一个工程(如LED开发工程开Source Code\LED_Flow\project),先进行一系列的设置。
C8051F单片机-Silicon Laboratories IDE的详细使用步骤
C8051F软件使用流程(Silicon IDE)按照步骤操作即可,有图示注:建立Silicon IDE工程必须首先安装Silicon IDE软件1、如下图所示,点击"Project -> New Project"后会弹出新建工程窗口2、如下图所示,在Select Device项目栏中选择相应的单片机型号(这里以"C8051F320"为例),在Projectname项目栏中填写项目名称(这里以"test"为例),在Location项目栏中选择需要保存的路径,这里需要注意一点,保存的路径中最好不要出现中文,否则编译的时候有可能会出错在Project项目栏中可以选择是否需要加载源程序,"Blank Project"代表不加载源程序,"ASM SourceProject"代表加载汇编源程序,"C Source Project"代表加载C源程序(这里以选择"Blank Project"为例),填写完成后点OK3、如下图所示,点击"File -> New File"后会弹出新建项目窗口4、如下图所示,在左边选择需要新建项目的类型(这里以选择新建C文件为例),在File name项目栏中填写新建项目的名字(这里以"test"为例),在Location项目栏中选择工程文件所在的目录,把下面的两个勾打上,填写完成后点击OK,这样就把该项目文件加载到新建工程当中5、这样就新建好一个工程并且有工程文件,在下面空白区域可编写代码6、在Silicon IDE中集成Keil软件注:编译或仿真工程必须安装Silicon IDE以及Keil软件,在本示例中,软件是安装在默认路径下(1)、如下图所示,点击"Project -> Tool Chain Integration"后会弹出设置编译环境窗口(2)、如下图所示,在Select Tool项目栏中选择"Keil",然后依次把Assembler、Compiler、Linker这三个项目栏里的Executable项目更改为如下图所示的路径,更改完后点击OK7、如下图所示,点击“Options -> Connection Options”进入设置下载方式8、如下图所示,设置下载方式,下图中所列的是采用C2接口进行下载/仿真9、如下图所示,点击菜单栏中的"Debug -> Connect"或者按下图红圈中的按钮连接软硬件:10、点击如下图红圈中的按钮,下载程序然后会弹出进度条11、进度条完成后代表程序下载完成,接着就进入仿真界面了,如下图所示。
C8051F开发环境和烧录环境
一.C8051F开发环境之Keil C51
以下图是开发环境遇面。
利用Keil C51的话,那么需要安装C8051F系列单片机的调试驱动程序。
那个程序能够在Silabs的官方网上下载。
或更新的版本。
在安装那个程序前需要先安装Keil C51. 然后把上述文件安装到Keil C51所在的目录。
安装完毕后,任意打开C51的一个工程(如开发板工程Source Code\LED_Flow\project),先进行一系列的设置。
如下所示:
第一步:在Project 菜单下面选择Option for Target “xxxxxx”
第二步:点击后打开选项对话框,在Debug选项卡上,选择如以下图所示。
第三步:选择FLASH烧写工具,在同一个对话框被选择Utilities
最好选择OK确认,Keil C51 调试和烧写环境就配置好了。
咱们以开发板的Source Code\LED_Flow\project为例,打开后
第一步:按Rebuild all target files从头编译整个工程。
第二步:用C2调试器连接开发板,上电,点击Keil C51的Start/Stop Debug Session. 假设是没有问题的话,将弹出烧写FLASH的窗口:
二、烧录环境配置和烧录步骤
能够用u-ec5中文下载程序直接进行单片机程序的烧录(烧录文件为HEX的文件):
一、先安装u-ec5中文下载程序
二、进行烧录端口配置:1)点菜单栏的选择:取得:
确保调试接口类型为C2,选择‘USB系列’!
3、烧录步骤:见图中所示
烧录完毕后退出!。
成功解决了C8051F单片机的在线更新程序
函数,一般格式为?PR?FUN?FILE,其中FUN为用户函数名大写,FILE是函数所在文件。具体
可参考Keil C51帮助文件。
如图所示,第一句“?PR?MAIN?BOOTLOADER (C:0XA000),”将BootLoader中的main函数定位
说只有00和01两种,分别为“数据”和“结束”类型;DDDDD…..为具体的数据;ZZ为校
验。具体请参考《Hex文件格式说明》。在用文本编辑工具打开主程序和BootLoader的Hex文
件后,将BootLoader中BBBB为A000后的所有数据(不包括结束行)都拷贝到主程序的Hex文
件的结束行之前即可。
2. 建立两个项目,分别是主程序和BootLoader程序,分别进行编译。对
BootLoader程序中的函数进行绝对定位使其定位于0xA000之后。这样可以彻底解决上面的问
题。这样在生成Hex文件后需要将两个Hex文件进行合并(具体方法见下文),虽然会增加一
些麻烦但却可以解决很多问题,何乐而不为呢?
Link命令中的函数绝对定位方法较为简单,如图1所示:
图1: Link命令的程序绝对定位
在采用LX51进行链接的情况下,打开项目设定对话框,在LX51页的User Segments框中对你
所需要绝对定位的程序进行设定。
Keil C51中对于不同的程序类型有着不同名称前缀,比如对于用户函数采用“?PR?”前缀,
用纯C语言实现C8051F单片机的在线程序更新
1 概述
C8051F单片机是由Silicon Laboratories 公司出品的混合信号系统级芯片(SOC),具有与
C8051F320驱动金鹏2x8C-5液晶C程序
C8051F320驱动金鹏2x8C-5液晶C程序程序师从网上找的,稍加修改,用c8051f320的开发板驱动,能显示字符汉字点阵图形,下面是程序:/*c语言实例st7920标签:无标签ST7920驱动的12864(并行工作方式)*//******************************************************************************Copyright 2007All rights reserved.文件名: .c模块名称:st7920 并行方式驱动12864液晶驱动功能概要:st7920显示驱动取代版本:0.0.1修改人:pulan完成日期:2007.07.08升级说明:createCPU: stc89c58 主频:11.0592M液晶型号:生产厂家:驱动芯片:st7920******************************************************************************///#include <reg52.h> 2009年6月10日修改,用于C8051F320单片机,主频12MH, #include <C8051F320.h> // 两行液晶模块。
HYL修改。
#define uint unsigned int#define uchar unsigned char#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1sbit RS = P2^1; //H=data; L="command";sbit RW = P2^2; //H=read; L="write";sbit E = P2^4; //input enable;sbit PSB= P2^5; //H=并口; L="串口";sbit RST= P2^3; //Reset Signal 低电平有效sbit busy=P0^7; //lcd busy bitvoid wr_lcd (uchar dat_comm,uchar content);void chk_busy (void);void delay (uint us);void delay1 (uint ms);uchar code tab1[]={"本系列中文模块内""置二级字库,可在"};uchar code tab2[]={"任意位置反白显示""使用更方便更灵活"};uchar code tab31[]={"保定市宇恒科技荣""誉出品为您服务!!"//"金鹏科技有限公司"//"Golden Palm TECH"};/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*/ /*-- 宽度x高度=128x32 --*/uchar code tab33[]={0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x7E,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x3E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x30,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1F,0x7C,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x1E,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xDA,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xF2,0x30,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab32[]={/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab5[]={/*-- 调入了一幅图像:F:\梁\画图\COCK.bmp --*//*-- 宽度x高度=128x64 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x43,0x01,0x80,0x00,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xFF,0x07,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0xFC,0x1E,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xBF,0xFF,0xFC,0x00,0x7F,0xFC,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,0x00,0xFF,0xC0,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xDF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xFF,0xE0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x1F,0xFF,0xF0,0x03,0xF8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0xC0,0x7C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xF0,0x00,0x3F,0xFF,0xFF,0xF8,0x1E,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0xFE,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xFF,0x87,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0x83,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xC3,0x88,0x00,0x00,00x00,0x00,0x00,0x7F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xE1,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xE1,0x88,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF1,0x88,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xF3,0x08,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xF2,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xF0,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,//0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x7F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x7E,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x3E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xCF,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x30,0x40,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1F,0x7C,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x1E,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x1E,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xDA,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xF2,0x30,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,00x00,0x00,0x00,0x00,0x0C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/******************************************************************************************* 函数名称:* 功能描述:液晶初始化* 参数:参数名称:输入/输出?类型描述** 返回值:* 作者:* 创建日期:2006-12-19* 全局变量:* 全局静态变量:* 局部静态变量:*----------------------------------------修改历史------------------------------------------* 当前版本:修改人:修改日期:* 修改说明:******************************************************************************************/void init_lcd (void){RST = 1;PSB = 1;wr_lcd(comm,0x30); /*30---基本指令动作*/wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/wr_lcd(comm,0x06); /*光标的移动方向*/wr_lcd(comm,0x0c); /*开显示,关游标*/}/******************************************************************/void SysClkInit(void)//配置系统时钟 C8051F320初始化{OSCICN=0x81;RSTSRC=0x04;}/**********************************************************************/void SystemInit(void)//系统配置 C8051F320初始化{CA0MD&=~0x40;//禁止看门狗定时器EA=1;ES0=1;}/************************************************************/void PortInit(void)//端口配置 C8051F320初始化{//P2MDIN = 0x0F;P2MDOUT = 0xff;//P0MDOUT = 0x7f;// XBR0 = 0x07;XBR1 = 0x40;}/******************************************************************************************* 函数名称:chn_disp* 功能描述:显示汉字或字符* 参数:参数名称:输入/输出?类型描述** 返回值:* 作者:* 创建日期:2006-12-19* 全局变量:* 全局静态变量:* 局部静态变量:*----------------------------------------修改历史------------------------------------------* 当前版本:修改人:修改日期:* 修改说明:******************************************************************************************/void chn_disp(uchar code *chn){uchar i,j;wr_lcd(comm,0x34);wr_lcd(comm,0x05); //第二行反白显示wr_lcd(comm,0x30);wr_lcd(comm,0x80);for(j=0;j<4;j++){if(j==1) //{wr_lcd(comm,0x90);} //修改后可用二行液晶显示,源程序是四行液晶for(i=0;i<16;i++)wr_lcd(dat,chn[j*16+i]);}}/******************************************************************************************* 函数名称:chn_disp1* 功能描述:上半屏显示汉字或字符,此函数可直接用于二行液晶。
C8051F脱机编程器操作指南
C8051F脱机编程器操作指南一. 适用芯片型号:所有C8051F单片机.二. 使用基本步骤1.将用户程序通过USB线下载到脱机编程器中.具体操作步骤如下:A: 将脱机编程器通过USB线连到PC机上.B: 双击应用程序”脱机编程器下载工具”,出现图1下载界面图1.C: 单击下载界面”刷新”按钮,可看到脱机编程器器件序列号: XHL---TJBCQ0001。
界面如下图:D: 单击”连接”,如果PC”连接”按钮变成”关闭”,且脱机编程器显示”已连接PC”,表示编程器与PC通信正常,跳到步骤E.如果点”连接”时,PC界面长时间无反应,请拔掉USB线,重新插入,将下载界面关掉重新打开.再从步骤A开始操作.E: 单击”浏览”, 选择要下载的hex文件.(如果是F12X_13X系列需要分块的芯片. 在KEIL下生成HEX文件,如果生成的不是4个HEX文件,在”C8051F 脱机编程器”装载时显示H0X这时下载后程序不能正常运行。
可以用U-EC5中文下载软件转化一下,在U-EC5中文下载软件里先选择芯片型号然后先装载在KEIL下生成的HEX文件的第一个文件,然后再以HEX文件类型保存,就可以生成4个HEX类型的文件。
在”C8051F脱机编程器”下载时只选择第一个文件H00,加载后显示H03)。
可看到该文件的”文件长度”及”校验和”数据.这两组数据要记录下来,以便与脱机编程器中烧录文件信息对比是否一致。
F: 在”器件型号”下拉菜单中选择使用的芯片型号,单击”下载”. 脱机编程器显示”程序下载中….”.等待PC下载界面显示”文件下载完成”,单击”确定”.G: 单击PC下载界面”关闭”, 脱机编程器回到编程界面.2.用脱机编程器给目标板下载程序.A: 通过USB线或电池给脱机编程器接上电源。
B.用10PIN扁平电缆连接脱机编程器和目标板。
. C. 按面板的▲▼键,选择不同的功能:“芯片编程”,“烧录文件信息”及“编程器设置”。
51单片机C语言编程100例-单片机c语言编程
51单片机C语言编程100例-单片机c语言编程51单片机C语言编程100例在嵌入式系统领域,单片机是常用的硬件平台之一。
而C语言作为一种高级编程语言,能够为单片机编程提供更高的效率和便利性。
本文将介绍51单片机C语言编程的100个实例,帮助读者了解并掌握单片机的基本编程技巧和应用方法。
一、LED灯控制1. 实例介绍:通过控制51单片机的IO口输出,实现对LED灯的亮灭控制。
2. 实例代码:```#include <reg51.h>sbit LED = P1^0; // 定义P1口的第0位为LEDvoid main(){while(1){LED = 0; // LED灯亮delay(1000); //延时1秒LED = 1; // LED灯灭delay(1000); //延时1秒}}```二、数码管显示1. 实例介绍:使用数码管显示数字0-9,并实现数码管的动态显示效果。
2. 实例代码:```#include <reg51.h>unsigned char code DispTab[] ={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82};sbit WeiDu = P1^2;sbit DUAN = P1^0;void delay(unsigned int t){unsigned int i;while(t--)for(i=0;i<125;i++);}void main(){unsigned int i;while(1){P0 = DispTab[i]; // 显示数字iDUAN = 1; //点亮段码DUAN = 0; //关闭段码P0 = ~(0x01 << i); // 选择数码管的位 WeiDu = 0; // 打开选通位WeiDu = 1; // 关闭选通位delay(100); // 延时100msi++;if(i > 9) i = 0;}}```三、外部中断1. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
keil-c的配置及仿真(为c8051f单片机)
关于Keil C的配置及仿真(为C8051F单片机配置)说明:以下配置的软件环境:Keil uv2硬件环境:C8051FXXX目标板(本例选C8051F120) EC3仿真器(JTAG仿真)1、Keil C的安装:安装版本为uv2,选择全安装。
Keil按装好了之后要安装一个插件“SiC8051F_uv2.exe”(如图1所示),这个插件是Keil C支持C8051F 单片机编程的驱动。
图12、打开Keil C,进行Keil C的配置:2.1打开Keil C,新建一个工程,保存并命名。
如图2.1所示图2.12.2左键选中该工程“Target1”,右键单击“Target1”会弹出一个对话框,在对话框中选中“options for Target ‘Target1’”,会弹出一个对话框“options for Target ‘Target1’”,如图2.2所示。
图2.22.3对话框“options for Target ‘Target1’”有几个配置选项,分别是Device、Target、 Output、 Listing 、C51、 A51、 Bl51 Misc 、Debug 、Utility。
首先进行Device配置,单片机选择C8051F120,如图2.3所示。
图2.32.4然后进行Target设置,XTAL选择25,如图2.4所示。
图2.42.5进行Output设置,勾选Create HEX Fi:,HEX后的复选框选择HEX-80,如图2.5所示。
图2.52.6配置Debug,选中Use:, Use:后的复选框选择Silicon LaboratoriesC8051FXXX Driver,如图2.6.1所示。
连接上仿真器,单击Settings,会弹出Target Setup对话框,勾选Use Debug Adapter 1.2.0.0 ,以及Power Target After Disconnect。
51单片机C语言编程100例单片机c语言编程
51单片机C语言编程100例单片机c语言编程单片机是一种常用于嵌入式系统的微型计算机,可以根据预设的程序来执行指令。
而C语言是一种高级编程语言,具有较强的可读性和可移植性。
在单片机编程中,C语言是常用的编程语言之一。
本文将介绍51单片机C语言编程中的100个实例,帮助读者了解单片机编程的基本概念和技巧。
1. LED灯闪烁这是一个简单的实例,用于让LED灯交替闪烁。
在C语言中,可以使用宏定义和循环语句来实现:```c#include <reg52.h>#define LED P1void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){while (1) //循环执行{LED = 0xFF; //LED灯亮delay(1000); //延时1秒LED = 0x00; //LED灯灭delay(1000); //延时1秒}}```2. 数码管显示这个实例演示了如何使用数码管进行数字显示。
在C语言中,可以通过控制IO口状态来实现:```c#include <reg52.h>#define LED P0unsigned char code digit[] ={ //数码管显示值表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){unsigned int i;while (1) //循环执行{for(i=0;i<10;i++){LED = digit[i]; //显示数字delay(1000); //延时1秒}}```3. 蜂鸣器发声这个实例展示了如何使用蜂鸣器进行声音发声。
在KEIL4环境下开发C8051F系列的单片机
在KEIL4环境下开发C8051F系列的单⽚机在KEIL4环境下开发C8051F系列的单⽚机:在安装完KIEL4以后还需要安装C8051F_uVision.exe(由Silicon laboratory公司提供的AGDI,在其官⽹上下载);此AGDI提供以下三个⽅⾯的功能:1:提供最新的C8051F系列单⽚机的器件数据库2:提供通过ECX系列或其他兼容在线调试器提供调试接⼝3:提供对C8051F系列单⽚机的FLASH接⼝安装Sic8051F_uVision.exe⽂件需在Keil安装⽬录中有TOOLS.INI⽂件,其内容主要如下:[UV4]ORGANIZATION="sdstar"NAME="Hua_ming", "Yu"EMAIL="sy.m@/doc/3b52b0379b6648d7c1c746d3.html "BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN)[C51]PATH="C:\Program Files\keil\C51\"VERSION=V9.01TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")TDRV2=BIN\SIC8051F.DLL ("SILICON LABS C8051Fxxx Driver")RTOS0=Dummy.DLL("Dummy")RTOS1=RTXTINY.DLL ("RTX-51 Tiny")RTOS2=RTX51.DLL ("RTX-51 Full")LIC0=UJ512-98S0H-ZGW7Q-NWPHT-8IHFH-6658M其中TDRV0~2 为8051的驱动程序,在安装好Sic8051F_uVision.exe⽂件后就会在Keil安装⽬录下⽣成SIC8051F.DLL⽂件,安装完毕后,任意打开C51的⼀个⼯程(如LED开发⼯程开Source Code\LED_Flow\project),先进⾏⼀系列的设置。
C8051F系列SOC单片机原理及应用课程设计
C8051F系列SOC单片机原理及应用课程设计一、引言C8051F系列SOC单片机是由美国Silicon Labs公司推出的一款面向嵌入式应用的单片机。
SOC单片机,即System-on-a-Chip单片机,是指将系统多个部分如中央处理器(CPU)、存储器、输入输出等集成在一个芯片上的单片机。
本文将重点介绍C8051F系列SOC单片机的原理和应用,并提出一种基于C8051F系列SOC单片机的自动喷涂机控制系统设计方案。
此设计方案旨在提高自动喷涂机生产效率和产品质量,降低出错率,减少人工成本。
二、C8051F系列SOC单片机基础知识2.1 单片机基础概念单片机作为一种重要的集成电路,其内部集成了处理器、存储器、输入输出端口等多种功能,可用于控制、计算等多种应用。
常用的单片机包括51、AVR、PIC等。
2.2 C8051F系列SOC单片机特点C8051F系列SOC单片机是由美国Silicon Labs公司推出的一款高性能、低功耗的嵌入式单片机,主要特点如下:•高性能:C8051F系列SOC单片机采用C8051F系列CPU,运行速度高,且具有很强的计算能力;•低功耗:C8051F系列SOC单片机内置了多种节能技术,可有效降低功耗,提高电池续航时间;•丰富的外设:C8051F系列SOC单片机集成了多种输入输出端口,包括ADC、PWM、UART、SPI等,可适用于不同的应用场景;•多种封装:C8051F系列SOC单片机适用于多种封装方式,包括QFN、SSOP、TSSOP等。
2.3 C8051F系列SOC单片机原理C8051F系列SOC单片机由CPU、存储器、输入输出端口等多种功能模块组成。
其中,CPU是单片机的核心部件,主要用于控制程序的执行;存储器分为闪存和RAM两部分,闪存用于存储程序代码和数据,RAM用于存储变量和中间结果;输入输出端口包括GPIO、PWM、ADC等。
C8051F系列SOC单片机的工作流程如下:首先将程序代码烧录到闪存中,然后由CPU控制程序按照指令执行。
C8051F系列单片机串口通讯程序
C8051F系列单片机串口通讯程序C8051F系列单片机串口通讯程序采用C8051F020单片机//串口编程--接收PC发过来的字符串,回发字符串.发送期间中断控制LED灯闪烁//采用外部晶振22.1184MHz 使用定时器1,方式2产生波特率,SMOD = 0或者 1 //定时器初值X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384)/#includesfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器#define uchar unsigned char#define uint unsigned int//----------------------------------------------------------------------//参数设置区//----------------------------------------------------------------------#define BAUDRATE 4800 //波特率bps#define CLKOUT 22118400 //外部晶振,修改也要修改OSCXCN #define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1 #define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值#define MAX_LEN 10 //每次接收/发送字符串的长度//---------------------------------------------------------------------//全局变量//---------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮'0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idata trdata[MAX_LEN]; //要接收/发送的字符串//----------------------------------------------------------------------//子函数声明//---------------------------------------------------------------------- void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序//---------------------------------------------------------------------- //主函数//---------------------------------------------------------------------- void main(void){WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(CLKOUT/12/10); //定时器初始化EA = 1; //开全局中断while(1){if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdata,MAX_LEN); //发送字符串}}}//----------------------------------------------------------------------//子函数具体实现//----------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111 for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 }//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交*开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口0100,0000}//串口初始化void UART0_Init(void){SCON0 = 0x50; //选择串口方式1,波特率可变SCON0=0101,0000TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bpsTL1 = (int)TXVAL;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1 TI0 = 1; //声明TX0就绪,可以发送TR0 = 1;}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0 {TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1 {uchar rxch;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdata[readCounts] = rxch; //存入数组,供发送readCounts++;}}//------------------------------------------------------------- //程序结束。
51单片机C语言编程100例
C8051F021单片机实验指导
提要:实验项目1、单片机的IO编程实验1 IO开关量输入实验实验2 IO输出驱动继电器(或光电隔离器)实验实验3 IO输入/输出------半导体温度传感器DS18B20实验2、单片机的中断系统实验1 外部外部中断----脉冲计数实验3、单片机的定时器/计数器实验1 计数器实验实验2 秒时钟发生器实验4、单片机的串口特点和编程实验1 PC机串口通讯实验实验2 RS485通讯实验5、存储器实验1 RAM存储器读写实验6、PWM发生器实验1 PWM发生器(模拟)实验实验1 PWM发生器(内部)实验7、WDG看门狗实验1 外扩WDG(MAX813)实验实验2 WDG(内部)实验8、SPI总线实验1 SPI(模拟)实验-----TLC2543 AD转换实验实验2 SPI(模拟)实验-----TL V5616 DA转换实验9、I2C总线实验1 I2C(模拟)实验-----A T24C01读写实验实验2 I2C(内部)实验-----A T24C01读写实验10、综合实验实验1 HD7279LED数码管显示实验实验2 HD7279键盘实验实验3 外部中断---电机转速显示实验11、步进电机正反转实验12、TFT液晶显示彩色条纹实验13、16X16LED点阵显示汉字实验一、单片机的IO编程实验1 IO开关量输入实验目的:学习单片机读取IO引脚状态的的方法。
内容:编程读取IO引脚状态。
设备:EL-EMCU-I试验箱、EXP-C8051F021 CPU板。
编程:首先要把相关的引脚设置在IO的输入状态,然后写一个循环,不停地检测引脚的状态。
步骤:1、将CPU板正确安放在CPU接口插座上,2、连线:用导线将试验箱上MCU部分的IO1--- IO8分别连接到SWITCH 的8个拨码开关的K1---K8的输出端子K1---K8上,连接好仿真器。
3、试验箱上电,在PC机上打开Keil C环境,打开试验程序文件夹IO_INPUT 下的工程文件IO_INPUT.Uv2编译程序,上电,在函数main()的最后一句设置断点,进入调试状态,打开窗口Peripherals-->IO-Port-->P3,改变开关状态,运行程序到断点处,观察窗口的数值与开关的对应关系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用纯C语言实现C8051F单片机的在线程序更新1 概述C8051F单片机是由Silicon Laboratories 公司出品的混合信号系统级芯片(SOC),具有与MCS-51指令集完全兼容的高速CIP-51内核;峰值速率可达100MIPS;在一个芯片内集成了构成一个单片机数据采集或控制系统所需要的几乎所有模拟和数字外设及其他功能部件;具有大容量的可在系统(ISP)和在应用(IAP)编程的FLASH存储器。
Keil C51作为当今最通用的C51编程IDE。
C8051F每个MCU 都有一个片内符合IEEE 1149.1 规范的JTAG 接口和逻辑,提供生产和在系统测试所需要的边界扫描功能,支持闪存的读和写操作以及非侵入式在系统调试。
对于MCU 的程序更新,最方便的办法是使用JTAG进行程序下载,但是这需要使用专用的编程器,这在产品售出后进行更新几乎是不可能的。
2 整体思路在线更新程序采用串口进行程序更新,分为主程序部分和bootloader部分,整体思路为:1) 在MCU复位时由主程序部分向上层PC发送握手信号,并等待回复;2) 如果上层PC收到握手信号则发送握手确认信号;3) 如果MCU在一段时间内(一般为200ms)没有收到握手确认信号则进入主程序。
4) 如果MCU收到握手确认信号,则发送确认信号用以告诉PC可以进行程序更新。
同时MCU进入BootLoader程序准备接收更新数据5) PC发送准备更新信号;6) MCU清除FLASH,发送确认信号,准备接收数据。
7) PC发送一帧数据,然后等待确认;8) MCU将收到的数据写入FLASH,然后发送确认帧;9) PC在收到确认帧后回到第七步直到数据全部发送完毕;10) MCU收完全部数据并写入FLASH并发送确认帧后,将写入FLASH的全部数据分帧一次性发送给PC;11) PC对收到的数据进行校验;12) 如果校验失败则回到第五步重新进行程序更新;13) 如果校验正确则更新完成;3 程序定位与绝对地址调用在BootLoader程序中需要删除主程序部分的Flash,而BootLoader程序则必须在整个程序运行过程中都存在,因此必须将两部分程序进行分别定位。
由于主程序中需要用到中断,而中断向量表必须放在程序空间的低地址,所以一般将主程序放在由0地址起始的位置(预设情况也是如此),将BootLoader程序放在高地址。
本人程序中,主程序大概为20K Byte,在给其一定余量后决定将BootLoader程序放在40K起始的位置,即0xA000开始的地方。
程序的分块有两种方法:1. 使用连接程序(link)命令将BootLoader程序中的所有函数进行绝对定位。
但是这种办法存在很大弊端,Keil C51在对程序进行优化过程中会对程序中的公用模块进行调用,比如BootLoader程序中只是简单的一个对数组变量的赋值,就有可能调用主程序中相类似的模块,如果这时候主程序已经被删除,则会使程序跑飞。
如果采用降低优化等级的办法禁止公用模块,则会使程序体积大大提高,因此此方法不可取。
2. 建立两个项目,分别是主程序和BootLoader程序,分别进行编译。
对BootLoader程序中的函数进行绝对定位使其定位于0xA000之后。
这样可以彻底解决上面的问题。
这样在生成Hex文件后需要将两个Hex文件进行合并(具体方法见下文),虽然会增加一些麻烦但却可以解决很多问题,何乐而不为呢?Link命令中的函数绝对定位方法较为简单,如图1所示:图1:Link命令的程序绝对定位在采用LX51进行链接的情况下,打开项目设定对话框,在LX51页的User Segments框中对你所需要绝对定位的程序进行设定。
Keil C51中对于不同的程序类型有着不同名称前缀,比如对于用户函数采用“?PR?”前缀,而对于库函数采用“?C?”前缀,对于用户使用code定义的常量则使用“?CO?”前缀。
对于函数,一般格式为?PR?FUN?FILE,其中FUN为用户函数名大写,FILE是函数所在文件。
具体可参考Keil C51帮助文件。
如图所示,第一句“?PR?MAIN?BOOTLOADER (C:0XA000),”将BootLoader中的main函数定位于0XA000地址。
第二句“?PR?*?BOOTLOADER,”将除main函数之外的所有其他函数定位于main函数之后。
第三句“?C?*,”将所有库函数定位于用户函数之后。
第四句“?CO? BOOTLOADER”将所有BootLoader中用到的常量定位于库函数之后。
注意最后一句不需要逗号结尾。
这儿可以自由设定其先后次序但是必须注意的是main函数必须绝对定位于0xA000,以便于主程序进行绝对地址调用。
主程序在握手成功后需要调用BootLoader程序中的main函数,但是因为它们是不同的两个项目进行编译的,所以不能直接进行调用,必须采用绝对调用的方法,可以采用函数指针的方法,具体如下:void (*update)()=0xA000; //定义函数指针指向0XA000Init_Device(); //初始化芯片EA=0; //关中断if (HandShake()) //主程序的握手程序update(); //调用BootLoaderEA=1; //开中断4 程序优化对于主程序来说,它是一个完整的程序,所以它能够进行完全的优化方法,即可以设定为最高优化等级(9级)。
然而BootLoader程序在运行过程中不能调用除本身程序外的其他任何程序,但是如果采用9级优化则Keil C51会在0地址起始的地方放置一些公用程序模块,因此BootLoader程序的最高优化等级为8级。
5 全局变量的初始化BootLoader中全局变量如果采用定义时初始化的办法,如“int a=0”;,则会在0地址处存放全局变量初始化代码,这肯定也是不允许的。
所以对于全局变量的初始化可以在main 函数内进行。
6 堆栈指针(SP)的初始化BootLoader程序中在低地址处会进行堆栈指针的初始化,因为BootLoader程序是由主程序进行调用的,所以并不会真正调用的SP指针初始化的程序,因此我们需要在BootLoader的main函数中对SP指针进行初始化。
具体的对SP值设多少合适我们可以先看看程序的编译结果。
如图2所示,BootLoader程序编译后使用28个字节的data变量,因此我们只要设定的SP比28大即可,在本项目中设定为64。
图2:程序编译结果7 串口的使用一般在MCU中使用串口都是中断方式,但在BootLoader中,因为不能到低地址的中断向量表,因此只可以采用查询方式。
8 Hex文件的处理与Bin文件的生成在正确生成两个Hex文件后,需要对它们进行合并,再使用编程器下载到芯片内部,以后就可以用串口进行在线编程了。
Hex文件为标准文本文件,每一行都具有固定的格式:”:AABBBBCCDDDDDDD….ZZ”。
冒号是行起始符号;AA是本行的数据长度;BBBB为数据存放地址;CC为数据类型,对于Keil C51来说只有00和01两种,分别为“数据”和“结束”类型;DDDDD…..为具体的数据;ZZ为校验。
具体请参考《Hex文件格式说明》。
在用文本编辑工具打开主程序和BootLoader的Hex 文件后,将BootLoader中BBBB为A000后的所有数据(不包括结束行)都拷贝到主程序的Hex 文件的结束行之前即可。
Bin文件是Hex文件的二进制格式,用它进行程序更新则PC端程序可以较为简单。
生成Bin 文件可以用HexBin.exe工具。
在对主程序Hex文件生成Bin文件后就可以由PC程序发送给MCU 进行程序更新了。
9 源程序范例9.1 主程序部分的握手程序//--------------------------------------------------------------------------bool HandShake(){uint8 i,j,ft;uint16 k;uint8 code shakeA[]={0xfe,0x23,0x54,0x78,0x93,0xab};uint8 code shakeB[]={0x34,0x26,0xcd,0xfc,0x9d,0x77};uint8 xdata shakebuf[6];SFRPAGE=1;TI1=0;SBUF1=shakeA[0];SFRPAGE=0;for (i=1;i<6;i++){SFRPAGE=1;while(TI1==0);TI1=0;SBUF1=shakeA[i];SFRPAGE=0;}SFRPAGE=1;RI1=0;SFRPAGE=0;for (j=0;j<100;j++){for (k=0;k<10000;k++){SFRPAGE=1;ft=RI1;SFRPAGE=0;if (ft)break;Delay_u(5);};if (k==10000)return false;memmove(shakebuf,shakebuf+1,5);SFRPAGE=1;RI1=0;shakebuf[5]=SBUF1;SFRPAGE=0;if (memcmp(shakebuf,shakeB,6))return true;}return false;}//-------------------------------------------------------------------------- 9.2 BootLoader程序中的主函数/*13 7E:文件头13 13:数据1313 81:文件尾13 3C:帧头13 C3:帧尾*/void main(){uint16 buflen=0,flashpos=0;uint8 temp;uint8 xdata buf[1024];bool Had13=false;SP=0x40;SendBuf("ACK",3);while(1){SFRPAGE=1;do{temp=RI1;}while(temp==0);RI1=0;temp=SBUF1;SFRPAGE=0;if (Had13){switch (temp){case 0x13: //数据13buf[buflen++]=0x13;break;case 0x7E: //文件头EraseFlash();buflen=0;flashpos=0;SendBuf("ACK",3);break;case 0x3C: //帧头buflen=0;break;case 0xC3: //帧尾ProgramFlash(buf,buflen,flashpos);flashpos+=buflen;SendBuf("ACK",3);break;case 0x81: //文件尾Had13=false;SendBuf("ACK",3);SendCheckData(flashpos);flashpos=0;buflen=0;break;default:BEEP_ON();}Had13=false;}else{if (temp==0x13)Had13=true;elsebuf[buflen++]=temp;}}}//-------------------------------------------------------------------------- 9.3 串口发送函数void SendBuf(uint8 * pbuf,uint16 length){uint16 i;SFRPAGE=1;for (i=0;i<length;i++){while(TI1==0);TI1=0;SBUF1=pbuf[i];}SFRPAGE=0;}//-------------------------------------------------------------------------- 9.4 Flash擦除函数void EraseFlash(){uint16 data page;char xdata * data pwrite; // FLASH write pointerSFRPAGE = LEGACY_PAGE;FLSCL |= 0x01; // enable FLASH writes/erasesPSCTL |= 0x03; // PSWE = 1; PSEE = 1;RSTSRC = 0x02; // enable VDDMON as reset sourcefor (page=0;page<1024*40;page+=1024){pwrite=(char xdata *)page;*pwrite = 0; // 擦除一个扇区}PSCTL &= ~0x03; // PSWE = 0; PSEE = 0;FLSCL &= ~0x01; // disable FLASH writes/erases}//--------------------------------------------------------------------------9.5 Flash编程函数void ProgramFlash(uint8 * buf,uint16 length,uint16 StartAddress) {uint16 i;uint8 xdata * data pwrite; // FLASH write pointeruint8 data temp;for (i=0;i<length;i++){pwrite=(uint8 xdata *) (StartAddress+i); //存储新数据temp=buf[i];FLSCL |= 0x01;PSCTL |= 0x01; //允许写,MOVX指向FLASH*pwrite=temp;PSCTL &= ~0x01; //禁止写,MOVX指向外部RAMFLSCL &= ~0x01;}}//--------------------------------------------------------------------------9.6 校验数据发送函数void SendCheckData(uint16 length){uint8 code * data pread=0;uint16 i,j;uint8 xdata buf[1024];buf[0]=0x13;buf[1]=0x7E;SendBuf(buf,2);for (i=0;i<length;){buf[0]=0x13;buf[1]=0x3C;for (j=2;j<1000 && i<length;){if (*pread==0x13){buf[j]=0x13;buf[j+1]=0x13;j+=2;}else{buf[j]=*pread;j++;}i++;pread++;}buf[j]=0x13;buf[j+1]=0xC3;SendBuf(buf,j+2);}buf[0]=0x13;buf[1]=0x81;SendBuf(buf,2);}//--------------------------------------------------------------------------10 结论以上程序在Keil C51 8.08上编译通过,并经过长时间的运行证明其稳定可靠。