当前位置:文档之家› 模拟串口的三种方法及C语言

模拟串口的三种方法及C语言

模拟串口的三种方法及C语言
模拟串口的三种方法及C语言

51单片机模拟串口的三种方法

[ 2007-8-2 9:50:00 | By: MCUBLOG ]

(转)随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置

机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需

要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51

系列只提供一个串口,那么另一个串口只能靠程序模拟。

本文所说的模拟串口,就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电

平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置

1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续

的时间,波特率越高,持续的时间越短。如波特率为9600BPS,即每一位传送时间为

1000ms/9600=0.104ms,即位与位之间的延时为为0.104毫秒。单片机的延时是通过执行若干条

指令来达到目的的,因为每条指令为1-3个指令周期,可即是通过若干个指令周期来进行延时的,

单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。用此频率则每个指令周期

的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?

指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为

96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。至于

别的晶振频率大家自已去算吧。

现在就以11.0592M的晶振为例,谈谈三种模拟串口的方法。

方法一:延时法

通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期。

#define uchar unsigned char

sbit P1_0 = 0x90;

sbit P1_1 = 0x91;

sbit P1_2 = 0x92;

#define RXD P1_0

#define TXD P1_1

#define WRDYN 44 //写延时

#define RDDYN 43 //读延时

//往串口写一个字节

void WByte(uchar input)

{

uchar i=8;

TXD=(bit)0; //发送启始

Delay2cp(39);

//发送8位数据位

while(i--)

{

TXD=(bit)(input&0x01); //先传低位

Delay2cp(36);

input=input>>1;

}

//发送校验位(无)

TXD=(bit)1; //发送结束

Delay2cp(46);

}

//从串口读一个字节

uchar RByte(void)

{

uchar Output=0;

uchar i=8;

uchar temp=RDDYN;

//发送8位数据位

Delay2cp(RDDYN*1.5); //此处注意,等过起始位

while(i--)

{

Output >>=1;

if(RXD) Output |=0x80; //先收低位

Delay2cp(35); //(96-26)/2,循环共

占用26个指令周期

}

while(--temp) //在指定的

时间内搜寻结束位。

{

Delay2cp(1);

if(RXD)break; //收到结束位便退出

}

return Output;

}

//延时程序*

void Delay2cp(unsigned char i)

{

while(--i); //刚好两个

指令周期。

}

此种方法在接收上存在一定的难度,主要是采样定位存在需较准确,另外还必须知道

每条语句的指令周期数。此法可能模拟若干个串口,实际中采用它的人也很多,但如果你用Keil C,本人不建议使用此种方法,上述程序在P89C52、AT89C52、W78E52三种单片机上实验通过。

方法二:计数法

51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以

通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。

//计数器初始化

void S2INI(void)

{

TMOD |=0x02; //计数器0,方式2

TH0=0xA0; //预值为256-96=140,十六进制A0

TL0=TH0;

TR0=1; //开始计数

TF0=0;

}

void WByte(uchar input)

{

//发送启始位

uchar i=8;

TR0=1;

TXD=(bit)0;

WaitTF0();

//发送8位数据位

while(i--)

{

TXD=(bit)(input&0x01); //先传低位

WaitTF0();

input=input>>1;

}

//发送校验位(无)

//发送结束位

TXD=(bit)1;

WaitTF0();

TR0=0;

}

//查询计数器溢出标志位

void WaitTF0( void )

{

while(!TF0);

TF0=0;

}

接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和发送

都很准确,另外不需要计算每条语句的指令周期数。

方法三:中断法

中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以

在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程序中需对中断进行初始化,同时编写中断程序。本程序使用Timer0中断。

#define TM0_FLAG P1_2 //设传输标志位

//计数器及中断初始化

void S2INI(void)

{

TMOD |=0x02; //计数器0,方式2

TH0=0xA0; //预值为256-96=140,十六进制A0

TL0=TH0;

TR0=0; //在发送或

接收才开始使用

TF0=0;

ET0=1; //允许定时

器0中断

EA=1; //中断允许

总开关

}

//接收一个字符

uchar RByte()

{

uchar Output=0;

uchar i=8;

TR0=1; //启动Timer0

TL0=TH0;

WaitTF0(); //等过起始

//发送8位数据位

while(i--)

{

Output >>=1;

if(RXD) Output |=0x80; //先收低位

WaitTF0(); //位间延时

}

while(!TM0_FLAG) if(RXD) break;

TR0=0; //停止

Timer0

return Output;

}

//中断1处理程序

void IntTimer0() interrupt 1

TM0_FLAG=1; //设置标志位。

}

//查询传输标志位

void WaitTF0( void )

{

while(!TM0_FLAG);

TM0_FLAG=0; //清标志位

}

中断法也是我推荐的方法,和计数法大同小异。发送程序参考计数法,相信是件很容

易的事。

另外还需注明的是本文所说的串口就是通常的三线制异步通信串口(UART),只用RXD、TXD、GND。

附:51 IO口模拟串口通讯C源程序(定时器计数法)

