使用printf语句向虚拟终端发送字符串
第一步:增加基本输出库stdio.h
第二步:设置串口参数
第三步:直接在函数中使用printf进行打印
C51单片机如何使用printf
printf函数是调用putchar函数输入的,而putchar应该是先判TI断ti是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此 你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。这时你的程序就相当于直接死掉了。
方法一:删除stdio.h中的putchar函数,重定义putchar函数
#include #include #include #define uint unsigned int #define uchar unsigned char //毫秒级延时函数 void delay(uint x) { uchar i; while(x--) { for(i = 0;i < 120;i++); } } char * mystring() { static char str[20]; strcpy(str, "hello"); return str; } //字符发送函数 void putchar(uchar data1) { SBUF = data1; //将待发送的字符送入发送缓冲器 while(!TI); //等待发送完成 TI = 0; //发送中断标志请0 } //串口初始化函数 void serial_init() { uchar c = 0; SCON = 0x50; //串口方式1 ,允许接收 TMOD = 0x20; //T1工作于方式2 PCON = 0x00; //波特率不倍增 TL1 = 0xfd; TH1 = 0xfd; // 波特率设置为9600 EA = 1; //开总中断 ES = 1; //开串口接收中断 } //主函数 void main() { serial_init(); //串口初始化 TR1 = 1; //定时器开启 printf("%sn",mystring()); delay(50); while(1); } 方法二 在printf语句前加上TI=1;使得putchar先发送第一个字符 #include #include #include #define uint unsigned int #define uchar unsigned char void delay(uint x) { uchar i; while(x--) { for(i = 0;i < 120;i++); } } char * mystring() { static char str[20]; strcpy(str, "hello world"); return str; } //串口初始化函数 void serial_init() { uchar c = 0; SCON = 0x50; //串口方式1 ,允许接收 TMOD = 0x20; //T1工作于方式2 PCON = 0x00; //波特率不倍增 TL1 = 0xfd; TH1 = 0xfd; // 波特率设置为9600 EA = 1; //开总中断 ES = 1; //开串口接收中断 TR1=1; //定时器开启 } void main() { serial_init(); TI=1;//使得putchar可以发送第一个数据 printf("%sn",mystring()); delay(50); while(1); }
上一篇:8位LED循环闪烁+ 外部中断控制LED闪烁
下一篇:c51单片机中断详解
推荐阅读最新更新时间:2024-11-11 11:12
设计资源 培训 开发板 精华推荐
- LTC3886EUKG 具有数字电源系统管理功能的高效、双输出、降压型控制器的典型应用电路
- LE30CD-TR带抑制功能极低压降稳压器的典型应用
- 使用 California Eastern Laboratories 的 UPG2214TK 的参考设计
- 单口130W移动电源 IP5389+PL5501-SW2305
- LTC3703,48 至 12V 360W 隔离式电源
- 多功能电子分频器前级(已做出实物并验证功能)
- AM6TW-2409SH35Z 9V 6瓦单输出DC-DC转换器的典型应用
- 内置有 VIPer0P 离线高压转换器的15V,0.15A降压转换器
- LTC3110HUF 3.3V/2A 输出的典型应用电路来自具有有源电压平衡的超级电容器备份/再充电应用
- 使用 PAM8124 15W D 类音频功率放大器进行桥接负载 (BTL) 配置的典型应用电路