Putchar in Keil C, take 8051 as an instance

In Keil C, it is necessary to implement char putchar(char c), or the powerful function printf would not work.

We should notice in here : new line command for serial output be  "\r\n" (line feed:LF, 0x0a + carriage return:CR, 0x0d), not only "\n" in Keil C.

I do not want to write too much tedious word in here, below is my putchar code for 8051, use timer 1 as interrupt:



#define FCLK           22118400UL
#define BAUDRATE        9600UL            

/* ref http://csserver.evansville.edu/~blandfor/EE354/SFRegisters.pdf */

void InitUART(void)
{
 EA = 0;
 TMOD &= 0x0F;  /*timer 1 clean*/
 TMOD |= 0x20;  /*mode 2: 0~255,  auto-reload */

 REN = 0; /*forbid 8051 receive data*/
   SM1 = 1; /* Serial Control Register be set by timer*/

 /*
  BaudRate = OscillatorFreq/(N*256-TH1)
  if SMOD = 0, N = 384
  if SMOD = 1, N = 192 

  SMOD is PCON.7  , Serial mode bit
 */

 TH1 = 256 - FCLK/(BAUDRATE*12*16);
 TL1 = 256 - FCLK/(BAUDRATE*12*16);
 PCON |= 0x80;

 ES = 1;  /*Enable Serial port interrupt */
 REN = 1;   /*allow 8051 receive data */
 EA = 1;   /*Enable interrupt*/     

 TI = 1; /* the transmitting has been done */
 RI = 0; /* the receiving is not done yet */

 TR1 = 1;  /*Timer 1 is turned on*/
}/*InitUART*/

void UartInterrupt(void) interrupt 4
{
#if(0)
 if(RI)
 {
 }
 else
 {
 }
#endif

}/*UartInterrupt*/

char putchar(char c)
{
 /* \n -> \r\n
   \r -> carriage return, 13
 */

 if (‘\n‘ == c)
 {
  SBUF = 0x0d;  

  while(0 == TI);
  TI = 0;
 } 

 SBUF = c;
 while(0 == TI);

 TI = 0;

   return c;
}/*putchar*/

If you want to use the code, you should modify the FCLK macro constant for your micro chip, I use stc89c52rc, crystal be 22.1184MHz.

The baud rate, for most use, be 9600, you could modify the parameter in your serial communication software. (I suggest sscom)

时间: 2024-08-14 09:54:06

Putchar in Keil C, take 8051 as an instance的相关文章

8051 keil 如何支持code size大于64KB的项目

随着项目中的功能不断增加,程序代码size也在不断往上涨,当超过64KB时,就要考虑引入bank进制. 在讲如何在现有项目中添加bank功能前,还是先讲讲其存在的背景吧. 8051是基于哈佛的体系架构. code memory是16位寻址,data memory是8位寻址. 这样分开寻址的特点适合比较的固定,且比较小的固化程序,而且稳定性相对较强,比如data access不会误指到code指令. 当然这种体系架构的缺点也是显然的,即灵活性不够,比如不能有效的利用memory资源. 既然是16位

Keil uVision4复杂运用教程

起首,我们用 Keil 先翻开一个现成的工程,来看法一下 Keil 软件,如图 1-7 所示. 图1-7 工程文件 从图 1-7 我们可以很轻松的分辩出菜单栏.工具栏.工程治理区.程序代码区和信息输入窗口.这个是 Keil4 的英文版,网上有一些汉化版本的,但不建议运用.即便你的英语欠好,运用英文版本的软件也一点成绩没有,刚开端人人先跟着我去运用,一共没几个单词,不需求你去翻译,用几回你就记住怎样用了.由于今后做实践开辟的时分,大多半软件多是英文版的,假如如今进修的时分不断用中文软件,未来一旦换

keil编译后生成的M51文件解析

通过*.m51文件我们可以清楚的看到单片机存储器的使用情况,以及可以看到每个变量包括局部变量的位置. 之前碰到一个问题,同样的程序,在small模式下编译后运行没问题,但在large模式下可以编译,但是运行出错.最后查看m51文件,发现了问题,在一个对时序要求很严格的地方声明几个局部变量,这几个局部变量有的被分配到data中,有的分配到xdata,在xdata中的变量访问时间要大于data中,导致整个代码时间管控出现混乱,最后将分配到xdata的变量用data修饰后,,编译成功通过. 下面是对m

keil优化等级设置

优化级别说明(仅供参考):则其中的 Code Optimization    栏就是用来设置C51的优化级别.共有9个优化级别(书上这么写的),高优化级别中包含了前面所有的优化级别.现将各个级别说明如下: 0级优化:1. 常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算.2. 简单访问优化:对8051系统的内部数据和位地址进行访问优化.3. 跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令被删除.1级优化:1. 死码消除:无用的代码段被消除.

[51单片机] Keil C51中变量的使用方法详解

引言    8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同.正确地使用变量,有利于获得高效的目标代码.下面详细介绍Keil C51中变量的使用方法. 1 CPU存储结构与变量的关系    变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同.    标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CP

Keil中Memory Model和Code Rom Size说明

源:Keil中Memory Model和Code Rom Size说明 C51中定义变量时如果省略存储器类型,Keil C51编译系统则会按编译模式SMALL.COMPACT和LARGE所规定的默认存储器类型去指定变量的存储区域,无论什么存储模式都可以声明变量在任何的8051存储区范围i,但是把最常用的命令如循环计数器和队列索引放在内部数据区可以显著地提高系统性能.以下介绍一下Keil编译选项Target中的Memory Model和Code Rom Size的设置. Memory Model(

Keil C中startup.a51的作用【转】

启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数. 和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那startup.a51中就会有相关的赋值.如果没有=100,startup.a51就会把他清0.(startup.a51==变量的初始化).这些初始化完毕后,还会设置SP指针.对非变量区域,如堆栈区,将不会有赋值或清零

Primace 5.0软件与KEIL单片机软件联合在线仿真步骤

Primace 软件是CME(京微雅格)公司的FPGA芯片开发专用软件.因为CME的FPGA,如M5.M7等内嵌有8051核,所以可以和MCU联合在线仿真,虽然FPGA内的程序不可控,不能一步一步的仿真,但是因为MCU程序可控,可以一步一步的运行,所以可以利用此特性,用MCU给FPGA发送命令,然后控制FPGA的运行与操作. 所以此FPGA开发板也可以做8051单片机开发板. 这里主要介绍FPGA与keiLl联合仿真的时候的关于KEIL的工程的建立与设置.主要是做的比较简单的仿真,比较粗俗.简单

ARM、8051、AVR、MSP430、Coldfire、DSP、FPGA七种体系比较区别

概述 我以为这样比没有意义,做嵌入式系统最大特征是“嵌入”二字,也就是说你的控制系统是嵌入于你的控制对象之中,所以首先是服从于对象的需求和特征,脱离对象空论谁好谁坏有何依据? 每个MCU都有其存在的价值,每个使用者的选择都有其道理,AVR开始时是以单时钟周期指令为卖点,相对于当时 12个时钟的经典51确实有优势,而且基于CMOS的特征,时钟越高功耗越大,所以它在能耗上似乎明显占优. 可随着技术的改进,51现在已经早就有了4时钟周期,`2时钟周期乃至单时钟周期的芯片了,此时AVR的速度优势已不存在