#i nclude

sbit BT_SND =P1^0;

sbit BT_REC =P1^1;

/**********************************************

IO 口模拟232通讯程序

使用两种方式的C程序占用定时器0

**********************************************/

#define MODE_QUICK

#define F_TM F0

#define TIMER0_ENABLE TL0=TH0; TR0=1;

#define TIMER0_DISABLE TR0=0;

sbit ACC0= ACC^0;

sbit ACC1= ACC^1;

sbit ACC2= ACC^2;

sbit ACC3= ACC^3;

sbit ACC4= ACC^4;

sbit ACC5= ACC^5;

sbit ACC6= ACC^6;

sbit ACC7= ACC^7;

void IntTimer0() interrupt 1

F_TM=1;

}

//发送一个字符

void PSendChar(unsigned char inch) {

#ifdef MODE_QUICK

ACC=inch;

F_TM=0;

BT_SND=0; //start bit

TIMER0_ENABLE; //启动

while(!F_TM);

BT_SND=ACC0; //先送出低位

F_TM=0;

while(!F_TM);

BT_SND=ACC1;

F_TM=0;

while(!F_TM);

BT_SND=ACC2;

F_TM=0;

while(!F_TM);

BT_SND=ACC3;

F_TM=0;

while(!F_TM);

BT_SND=ACC4;

F_TM=0;

while(!F_TM);

BT_SND=ACC5;

F_TM=0;

while(!F_TM);

BT_SND=ACC6;

F_TM=0;

while(!F_TM);

BT_SND=ACC7;

F_TM=0;

while(!F_TM);

BT_SND=1;

F_TM=0;

while(!F_TM);

TIMER0_DISABLE; //停止timer #else

unsigned char ii;

ii=0;

F_TM=0;

BT_SND=0; //start bit TIMER0_ENABLE; //启动

while(!F_TM);

while(ii<8)

{

if(inch&1)

{

BT_SND=1;

}

else

{

BT_SND=0;

}

F_TM=0;

while(!F_TM);

ii++;

inch>>=1;

}

BT_SND=1;

F_TM=0;

while(!F_TM);

#endif

TIMER0_DISABLE; //停止timer }

//接收一个字符

unsigned char PGetChar() {

#ifdef MODE_QUICK

TIMER0_ENABLE;

F_TM=0;

while(!F_TM); //等过起始位ACC0=BT_REC;

TL0=TH0;

F_TM=0;

while(!F_TM);

ACC1=BT_REC;

F_TM=0;

while(!F_TM);

ACC2=BT_REC;

F_TM=0;

while(!F_TM);

ACC3=BT_REC;

F_TM=0;

while(!F_TM);

ACC4=BT_REC;

F_TM=0;

while(!F_TM);

ACC5=BT_REC;

F_TM=0;

while(!F_TM);

ACC6=BT_REC;

F_TM=0;

while(!F_TM);

ACC7=BT_REC;

F_TM=0;

while(!F_TM)

{

if(BT_REC)

{

break;

}

TIMER0_DISABLE; //停止timer return ACC;

#else

unsigned char rch,ii; TIMER0_ENABLE;

F_TM=0;

ii=0;

rch=0;

while(!F_TM); //等过起始位

while(ii<8)

{

rch>>=1;

if(BT_REC)

{

rch|=0x80;

}

ii++;

F_TM=0;

while(!F_TM);

}

F_TM=0;

while(!F_TM)

{

if(BT_REC)

{

break;

}

}

TIMER0_DISABLE; //停止timer return rch;

#endif

}

//检查是不是有起始位

bit StartBitOn()

{

return (BT_REC==0);

}

void main()

{

unsigned char gch;

TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */

PCON=00;

TR0=0; //在发送或接收才开始使用

TF0=0;

TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒执行的timer是

//

104.167*11.0592/12= 96

TL0=TH0;

ET0=1;

EA=1;

PSendChar(0x55);

PSendChar(0xaa);

PSendChar(0x00);

PSendChar(0xff);

while(1)

{

if(StartBitOn())

{

gch=PGetChar();

PSendChar(gch);

}

}

}

C语言第七套题

C语言第七套题 一、选择题 1、下列叙述中正确的是()。 A) 循环队列是队列的一种链式存储结构 B) 循环队列是队列的一种顺序存储结构 C) 循环队列是非线性结构D) 循环队列是一种逻辑结构 参考答案:B 【解析】在实际应用中,队列的顺序存储结构一般采用循环队列的形式。 2、下列关于线性链表的叙述中,正确的是()。 A) 各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致 B) 各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续 C) 进行插入与删除时,不需要移动表中的元素 D) 以上说法均不正确 参考答案:C 【解析】一般来说,在线性表的链式存储结构中,各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。线性链表中数据的插入和删除都不需要移动表中的元素,只需改变结点的指针域即可。 3、一棵二叉树共有25个结点,其中5个是叶子结点,则度为1的结点数为() A) 16 B) 10 C) 6 D) 4 参考答案:A 【解析】根据二叉树的性质3:在任意一棵二叉树中,度为0的叶子结点总是比度为2的结点多一个,所以本题中度为2的结点是5-1=4个,所以度为1的结点的个数是25-5-4=16个。 4、在下列模式中,能够给出数据库物理存储结构与物理存取方法的是()。 A) 外模式B) 内模式C) 概念模式D) 逻辑模式 参考答案:B 【解析】数据库系统的三级模式是概念模式、外模式和内模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法,所以选择B)。 5、在满足实体完整性约束的条件下()。 A) 一个关系中应该有一个或多个候选关键字 B) 一个关系中只能有一个候选关键字 C) 一个关系中必须有多关键字个候选 D) 一个关系中可以没有候选关键字 参考答案:A 【解析】实体完整性约束要求关系的主键中属性值不能为空值,所以选择A)。 6、有三个关系R、S和T如下:

