文档库 最新最全的文档下载
当前位置:文档库 › STC12C5A60S2中的AD转换串口显示(C语言)

STC12C5A60S2中的AD转换串口显示(C语言)

STC12C5A60S2中的AD转换串口显示(C语言)
STC12C5A60S2中的AD转换串口显示(C语言)

#include

#include

#define FOSC 18432000L

#define BAUD 9600

typedef unsigned char BYTE;

typedef unsigned int WORD;

sbit led=P1^0;

sbit key1=P3^4;

sbit key2=P3^5;

BYTE code table[]={3,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40}; sfr ADC_CONTR=0xbc; //ADC控制寄存器

sfr ADC_RES=0xbd; //ADC转换结果寄存器

sfr ADC_LOW2=0xbe; //ADC转换结果寄存器

sfr P1ASF=0x9d; //模拟功能控制寄存器

#define ADC_POWER 0x80//电源控制位

#define ADC_FLAG 0x10; //模数转换标志位

#define ADC_START 0x08; //模数转换器转换器启动控制位

#define ADC_SPEEDLL 0x00; //AD转换所用的时间90个时钟周期转换#define ADC_SPEEDL 0x20; //180个时钟周期转换

#define ADC_SPEEDH 0x40; //360个

#define ADC_SPEEDHH 0x60; //540个

void InitUart();

void InitADC();

void SendData(BYTE dat);

BYTE GetADCResult(BYTE ch);

void Delay(WORD n);

void keyscan();

void showresult(BYTE ch);

BYTE t1=0,t2=0,cl=1,i,c,a;

WORD aa,num,t0,flgh;

void delay(WORD z)

