#include <reg51.h>
#include <intrins.h>
unsigned char key_s, key_v, tmp
char code str[] = "welcome! www.willar.com \n\r"
void send_str()
bit scan_key()
void proc_key()
void delayms(unsigned char ms)
void send_char(unsigned char txd)
sbit K1 = P1^4
main()
{
TMOD = 0x20// 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD// 波特率9600
TL1 = 0xFD
SCON = 0x50// 设定串行口工作方式
PCON &= 0xef// 波特率不倍增
TR1 = 1// 启动定时器1
IE = 0x0// 禁止任何中断
while(1)
{
if(scan_key()) // 扫描按键
{
delayms(10)// 延时去抖动
if(scan_key()) // 再次扫描
{
key_v = key_s// 保存键值
proc_key()// 键处理
}
}
if(RI) // 是否有数据到来
{
RI = 0
tmp = SBUF// 暂存接收到的数据
P0 = tmp// 数据传送到P0口
send_char(tmp)// 回传接收到的数据
}
}
}
bit scan_key()
// 扫描按键
{
key_s = 0x00
key_s |= K1
return(key_s ^ key_v)
}
void proc_key()
// 键处理
{
if((key_v &0x01) == 0)
{ // K1按下
send_str()// 传送字串"welcome!...
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd
while(!TI)// 等特数据传送
TI = 0// 清除数据传送标志
}
void send_str()
// 传送字串
{
unsigned char i = 0
while(str[i] != '\0')
{
SBUF = str[i]
while(!TI)// 等特数据传送
TI = 0// 清除数据传送标志
i++// 下一个字符
}
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i
while(ms--)
{
for(i = 0i <120i++)
}
}
拓展资料
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
从你出现的问题看,你应该是发的0,1,2,3……255的数,而不是它们对应的ASCII的值。比如你要发送在串口调试工具中显示0,应该发送0的ASCII值;假设你的串口发送一字节的函数为:sendbyte(unsignedchar
n)
则发送函数可以这样写:
void
send(void)
{
unsigned
char
i
for
(i=0i<256i++)
{
sendbyte(n/100+'0')
sendbyte(n%100/10+'0')
sendbyte(n%100%10+'0')
}
}
去掉16进制显示,就能看到0-255的显示了
分接收端和发送端。接收端:
1·打开com1端口
fd=fopen("/dev/ttys0",方式)
2·取得当前串口值,保存到结构体变量oldtio
tcgetattr(fd,&oldtio)
3·串口结构体变量newtio清0.
bzero(&newtio,sizeof(newtio))
4·设置串口参数
主要设置比特率、是否忽略奇偶校验错误,启用正规模式等等。
接收端
1·打开com端口
2·取得当前串口值
3·串口结构体变量清0
4·设置串口参数。