c语言试卷第二套

以下叙述中正确的是(D)。 A.C语言中的函数不可以单独进行编译 B.C语言的源程序不必通过编译就可以直接运行 C.C源程序经编译形成的二进制代码可以直接运行 D.C语言中的每条可执行语句最终都将被转换成二进制的机器指令 若有说明语句:char c='\72';则变量c(D)。 A.说明不合法,c的值不确定 B.包含2个字符 C.包含3个字符 D.包含1个字符 定义字符变量c1的值是'A',c2的值是'D'. 执行语句printf("%d,%d",c1,c2-2);后,输出结果是(A)。 A.65,66 B.65,68 C.A,68 D.A,B 若希望当A的值为奇数时,表达式的值为"真",A的值为偶数时,表达式的值为"假",则以下不能满足要求的表达式是(D)。 A.A%2==1 B.A%2 C.!(A%2==0) D.!(A%2) 为了避免在嵌套的条件语句 if-else 中产生二义性,C语言规定: else子句总是与(A)配对。 A.其之前最近的if B.其之后最近的if C.同一行上的if D.缩排位置相同的if 下面程序段运行的结果是(A). x=-1; do{ x=x*x; }while (!x); A.循环执行一次 B.有语法错误 C.死循环 D.循环执行两次 以下正确的描述是(A). A.只能在循环体内和switch语句内使用break语句 B.continue语句的作用是终止整个循环的执行 C.从多层嵌套的外层循环中退出时,只能使用goto语句

D.在循环体内使用break和continue语句的作用相同 以下不能正确定义二维数组的选项是(A)。 A.int a[2][]={{1,2},{3,4}}; B.int a[2][2]={{1},2,3}; C.int a[2][2]={{1},{2}}; D.int a[][2]={1,2,3,4}; char a[10];不能将字符串"abc"存储在数组中的是(B)。 A.int i;for(i=0;i<3;i++)a[i]=i+97;a[i]=0; B.a="abc"; C.strcpy(a,"abc"); D.a[0]=0;strcat(a,"abc"); 在C语言中,引用数组元素时,其数组下标的数据类型允许是(B)。 A.整型常量 B.整型常量或整型表达式 C.整型表达式 D.任何类型的表达式 在定义全局变量和局部静态变量的同时赋值,变量的初始化在(C)时确定的. A.运行 B.编辑 C.编译 D.调试 以下不正确的说法是:C语言规定(C)。 A.实参可以是常量,变量或表达式 B.实参可以为任何类型 C.形参可以是常量,变量或表达式 D.形参应与其对应的实参类型一致 C语言程序中必须有的函数是(B)。 A.#include "stdio.h" B.main C.printf D.scanf 在"文件包含"的预处理中,被包含的文件应是(A). A.文本文件 B.可执行文件 C.目标文件 D.二进制文件 若有说明:int *p,m=5,n;以下正确的程序段是(D)。 A.scanf("%d",&n);*p=n; B.p=&n;scanf("%d",*p)

语言试卷第四套

若x,i,j,k 都是int型变量,则计算x=(i=4,j=16,k=i+32)后,x的值为:(D). 整型变量x=1,y=3,经下列计算后,x的值不等于6的是(D)。 =y*4/2 =9-(--y)-(--y) =(x=1+2,x*2) =y<26:5 以下程序的输出结果为(A)。 main() {int i=010,j=10; printf("%d,%d\n",++i,j--); } ,10 ,9 ,9 ,10 如下说法不正确的是(D). A.若b为假a为真,则 a||b为真 B.若b为真a为假,则 a||b为真 C.若b为真a为真,则 b&&!a为假 D.若b为假,则!b+1为假 下列(C)表达式的值为真,其中a=5;b=8;c=10;d=0 A.(a*2-c)||d *2>8+2 =10) ; { i=1;s=1;s=s*i;i++;}while(i<=10) ; =1;s=1;do {s=s*i; i++; }while(i<=10) ; =1;s=1; do { s=s*i; i++;}while(i>=10) ; 以下正确的描述是(A). 语句用来终止本次循环,继续下一次循环。 语句中不能出现continue语句 C.在循环中break语句不能独立出现 语句只能用于退出多层循环