{

WORD i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

void main()

{

InitUart();

InitADC();

while(1)

{

keyscan();

if(flgh==1)

{

flgh=0;

ES=0;

TI=1;

SBUF=GetADCResult();

while(!TI);

TI=0;

ES=1;

}

}

}

BYTE GetADCResult(BYTE ch)

{

ADC_CONTR=0xC0;

_nop_();

_nop_();

_nop_();

_nop_();

P1ASF=0x00;//选择P1.0作为A/D转换通道

ADC_CONTR|=0x08;//启动A/D转换

while((ADC_CONTR&0x10)==0);//等待A/D转换结束ADC_CONTR&=0xE7;

return(ADC_RES);

}

void InitUart()

{

SCON=0x5a;

TMOD=0x21;

TH0=(65536-45872)%256;

TL0=(65536-45872)/256;

TH1=TL1=-(FOSC/12/32/BAUD);

TR1=1;

ET0=1;

REN=1;

TR0=1;

SM0=0;

SM1=1;

EA=1;

ES=1;

}

void InitADC()

{

P1ASF=0xff;

ADC_RES=0;

ADC_CONTR=0x80;

Delay(2);

}

void keyscan()

{

if(key1==0)

{

delay(10);

if(key1==0)

{

cl++;

num=table[cl];

while(!key1);

}

}

if(key2==0)

{

delay(10);

if(key2==0)

{

cl--;

num=table[cl];

while(!key2);

}

}

}

void ser()interrupt 4

{

RI=0;

a=SBUF;

c=1;

}

void timer_1() interrupt 3

{

TL1 = 0x3c; //200us

TH1 = 0xff;

t1++;

t2++;

if(t1 <= cl)

led = 0; //这三行通过t1与cl比较,控制led亮灭,也就是PWM调光。

if(t1 > cl)

led = 1;

if(t1 == 50) t1 = 0; //

if(t2 ==250) //250次中断以后,进入以下语句,更改cl值,改变亮度。改变比较的值(250)

{ //可以调整闪烁速度。

t2=0;

if(c)

{

if(cl == num)

{

ES=0;

TI=1;

SBUF=cl;

while(!TI);

TI=0;

ES=1;

GetADCResult(cl);

c=0; //由亮变暗标识

}

}

if(cl==3)

{

ES=0;

TI=1;

SBUF=cl;

while(!TI);

TI=0;

ES=1;

GetADCResult(cl);

c=1;

}

}

}

void timer0() interrupt 1

{

TH0=(65536-45872)%256;

TL0=(65536-45872)/256;

t0++;

if(t0==10)

{

t0=0;

flgh=1;

} }

C语言课程设计--进制转换

C 语言 课程设计报告 设计题目:进制转换 学生姓名: 学生学号:20101010110 专业班级:数学与应用数学一班 学院名称:数学与计量经济学院 同组人姓名: 指导老师: 2011年6 月16 日

目录 1.需求分析........................................................1 1.1问题描述....................................................1 1.2输入数据的要求..............................................1 1.3输出数据的要求..............................................1 1.4开发环境和工具..............................................1 1。.5成员分工...................................................1 2.总体设计........................................................2 2.1设计思路...................................................3 2。.2模块结构图...............................................4 3.详细设计........................................................7 3.1数据类型的定义...............................................7 3.2总的实现......................................................8 4.系统测试........................................................9 5.总结...........................................................·10 6.参考文献及附录............................................11

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语言实现任意进制转换

#include #include #include void dtox(double num,int jz) { char xnum[100]; int dnum=(int) num; int i=0,j=0,e = 0; while(dnum>=jz) { xnum[j++]=dnum%jz+48; dnum=dnum/jz; } xnum[j] = dnum+48; for(i = j;i>=0;i--){ printf("%c",xnum[i]); } if(dnum - num != 0){ printf("."); num = num - (int)num; do { e++; printf("%c",(int)(num*jz)+48); num = num*jz-(int)(num*jz); if(num == 0)break; } while(e<20); } } double xtod(char num[],int jz) { double dnum = 0; int i,j,k=0,n=0,b; for(i=0;;i++) { if(num[i]=='\0')break; else n++; if(num[i]=='.'){j=i;k=1;} } for(i=j-1;i>=0;i--) { dnum =dnum + (double)(num[j-i-1]-48)*pow(jz,i); }

if(k==1) { for(i=j+1;i

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语言

十六进制数转换成十进制数C语言 程序代码: #include #include #include /*求字符串长度函数*/ int strlengh(char *s) { int i; for(i=0;s[i]!='\0';i++); return i; } /*16进制转10进制函数*/ double tran(char *s) { int len=strlengh(s);/*求输入的字符串的长度*/ int ss[100] ;/*用于存放对字符的转换如f:15*/ int i; double n=0.0; /*对字符进行处理,将其每一位转换为整数,之后运算进行处理*/ for(i=0;i

进制转换C语言的实现

索引 一、算法分析 二、数据结构: 1、头文件 2、栈的关键操作 三、关键程序: 1、十进制进制转换为其它 2、其它进制转换为十进制 一、算法分析 实现进制转换需要编个函数,每一函数完成相应进制的转换,下面是各个进制之间转换的数学方法的算法。 十进制转二进制: 十进制数转换成二进制数,是一个连续除2的过程;把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0.最后将所有余数倒序排列,得到数就是转换结果。 例如: 302/2 = 151 余0 151/2 = 75 余1 75/2 = 37 余1 37/2 = 18 余1 18/2 = 9 余0 9/2 = 4 余1 4/2 = 2 余0 2/2 = 1 余0 所以302转换为2进制,结果:100101110

十进制转八进制: 十进制数转换成八进制的方法和转换为二进制的方法类似,唯一变化:除数由2变成8。 例如: 120/8=15余0 15/8=1余7 1/8=0余1 所以120转换为8进制,结果为:170 十进制转十六进制: 十进制数转换成十六进制数的方法和转换为二进制的方法类似,唯一变化:除数由2变成16。 不过,十六进制数:(10~15)是用英文大写字母(A~F)表示。例如: 123/16=7余11 所以123转换为16进制,结果为:7B 二进制转十进制: 二进制数转换为十进制数按权展开,第0位的权值是2的0次方,第1位的权值是2的1次方〃〃〃〃〃〃 例如: 1010转换成十进制数:

第0位:0*2^0=0 第1位:1*2^1=2 第2位:0*2^2=0 第3位:1*2^3=8 所以转换为10进制数为:0+2+0+8=10 二进制转八进制: 利用421,从后往前每三位一组,缺位除补0,然后按十进制方法进行转换。 例如: (11001) 001=1 011=3 然后将结果按从下往上顶顺序书写:31 二进制转十六进制: 二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算;利用8421,对于任意一个4位的二进制数,都可以很快算出它对应的10进制值。 例如: 1111=8+4+2+1=15 又因为十六进制数:10~15用大写字母A~F表示,所以15为F。

最新C任意进制转换程序

C任意进制转换程序 C语言写的一个任意进制转换的程序,不使用库提供的转换函数. / scale.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #include #define WIDTH 10 #define DATAWIDTH 50 #define MAX 4294967295 #define CONST_2 2 #define CONST_3 3 #define CONST_8 8 #define CONST_9 9 #define CONST_10 10 #define CONST_16 16 #define CHAR_0 '0' #define CHAR_9 '9' #define CHAR_A 'A' #define CHAR_a 'a'

#define CHAR_Z 'Z' #define CHAR_SPACE ' ' #define STRING_0 "0" #define STRING_Z "Z" bool Scale(); bool GetSourceScale(int * scale_in); bool GetObjectScale(int * scale_out); double OtherToDeci(int scale_in,char inputdata[]); void DeciToOther(unsigned long deci,int scale_out,char outputdata[]); bool GetData(char data[],int CONCOUNT,int flg); bool GetScale(char temp[]); bool GetSource(int in_scale,char inputdata[]); void ScaleChange(int scale_in,char inputdata[],int scale_out,char outputdata[]); void CleanScreen(); int _tmain(int argc, _TCHAR* argv[]) { int flg = 0; char cs[WIDTH]; memset(cs,0x00,sizeof(cs)); while(1) { printf("-----------------------------------------------------------------\n" ); printf(" Data Transform Between Two Scales \n"); printf(" ----------------------------------------\n"); /*进制转换主函

(C语言)10进制转换2,8,16进制

(C语言)10进制转换2,8,16进制 作者:vinseven #include"stdio.h" #include"conio.h" #include"malloc.h" #include"windows.h" #define ElemType int void menu(); void TenToTwo(); void TenToEight(); void TenToSixteen(); void InitStack(struct sNode **HS); void Push(struct sNode **HS,ElemType x); ElemType Pop(struct sNode **HS); ElemType Peek(struct sNode **HS); int EmptyStack(struct sNode **HS); void ClearStack(struct sNode **HS); int ten;/*要输入的10进制数*/ int x;/*把将要插入到栈中的元素暂时存进x 中*/ struct sNode hs;

struct sNode { ElemType data; struct sNode *next; }; void main() { menu(); getch(); } void menu() { char choice; int flag=1; while(1) { printf("\n\t\t\t________________________\n\n\n"); printf("\t\t\t 1,10进制转换2进制\n\n\n"); printf("\t\t\t 2,10进制转换8进制\n\n\n"); printf("\t\t\t 3,10进制转换16进制\n\n\n"); printf("\t\t\t 0,退出\n\n\n");

用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语言编写串口程序

用C语言编写串口程序 在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬 件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言 的方便。 在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和 状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以 及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个 问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位) 的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)进行如下简单的编码: 0H:发送的是新的半个字节数据 1H:重新发送上次传送错误的数据 2H:文件名结束 3H:文件结束 这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就 是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节 相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通 过信息位来区分。下面就是用C语言编写控制串行口的程序。 #include "dos.h" #include "stdlib.h" #include "stdio.h" #define PORT 0 void SendFile(char *fname); /* 发送文件*/ void Send(int s); /*发送一个字节*/ void SendFileName(char *fname); /*发送文件名*/ void ReceiveFile(); /*接收文件*/ void GetFileName(char *f); /*接收文件名*/ void InitPort(int port,unsigned char para); /*初始化端口*/ void SendPort(int port,char c); /*端口发送*/ int ReadPort(int port); /*读端口字节*/ int CheckState(int port); /*检查端口状态*/ int Receive(int port,int *G); /*接收一个字节*/ main(int argc,char *argv[]) { if(argc<2){ printf("Please input R(receive) or S(sent) parametre:"); exit(1); }

(c语言程序设计)10进制数转化为其它进制数

//用顺序栈来实现进制转换 #include #include #include #include #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 typedef int SElemType; typedef int Status; typedef struct { SElemType *base; SElemType *top; int stacksize; //栈容量 }SqStack; SqStack S; Status InitStack(SqStack &S){ //构造一个空栈 S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType)); if(!S.base) exit(0); //存储空间失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return 0; } Status GetTop(SqStack S,SElemType &e) //若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1 { if(S.top==S.base) return 1; e=*(S.top-1); return 0; } Status Push(SqStack &S ,SElemType e) //插入元素e为新的栈顶元素 { if(S.top-S.base>=S.stacksize) //如果栈满,则追加存储空间 { S.base=(SElemType *)realloc (S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) return 1 ; //存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT;

C语言串口通信助手代码

该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include HANDLE hComm;//用于获取串口打开函数的返回值(句柄或错误值)OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommEvents;

TCHAR cRecs[200],cSends[100]; //接收字符串发送字符串 char j=0,*cCom; //接收用统计数据大小变量端口选择 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } /*系统初始化函数*/ BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM1")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM2"));

任意进制转换(数据结构c语言版)

以下是在vc++6.0下运行的结果,我列举了输入345,进制分别为2,8,16的得出的结果,下面的不止只有这三个,输入任意进制的都可以 输入一个整数和进制数:345,2 转换成进制之后的数:101011001 Press any key to continue 输入一个整数和进制数:345,2 转换成进制之后的数:101011001 Press any key to continue 输入一个整数和进制数:345,16 转换成进制之后的数:159 Press any key to continue

程序如下: #include #include #define TRUE 1 #define FALSE 0 #define Stack_Size 100 typedef int StackElementType; typedef struct { StackElementType elem[Stack_Size]; int top; }SeqStack; void InitStack(SeqStack *S) { S->top=-1; }

int Push(SeqStack *S,StackElementType x) { if(S->top==Stack_Size-1) return(FALSE); S->top++; S->elem[S->top]=x; return(TRUE); } int Pop(SeqStack *S,StackElementType *x) { if(S->top==-1) return(FALSE); else { *x=S->elem[S->top]; S->top--; return(TRUE); }

面就是用C语言编写控制串行口的程序修订稿

面就是用C语言编写控制串行口的程序 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

面就是用C语言编写控制串行口的程序。 #include" " #include" " #include" " #definePORT0 voidSendFile(char*fname);/*发送文件*/ voidSend(ints);/*发送一个字节*/ voidSendFileName(char*fname);/*发送文件名*/ voidReceiveFile();/*接收文件*/ voidGetFileName(char*f);/*接收文件名*/ voidInitPort(intport,unsignedcharpara);/*初始化端口*/ voidSendPort(intport,charc);/*端口发送*/ intReadPort(intport);/*读端口字节*/ intCheckState(intport);/*检查端口状态*/

intReceive(intport,int*G);/*接收一个字节*/ main(intargc,char*argv[]) { if(argc<2){ printf("PleaseinputR(receive)orS(sent)parametre:"); exit(1); } InitPort(PORT,231); if(*argv[1]==''''S'''') /*检查选择的有效性*/ SendFile(argv[2]); else?if(*argv[1]==''''R'''') ReceiveFile(); else{ printf("Error?inputagain."); exit(1); } } voidSendFile(char*fname)

c语言实现数制转换

.数制转换。 编写程序,将十进制整数N转换为d进制数,其转换步骤是重复以下两步,直到N等于0。 X=N mod d (其中mod为求余运算) N=N div d (其中div为整除运算) 测试数据:以十进制到二进制转换为例 输出结果为:(789)10→(1100010101)2 注意:要求使用栈的基本运算(包括InitStack(S),Pop(S),Push(S),IsEmpty(S)。应引用栈的头文件实现)。 #include #define StackSize 50 typedef struct { int elem[StackSize]; int top; }SeqStactk; void InitStack(SeqStactk *S) { S->top=-1; } int IsEmpty(SeqStactk *S) /*判断栈空运算*/ { if (S->top==-1) /*栈空*/ return 1; else /*栈不空*/ return 0; } void Push(SeqStactk *S,int *a) { //将a置入S中栈顶 if(S->top==StackSize-1) return; else{ S->top++; S->elem[S->top]=*a; } } //出栈 int Pop(SeqStactk *S,int *b) { //将s栈顶元素弹出,放到b所指向空间 if (S->top==-1) return -1; else { *b=S->elem[S->top];

S->top--; return *b; } } int main(void) { SeqStactk S; int x,d,a,b; InitStack(&S); printf("栈%s\n",(IsEmpty(&S)==1?"空":"不空")); printf("输入十进制数x:"); scanf("%d",&x); printf("输入想求几进制d:"); scanf("%d",&d); while(x!=0) { a=x%d; Push(&S,&a); x=x/d; } printf("输出%d进制数:",d); while(Pop(&S,&b)!=-1) { printf("%d",b); } printf("\n"); return 0; }

串口通信linux c语言实现

/*write*/ #include #include #include #include #include #include #define MAX_SIZE 30 void set_speed(int,int); int main(int argc,char **argv) { int fd; int flag; int write_num=0; struct termios term; speed_t baud_rate_i; speed_t baud_rate_o; char buff[MAX_SIZE]="hello,beautiful day!"; fd=open(argv[1],O_RDWR|O_NONBLOCK); if(fd<0) printf("open the COM1 error!\n"); else printf("open COM1 ok!\n"); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); set_speed(fd,9600); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); while(1) { buff[29]='\n'; write_num=write(fd,buff,sizeof(buff));

C语言实现串口通信

摘要: 本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIA RS-232C在标准条件下的最大通信速率仅为20Kb/S。 尽管如此,大多数外设都提供了串行口接口,尤其在工业现场 RS-232C的应用更为常见。IBM PC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS 功能调用两种:DOS INT 21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOS INT 14H有4组功能调用为串行通信服务,但DOS和BIOS功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用C语言编写了串行通信查询和中断两种方式的接口程序。 1.串行口工作原理 微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,信号电平标准±12V,负逻辑,即逻辑1(MARKING)表示为信号电平-12V,逻辑0(SPACING)表示为信号电平12V,最大传送距离15米,最大传送速率19.6K波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位(0),然后传8(或7,6,5)个数据位(0,1),

接着可传1位奇偶校验位,最后为1~2个停止位(1),由此可见,传送一个ASCII字符(7位),加上同步信号最少需9位数据位。 @@T8S12300.GIF;图1@@ 串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送/接收器(UART),以节省CPU的时间,提高程序运行效率,IBM PC系列采用8250 UART来处理串行通信。在BIOS数据区中的头8个字节为4个UART的端口首地址,但DOS 只支持2个串行口:COM1(基地址0040:0000H)和COM2(基地址0040:0002H)。8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操作和线路控制寄存器的第7位来区分。这10个寄存器的具体功能如下: COM1(COM2) 寄存器 端口地址功能DLAB状态 3F8H(2F8H) 发送寄存器(写) 0 3F8H(2F8H) 接收寄存器(读) 0 3F8H(2F8H) 波特率因子低字节1 3F9H(2F9H) 波特率因子高字节1 3F9H(2F9H) 中断允许寄存器0 3FAH(2FAH) 中断标志寄存器 3FBH(2FBH) 线路控制寄存器 3FCH(2FCH) MODEM控制寄存器 3FDH(2FDH) 线路状态寄存器

模拟串口的C语言源程序代码

模拟串口的C语言源程序代码 本程序是模拟串口硬件机制写的,使用时可设一定时中断,时间间隔为 1/4 波特率,每中断一次调用一次接收函数,每中断4 次调用一次发送函数,不 过.对单片机来说时钟并须要快.要知道9600 的波特率的每个BIT 的时间间隔是 104us.而单片机中断一次压栈出栈一次的时间是20us 左右(标准的51 核12M 晶体)这样处理时间就要考虑清楚了.呵呵.以下程序是放在定时器中断程序函数内 的 //接收部分sbit JieShou_D= ;//定义接收端口uint8 DingShiJiShu,JieShou_h;//定时计数,接收缓冲器uint16 JieShou_T;//接收临时寄存器bit KaiShi,JieShou_b;// 开始接收标准,接收完成标志 void JieShou(void) //接收函数,每4 次调用接收一位{ if((KaiShi==0) (JieShou_D==0)) //串行开始位到来{ DingShiJiShu=0; //开始定时计数KaiShi=1; JieShou_T=0xffff; //接收临时寄存器置全1 } else if((KaiShi==1) (DingShiJiShu==1)) //第2 次调用,串行数据采样时间到来{ JieShou_T = 1; if(JieShou_D) JieShou_T |=0x8000; } else if(JieShou_T 0x807f ==0x803f) //接收完成JieShou_T=1xxx_xxxx_x011_1111 { KaiShi=0; DingShiJiShu=0; JieShou_h = JieShou_T 7; //右移7 位得到串行数据JieShou_b=1; } if(KaiShi) { DingShiJiShu++; //只在开始接收时定时计数+1 DingShiJiShu =0x03; //每4 次调用接收一位} } //发送部分sbit FaSong_D= ;//定义发送端口uint16 FaSong_h; //发送缓冲区bit FaSong_b; //发送完成标志 void KaiShiFaSong(uint8 fs) //设置发送数据,开始发送{ FaSong_h = fs; FaSong_h = 1; FaSong_h |= 0x0200; //FaSong_h=0000_001x_xxxx_xxx_0

C进制文本转换为ascii码

我用的将16进制文本转换为ascii码的C语言代码。16进制文本复制到文件test.txt中,运行程序,将得到输入。 例: 运行:./CSTRING test.txt 其中,test.txt文件内容为: 30:31:32 则得到的"Cstring.txt"输入文件中 012 本程序能自动跳过0或多个分隔符(分隔符可以为任意的符号,如“:”,“%”或空格等,判断的函数实现见SkipDelimiter函数)。 如:输入文件内容为: 30 31 32 或 303132 得到的都是 012 [cpp]view plain copy 1.#include 2.#include 3.#include 4.#include 5.#include 6.#include 7.#include 8.#include 9.typedef unsigned char uint8; 10.uint8 ConverseOneChar(uint8 ucChar) 11.{ 12. uint8 ucTmp = 0x00;

13. printf("one ucChar= 0x%x\n", (char)ucChar); 14.switch(ucChar) 15. { 16.case'0': 17. ucTmp = 0x00; 18.break; 19.case'1': 20. ucTmp = 0x01; 21.break; 22.case'2': 23. ucTmp = 0x02; 24.break; 25.case'3': 26. ucTmp = 0x03; 27.break; 28.case'4': 29. ucTmp = 0x04; 30.break; 31.case'5': 32. ucTmp = 0x05; 33.break; 34.case'6': 35. ucTmp = 0x06; 36.break; 37.case'7': 38. ucTmp = 0x07; 39.break; 40.case'8': 41. ucTmp = 0x08; 42.break; 43.case'9': 44. ucTmp = 0x09; 45.break; 46.case'a': 47.case'A': 48. ucTmp = 0x0a; 49.break; 50.case'b': 51.case'B': 52. ucTmp = 0x0b; 53.break; 54.case'c': 55.case'C': 56. ucTmp = 0x0c;

相关文档
相关文档 最新文档