下面各语句中,能正确进行赋字符串操作的语句是(B). s1[5][ ]={"ABCDE"}; s2[6]={'A','B','C','D','E'}; st[ ][ ]={"ABCDE"}; s[5]={'A','B','C','D','E'}; 下述对C语言字符数组的描述中,错误的是(C). A.不可以用关系运算符对字符数组中的字符串进行比较. B.字符数组中的字符串可以整体输入、输出. C.可以通过赋值运算符"="对字符数组整体赋值. D.字符数组中可以存放字符串. 若有说明 int a[3][4];则对a数组元素的正确引用是(C)。[1,3] [2][4] [1+1][0] (2)(1) 程序运行结束后,屏幕上输出值为(B). static int x=10; f( ) { x++; } main( ) { int x=3; f( ); x- -; printf("%d",x); } C语言规定,函数返回值的类型是由(A)。 A.在定义该函数时所指定的函数类型所决定 语句中的表达式类型所决定 C.调用该函数时系统临时决定 D.调用该函数时的主调函数类型所决定 若调用一个函数,且此函数中没有return语句,则正确的说法是:该函数(B)。 A.没有返回值 B.返回一个不确定的值 C.返回若干个系统默认值 D.能返回一个用户所希望的值

C语言2019高考模拟题含答案

一、选择题 1、不能把字符串“hello!”赋给数组b的语句是 ____________________ A.char b[10]={'H','e','l','l','o','!'}; B.char b[10];b="Hello!"; C.char b[10];strcpy(b,"Hello!"); D.char b[10]="Hello!"; 2、在宏定义“#define PI 3.14159”中,用宏名PI代替一个 ____________________ A.单精度数 B. 双精度数 C.常量 D.字符串 3、下列说法错误的是 ____________________ A.C语言中对二进制文件的访问速度比文本文件块 B.C语言中随机文件以二进制代码形式存储数据 C.语句“FILE fp;”定义了一个名为“fp”的文件指针 D.C语言中的文本文件以ASCII码形式存储数据 二、基本操作题 30、下列给定程序中,函数fun的功能是:将N*N矩阵中元素的值按列向右移动一个位置,右边被移出矩阵的元素绕回左边第一列。例如,N=3,有下列矩阵。 1 2 3 3 1 2 4 5 6 计算结果为 6 4 5 7 8 9 9 7 8 请将正确内容填入答题卡相应位置,使程序得出正确答案。 #include "stdio.h" #define N 4 void fun(int(*t)[N]) { int i,j,x; for(i=0;i=1;j--) //此处应为 1 t[i][j]=t[i][j-1]; t[i][0]=x;//____ 3 ____=x; } } main() { int i,j,t[][N]={21,12,13,24, 25,16,47,38, 29,11,32,54, 42,21,33,10}; printf("The original array:\n"); for(i=0;i

上海理工大学 C语言 第二套试题

注意: 1. 本练习时间为1小时,如有多余时间请完成实验5 2. 请单号的机器完成A 卷测试题,双号机器完成B 卷测试题 3. 以自己学号为文件夹名,并上传1.cpp,2.cpp,3.cpp 3个源代码文件 A 卷测试题目(机器号为单号学生完成) 1. 输入两个值分别为a,b,请输出ab b 42 的值, 程序保存为1.cpp. 2. 编写程序,判断输入的两个小数是否相互等, 程序保存为2.cpp. 3.编写程序, [问题的描述] 百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现有100元钱要买100只鸡,列出所有可能的购鸡方案。 程序保存为3.cpp. B 卷测试题目(机器号为双号学生完成) 1. 编写程序 [问题的描述] 有2个变量,分别存入2个不同的整数,有人试图将这2个变量中的值互换。 [案例] 原始状态为:x=5 y=6 互换后的状态为:y=6 x=5 程序只允许定义两个变量,程序保存为1.cpp.

2.编写程序,连续输入10个值,请输出输入值的最大值和最小值, 程序保存为2.cpp. 3.[问题的描述] 打印出下图所示的杨辉三角形 两个未知数和的幂次方运算后的系数问题,比如(x+y)的平方=x的平方+2xy+y的平方,这样系数就是1,2,1这就是杨辉三角的其中一行,立方,四次方,运算的结果看看各项的系数,这就是杨辉三角,也叫贾宪三角,2项式乘方展开式的系数规律。如图,在贾宪三角中,第3行的第三个数恰好对应着两数和的平方公式依次类推,杨辉三角是一个由数字排列成的三角形数表,一般形式如下图所示。 [案例] 输出10行的图

C语言》课程期末考试-第四套

第四套期末考试题 第一部分选择题 单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括内 1. 在计算机上可以直接运行的程序是_____________。 A. 高级语言程序 B.汇编语言程序 C.机器语言程序 D. C语言程序 2. 不属于C语言的是__________。 A. for B. goto C. if D. loop 3. 正确的C语言自定义标识符是__________。 A. num(10) B. file_bak C. continue D. class+2 4. 字符串”m\x43\\\np\102q”的长度是__________。 A. 7 B. 9 C. 15 D. 16 5. 设 int x=8, y, z; 执行y=z=x++; x=y==z后,变量x的值是__________。 A. 0 B. 1 C. 8 D. 9 6. 对于输入语句scanf(“%f,%f”, &a, &b); 要使变量a、b的值分别为1.78和2.48,则正确的输入是__________。 A. 1.78, 2.48 后跟回车 B. 1.78 2.48 后跟回车 C. 1.782.48 后跟回车 D. 1.78;2.48 后跟回车 7. 设int a=8, b=7, c=6, x=1; 执行语句 if(a>6) if(b>7) if(c>8) x=2; else x=3; 后x的值是__________。 A. 0 B. 1 C. 2 D. 3 8. 执行下列程序段 x=9; while(x>7) { printf(“*”); x--; } 后输出的结果是__________。 A. **** B. *** C. ** D. * 9. 定义一个具有10个元素的整数型数组,应当使用语句__________。 A. int a[10]; B. int a[2,5]; C. int a[]; D. int *a[10]; 10. 设char str1[10]=”ABCDE”, str2[10]=”xyz”; 则执行语句printf(“%d”, strlen(strcpy(str1, str2))); 后的输出结果是__________。 A. 9 B. 8 C. 5 D. 3 11. 设int x[]={1,3,5,7,9,11,13}, *p=x; 则不能正确引用数组元素的表达式是__________。 A. *(p--) B. *(--p) C. *(p++) D. *(++p) 12. 设int x[]={1,2,3,4}, y, *p=&x[1]; 则执行语句 y=(*--p)++; 后变量y的值为__________。 A. 1 B. 2 C. 3 D.4 13. 函数调用时,下列说法中不正确的是__________。 A. 若用值传递方式,则形式参数不予分配内存 B. 实际参数和形式参数可以同名 C. 主调函数和被调用函数可以不在同一个文件中

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

C语言试卷第2套 含答案

第二套试题 一、判断题 第1题:C语言允许直接访问物理地址。参考答案:对第2题:在标准C语言中,共用体变量中的各成员的首地址是不一样的。参考答案:错第3题:全局变量的作用域一定比局部变量的作用域范围大参考答案:错 第4题:C语言的源程序不必通过编译就可以直接运行参考答案:错 第5题:指针变量与变量的指针都与地址有关参考答案:对 第6题:C语言的函数可以嵌套定义参考答案:错 第7题:局部变量的作用域是当前文件。参考答案:错 第8题:在标准C语言中,宏替换是程序运行时完成的。参考答案:错 第9题:在标准C中,“=”是判断两个数是否相等。参考答案:错 第10题:C语言编译时不检查语法参考答案:错 二、选择题(请选择正确的选项) 第1题:以下程序的输出结果是 main( ) { int n=4; while(n--) printf("%d ",--n); } 参考答案:A A、2 0 B、3 1 C、3 2 1 D、2 1 0 第2题:数组定义为int a[3][2]={1, 2, 3, 4, 5, 6},数组元素_____的值为6。 参考答案:B A、a[3][2] B、a[2][1] C、a[1][2] D、a[2][3] 第3题:字符串指针变量中存入的是 参考答案:A A、字符串的首地址 B、字符串 C、第一个字符 D、字符串变量 第4题:下列表达式的值为0的是() 参考答案:C A、3﹪5 B、3/5.0 C、3/5 D、3<5 第5题:C语言中以追加方式打开一个文件应选择_______________参数参考答案:D A、“r” B、“w” C、“rb” D、“a” 第6题:C语言中while和do-while循环的主要区别是 参考答案:A A、do-while循环体至少无条件执行一次 B、while的循环控制条件比do-while循环控制条件严格 C、do-while循环允许从外部转到循环体内 D、do-while循环体不能是复合语句

c语言程序设计(第四版)考试题

C程序设计(第四版)期末考试题 本卷共有4道大题: 一、单项选择题(20道小题,共20分) 1、以下对C语言函数的有关描述中,正确的是( )(1分) A、在C中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B、C函数既可以嵌套定义又可以递归调用 C、函数必须有返回值,否则不能使用函数 D、C程序中有关调用关系的所有函数必须放在同一个源程序文件中 2、strcpy库函数用于复制一个字符串。若有以下定义:char *str1="copy",str2[10],*str3="hijklmn";char *str4,*str5="abcd";则对strcpy库函数的错误调用是( )(1分) A、strcpy(str2,str1) B、strcpy(str3,str1) C、strcpy(str4,str1) D、strcpy(str5,str1) 3、设有以下语句:char str[4][12]={"aaa","bbb","ccc","ddd"};char *strp[4]; int i;for(i=0;i<4;i++) strp[i]=str[i]; 若0<=k<4,下列选项中对字符串的非法引用是( )(1分) A、strp B、str[k] C、strp[k] D、*strp 4、以下各选项企图说明一种新的类型名,其中正确的是( )(1分) A、typedef v1 int; B、typedef v2=int; C、typedef v1 int v3; D、typedef v4: int; 5、若以下定义和语句:int a[]={1,2,3,4,5,6,7,8,9,0}; int *p,i;p=a;0

c语言串口通信范例

c语言串口通信范例 This manuscript was revised by the office on December 22, 2012

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100);

c语言模拟题目第十七套

第十七套 设a=12,且a定义为整型变量。执行语句a+=a-=a*=a;后a的值为()。 A、0 B、144 C、132 D、12 【参考答案】错误 A 【学生答案】 [未答此题] 设变量定义为"int a, b;",执行下列语句时,输入( ),则a和b的值都是10. scanf("a=%d, b=%d",&a, &b); A、a=10, b=10 B、a=10 b=10 C、10, 10 D、10 10 【参考答案】错误 A 【学生答案】 [未答此题] main() {int x=1,a=0,b=0; switch (x) { case 0: b++; case 1: a++; case 2: a++;b++; } printf("a=%d,b=%d",a,b); }该程序的输出结果是( ) A、a=1,b=1 B、a=1,b=0 C、a=2,b=2 D、a=2,b=1 【参考答案】错误 D 【学生答案】 [未答此题] 执行下列语句后的输出为()。

int j=-1; if(j<=1) printf("****\n"); else printf("%%%%\n"); A、%%%% B、**** C、有错,执行不正确 D、%%%%c 【参考答案】错误 B 【学生答案】 [未答此题] 以下正确的描述是( ). A、只能在循环体内和switch语句内使用break语句 B、continue语句的作用是终止整个循环的执行 C、从多层嵌套的外层循环中退出时,只能使用goto语句 D、在循环体内使用break和continue语句的作用相同 【参考答案】错误 A 【学生答案】 [未答此题] 设有如下程序段: int k=10; while(k==0) k--; 则下述说明中正确的是( ). A、循环体一次也不执行 B、循环体执行一次 C、死循环 D、循环体执行10次 【参考答案】错误 A 【学生答案】 [未答此题] 对以下说明语句 int a[10]={6,7,8,9,10}; 的正确理解是()。 A、将5个初值依次赋给a[6]至a[10] B、将5个初值依次赋给a[0]至a[4] C、因为数组长度与初值的个数不相同,所以此语句不正确 D、将5个初值依次赋给a[1]至a[5] 【参考答案】错误 B

c语言模拟题目第二十套

第二十套 下列程序段的输出结果为()。 float x=213.82631; printf("%3d",(int)x); A、213.82 B、213.83 C、213 D、3.8 【参考答案】错误 C 【学生答案】 [未答此题] a,b为整型变量,二者均不为0,以下关系表达式中恒成立的是()。 A、a/b*b+a%b==a B、a/b*b==a C、a*b/a*b==1 D、a/b*b/a==1 【参考答案】错误 A 【学生答案】 [未答此题] int a=1,b=2,c=3; if(a>b)a=b; if(a>c)a=c; 则a的值为()。 A、3 B、2 C、1 D、不一定 【参考答案】错误 C 【学生答案】 [未答此题] C语言的switch语句中case后( )。 A、可为任何量或表达式 B、可为常量或表达式或有确定值的变量及表达式 C、只能为常量或常量表达式 D、只能为常量 【参考答案】错误 C 【学生答案】 [未答此题]

设j和k都是int类型,则下面的for循环语句( )。 for(j=0,k=0;j<=9&&k!=876;j++) scanf("%d",&k); A、最多执行9次 B、是无限循环 C、循环体一次也不执行 D、最多执行10次 【参考答案】错误 D 【学生答案】 [未答此题] 以下程序中,while循环的循环次数是( ). main() { int i=0; while(i<10) { if(i<1) continue; if(i==5) break; i++; } } A、1 B、6 C、死循环,不能确定次数 D、4 【参考答案】错误 C 【学生答案】 [未答此题] 以下不能对二维数组a进行正确初始化的语句是()。 A、int a[2][3]={{1,2},{3,4},{5,6}}; B、int a[][3]={{1,2},{0}}; C、int a[2][3]={0}; D、int a[][3]={1,2,3,4,5,6}; 【参考答案】错误 A 【学生答案】 [未答此题] 下面函数调用语句中,fun含有实参的个数为( ). fun((x,y),(x+y,z,x/y));

c语言模拟题目第三套

第三套 若x,i,j,k 都是int型变量,则计算x=(i=4,j=16,k=32)后,x的值为:( ). A、52 B、16 C、4 D、32 【参考答案】错误 D 【学生答案】 [未答此题] 执行以下程序段后,输出结果和a的值是()。 int a=10; printf("%d",a++); A、11 和 10 B、10 和 11 C、11 和 11 D、10 和 10 【参考答案】错误 B 【学生答案】 [未答此题] 以下程序的输出结果是:( ) main() {int m=5; if(m++>5) printf("%d\n",m); else printf("%d\n",m--); } A、6 B、5 C、7 D、4 【参考答案】错误 A 【学生答案】 [未答此题] 执行下面程序段后,i的值是( ). int i=10; switch(i) {case 9: i+=1;

case 10: i--; case 11: i*=3; case 12: ++i; } A、28 B、10 C、9 D、27 【参考答案】错误 A 【学生答案】 [未答此题] 下面有关 for 循环的正确描述是( )。 A、for 循环是先执行循环体语句,后判断表达式 B、在 for 循环中,不能用 break 语句跳出循环体 C、for 循环的循环体语句中,可以包含多条语句,但必须用花括号括起来 D、for 循环只能用于循环次数已经确定的情况 【参考答案】错误 C 【学生答案】 [未答此题] 针对下列程序段回答问题( ). for(t=1;t<=100;t++) { scanf("%d",&x); if(x<0) continue; printf("%3d",t); } A、x>=0时什么也不输出 B、最多允许输出100个非负整数 C、printf函数永远也不执行 D、当x<0时整个循环结束 【参考答案】错误 B 【学生答案】 [未答此题] 若char a[10];已正确定义,以下语句中不能从键盘上给a数组的 所有元素输入值的语句是()。 A、for(i=0;i<10;i++)a[i]=getchar(); B、scanf("%s",a); C、gets(a);

#《C语言程序设计》课后习题答案(第四版)谭浩强

第1章程序设计和C语言1 1.1什么是计算机程序1 1.2什么是计算机语言1 1.3C语言的发展及其特点3 1.4最简单的C语言程序5 1.4.1最简单的C语言程序举例6 1.4.2C语言程序的结构10 1.5运行C程序的步骤和方法12 1.6程序设计的任务14 1-5 #include int main ( ) { printf ("**************************\n\n"); printf(" Very Good!\n\n"); printf ("**************************\n"); return 0; } 1-6#include int main() {int a,b,c,max; printf("please input a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if (max

第章最简单的C程序设计——顺序程序设计37 3.1顺序程序设计举例37 3.2数据的表现形式及其运算39 3.2.1常量和变量39 3.2.2数据类型42 3.2.3整型数据44 3.2.4字符型数据47 3.2.5浮点型数据49 3.2.6怎样确定常量的类型51 3.2.7运算符和表达式52 3.3C语句57 3.3.1C语句的作用和分类57 3.3.2最基本的语句——赋值语句59 3.4数据的输入输出65 3.4.1输入输出举例65 3.4.2有关数据输入输出的概念67 3.4.3用printf函数输出数据68 3.4.4用scanf函数输入数据75 3.4.5字符数据的输入输出78 习题82 3-1 #include #include int main() {float p,r,n; r=0.1; n=10; p=pow(1+r,n); printf("p=%f\n",p); return 0; } 3-2-1 #include #include int main() {float r5,r3,r2,r1,r0,p,p1,p2,p3,p4,p5; p=1000; r5=0.0585; r3=0.054; r2=0.0468; r1=0.0414; r0=0.0072; p1=p*((1+r5)*5); // 一次存5年期 p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期

杭州师范大学C语言试题第7套

一、判断题 第1题:C语言是一种结构化程序设计语言。参考答案:对 第2题:函数调用可以作为独立的语句存在参考答案:对 第3题:在C语言中使用位段时,一个位段可以在不同的存储单元中。错 第4题:在switch语句中,case后可不加“{、}”。参考答案:对 第5题:在标准C中,while后表达式只能是逻辑或关系表达式。错 第6题:在C语言中,定义结构体变量时可以省略关健字struct。错 第7题:在标准C中并不区分英文字符的大小写。参考答案:错 第8题:二进制文件打开后可以先读文件的末尾,而顺序文件不可以对 第9题:单目运算符++的运算对象可以是char型变量和int型变量,但不能是float 型变量参考答案:对 第10题:“--”运算符的优先级比“-”运算符的优先级低。参考答案:错 二、单选题选择正确的答案输入 第1题:若有以下说明: int w[3][4]={{0,1},{2,4},{5,8}}; int(*p)[4]=w; 则数值为4的数组元素的表达式是 参考答案:D A、*w[1]+1 B、p++,*(p+1) C、w[2][2] D、p[1][1] 第2题:若有说明:int i,j=7,*p=&i;,则与i=j;等价的语句是 参考答案:B A、i= *p; B、*p=*&j; C、i=&j; D、i=* *p; 第3题:设i是int型变量,f是float型变量,为了把100和765.12分别给i和f,用下面的语句:scanf("i=%d,f=%f",&i,&f);正确的输入是 参考答案:B A、100<空格>765.12<回车> B、i=100,f=765.12<回车> C、100<回车>765.12<回车> D、x=100<回车>,y=765.12<回车> 第4题:若fp是指向某文件的指针,且已读到该文件的末尾,则C语言函数feof(fp)的返回值是 参考答案:B A、EOF B、1 C、非零值 D、NULL 第5题:以下程序的输出结果是 main()

用C编写的RS232串口通信程序

void main() { delayms(100); init(); //初始化系统 delayms(100); init_wdt(); //初始化看门狗 while(1) { while(!RI_0) //是否收到数据 { clr_wdt(); } RI_0=0; //清除接收中断标志 buffer=S0BUF; if(buffer==0x5a) //检测祯头0 start0=1; if(buffer==0x54) //检测祯头1 start1=1; if(buffer==0x5a) //检测祯尾0 end0=1; if(buffer==0xfe) //检测祯尾1 end1=1; if((start0==1)&(start1==1)) { buff[i]=buffer; //从祯头1开始存储数据 i++; } if((end0==1)&(end1==1)) //是否已经接收祯尾 { count=i; //数据长度为count个 i=1; if((buff[2]==0x03)&(count==107)) //是否422指令 { buff[0]=0x5a; //重填祯头0 buff[count-4]=0; //校验和清零 for(k=2;k<(count-4);k++) //计算校验和 { buff[count-4]+=buff[k]; } for(k=0;k

S0BUF=buff[k]; while(!TI_0); //等待发送完成 TI_0=0; //清除发送中断标志 } reset(); } else if((buff[2]==0x05)&(count==7)) //是否AD测试指令 { sendad(); reset(); } else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令 { sendpaulse(); reset(); } else //如果接收错误,则恢复各标志位为初始状态以便下次接收 { reset(); } } } } void reset() { start0=0; //祯头祯尾标志位清零 start1=0; end0=0; end1=0; for(k=0;k

c语言上机模拟题1

1.按照计算机应用领域分类,学校使用的成绩管理系统属于_______。 A. 实时控制 B. 计算机辅助设计 C. 数据处理 D. 科学计算 参考答案:C 2.下面关于计算机系统的叙述中,完整的计算机系统通常是指______。 A. 计算机的硬件系统 B. 计算机上配置的操作系统 C. 计算机的软件系统 ! D. 由硬件系统和软件系统组成 参考答案:D 3.微型计算机的微处理芯片上集成的主要组件包括______。 A. 控制器和运算器 B. 内存和控制器 C. 控制器和存储器 D. 运算器和I/O接口 参考答案:A 的对话框窗口不可以______。 A. 关闭

【 B. 移动 C. 任意改变大小 D. 最小化 参考答案:C 5.某用户在域名为的邮件服务器上申请了一个账号,账号名为xing,那么该用户的电子邮件地址为______。 A. xing%参考答案:D 6.下列对C语言程序的描述中,正确的是_______。 A. C语言程序总是从第一个定义的函数开始执行 B. C语言程序总是从最后一个定义的函数开始执行 C. C语言程序总是从main()函数开始执行 < D. C语言程序中的main()函数必须放在程序的开始部分 参考答案:C 7.设有char ch='\\';,则变量ch包含______个字符。 A. 1 B. 2 C. 3 D. 4 参考答案:A 8.以下选项中合法的字符常量是____________。 A. '\101' {

B. '\97' C. '\xyz' D. '\019' 参考答案:A 9.下面用户标识符中合法的是____________。 A. iPhone# B. 13a C. char D. _int 参考答案:D ( 10.已知int c1=5,c2=2,c3;,则执行c3=c1/c2后,c3的值是 _______。 A. 5 B. C. 3 D. 2 参考答案:D 11.设有定义int b=0;,表达式_______与其它表达式的值不相同。 A. b+=1 B. b++ C. ++b

C语言试题第2套

一、选择题 11. 以下选项中合法的标识符是______。 A: 1_1 B: 1—1 C: _11 D: 1_ _ 12. 若函数中有定义语句:int k;,则______。 A: 系统将自动绐K赋初值0 B: 这时K中的值无定义 C: 系统将自动绐K赋初值-1 D: 这时K中无任何值 13. 以下选项中,能用作数据常量的是______。 A: 0115 B: 0118 C: 1.5e1.5 D: 115L 14. 设有定义:int x=2;,以下表达式中,值不为6的是______。 A: x*=x+1 B: x++,2*x C: x*=(1+x) D: 2*x,x+=2 15. 程序段:int x=12;doub1e y=3.141593;printf("%d%8.6f"x,y);的输出结果是______。 A: 123.141593 B: 12 3.141593 C: 12,3.141593 D: 123,1415930 16. 若有定义语句:doub1e x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是______。 A: scanf("%f%f"&x,& y); B: scanf("%f%f"&x,& y); C: scanf("%1f%lf",px,y); D: scanf("%lf%lf",x,y); 17. 以下是if语句的基本形式: if(表达式) 语句其中“表达式”______。 A: 必须是逻辑表达式 B: 必须是关系表达式 C: 必须是逻辑表达式或关系表达式 D: 可以是任意合法的表达式 18. 有以下程序 #include <stdio.h> main() { int x; scanf("%d",&x); if(x<=3) else if(x!=1O) printf("%d\n",x); } 程序运行时,输入的值在______范围才会有输出结果。

相关主题
文本预览
相关文档 最新文档