c语言怎么样编写一个时钟程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言怎么样编写一个时钟程序相关的知识,希望对你有一定的参考价值。
参考技术Ac语言时钟程序代码如下:
#include<windows.h>
#include<math.h>
#define ID_TIMER 1//计时器ID
#define TWOPI (2*3.14159)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
static TCHAR szAppName[]=TEXT("Clock");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))
MessageBox(NULL,TEXT("This program requires Windows
T"),szAppName,MB_ICONERROR);
return 0;
hwnd=CreateWindow(szAppName,TEXT("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
TranslateMessage(&msg);
DispatchMessage(&msg);
return msg.wParam;
void Setsotropic(HDC hdc,int cxClient,int cyClient)
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,1000,1000,NULL);
SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL);
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
void RotatePoint(POINT pt[],int iNum,int iAngle)
int i;
POINT ptTemp;
for(i=0;i<iNum;i++)
ptTemp.x=(int)(pt[i].x*cos(TWOPI*iAngle/360)+pt[i].y*sin(TWOPI*iAngle/360));
ptTemp.y=(int)(pt[i].y*cos(TWOPI*iAngle/360)+pt[i].x*sin(TWOPI*iAngle/360));
pt[i]=ptTemp;
void DrawClock(HDC hdc)
int iAngle;
POINT pt[3];
for(iAngle=0;iAngle<360;iAngle+=6)
pt[0].x=0;
pt[0].y=900;
RotatePoint(pt,1,iAngle);
pt[2].x=pt[2].y=iAngle%5?33:100;
pt[0].x-=pt[2].x/2;
pt[0].y-=pt[2].y/2;
pt[1].x=pt[0].x+pt[2].x;
pt[1].y=pt[0].y+pt[2].y;
SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y );
void DrawHands(HDC hdc,SYSTEMTIME *pst,BOOL fChange)
static POINT pt[3][5]=0,-150,100,0,0,600,-100,0,0,-150, 0,-200,50,0,0,800,-50,0,0,-200, 0,0,0,0,0,0,0,0,0,800 ;
int i,iAngle[3];
POINT ptTemp[3][5];
iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2;
iAngle[1]=pst->wMinute*6;
iAngle[2]=pst->wSecond*6;
memcpy(ptTemp,pt,sizeof(pt));
for(i=fChange?0:2;i<3;i++)
RotatePoint(ptTemp[i],5,iAngle[i]);
Polyline(hdc,ptTemp[i],5);
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
static int cxClient,cyClient;
static SYSTEMTIME stPrevious;
BOOL fChange;
HDC hdc;
PAINTSTRUCT ps;
SYSTEMTIME st;
switch(message)
case WM_CREATE:
SetTimer(hwnd,ID_TIMER,1000,NULL);
GetLocalTime(&st);
stPrevious=st;
return 0;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
return 0;
case WM_TIMER:
GetLocalTime(&st);
fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute;
hdc=GetDC(hwnd);
Setsotropic(hdc,cxClient,cyClient);
SelectObject(hdc,GetStockObject(WHITE_PEN));
DrawHands(hdc,&stPrevious,fChange);
SelectObject(hdc,GetStockObject(BLACK_PEN));
DrawHands(hdc,&st,TRUE);
stPrevious=st;
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
Setsotropic(hdc,cxClient,cyClient);
DrawClock(hdc);
DrawHands(hdc,&stPrevious,TRUE);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
KillTimer(hwnd,ID_TIMER);
PostQuitMessage(0);
return 0;
return DefWindowProc(hwnd,message,wParam,lParam);
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。
C语言编写串口通信程序在裸机下运行
我想用C语言编写一个串口通信程序,然后再裸机下运行,有没有人有经验或者推荐我看些什么东西呢,谢谢!QQ:554287219
单片机你在网上搜一下吧如果想入门 最好去图书馆借点书看,比较难理解 祝好运了!!
我给你提供以下资料 是百度上找的。
概述
单片机是指一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
目录[隐藏]
单片机介绍
单片机的应用领域
学习应用六大重要部分
单片机学习
常用单片机芯片简介
从无线电世界到单片机世界
单片机攻击技术
单片机侵入型攻击的一般过程
单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
早期的单片机都是8位或4位的。其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多。
[编辑本段]单片机介绍
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可......用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!......它主要是作为控制部分的核心部件。
它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。
单片机是靠程序的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
由于单片机对成本是敏感的,所以目前占统治地位的软件还是最低级汇编语言,它是除了二进制机器码以上最低级的语言了,既然这么低级为什么还要用呢?很多高级的语言已经达到了可视化编程的水平为什么不用呢?原因很简单,就是单片机没有家用计算机那样的CPU,也没有像硬盘那样的海量存储设备。一个可视化高级语言编写的小程序里面即使只有一个按钮,也会达到几十K的尺寸!对于家用PC的硬盘来讲没什么,可是对于单片机来讲是不能接受的。 单片机在硬件资源方面的利用率必须很高才行,所以汇编虽然原始却还是在大量使用。一样的道理,如果把巨型计算机上的操作系统和应用软件拿到家用PC上来运行,家用PC的也是承受不了的。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
单片机历史
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。
2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。
Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。
3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。
[编辑本段]单片机的应用领域
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
1.在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。
2.在工业控制中的应用
用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
4.在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
5.单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
6.在各种大型电器中的模块化应用
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。
在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
7.单片机在汽车设备领域中的应用
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器,GPS导航系统,abs防抱死系统,制动系统等等。
此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
[编辑本段]学习应用六大重要部分
单片机学习应用的六大重要部分
一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。
二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的——数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不可以由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元可以由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:
1•地址(如MOV DPTR,1000H),即地址1000H送入DPTR。
2•方式字或控制字(如MOV TMOD,#3),3即是控制字。
3•常数(如MOV TH0,#10H)10H即定时常数。
4•实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执行指令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。
理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来执行了。
三、P0口、P2口和P3的第二功能用法:初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口时,它们被用作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从P3.6或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能’而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条SETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会这么去做,因为这通常会导致系统的崩溃。
四、程序的执行过程: 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000’,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’这个单元,并且在‘0000’单元中存放的一定是一条指令。
五、堆栈: 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即‘PUSH’和‘POP’,有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的混乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。
六、单片机的开发过程: 这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编辑器(如EDIT、CCED等)编写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后,就可以写片(将程序固化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明:
单片机试验板ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;设堆栈
LOOP:
NOP
LJMP LOOP ;循环
END ;结束
[编辑本段]单片机学习
目前,很多人对汇编语言并不认可。可以说,掌握用C语言单片机编程很重要,可以大大提高开发的效率。不过初学者可以不了解单片机的汇编语言,但一定要了解单片机具体性能和特点,不然在单片机领域是比较致命的。如果不考虑单片机硬件资源,在KEIL中用C胡乱编程,结果只能是出了问题无法解决!可以肯定的说,最好的C语言单片机工程师都是从汇编走出来的编程者因为单片机的C语言虽然是高级语言,但是它不同于台式机个人电脑上的VC++什么的单片机的硬件资源不是非常强大,不同于我们用VC、VB等高级语言在台式PC上写程序毕竟台式电脑的硬件非常强大,所以才可以不考虑硬件资源的问题。还有就是在单片机编程中C语言虽然编程方便,便于人们阅读,但是在执行效率上是要比汇编语言低10%到20%,所以用什么语言编写程序是要看具体用在什么场合下。总是来说做单片机编程要灵活使用汇编语言与C语言,让单片机的强大功能以最高是效率展示给用户。
以8051单片机为例讲解单片机的引脚及相关功能;
《单片机引脚图》
40个引脚按引脚功能大致可分为4个种类:电源、时钟、控制和I/O引脚。
⒈ 电源:
⑴ VCC - 芯片电源,接+5V;
⑵ VSS - 接地端;
注:用万用表测试单片机引脚电压一般为0v或者5v,这是标准的TTL电平。但有时候在单片机程序正在工作时候测试结果并不是这个值而是介于0v-5v之间,其实这是万用表的响应速度没这么快而已,在某一个瞬间单片机引脚电压仍保持在0v或者5v。
⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
⒊ 控制线:控制线共有4根,
⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲
① ALE功能:用来锁存P0口送出的低8位地址
② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵ PSEN:外ROM读选通信号。
⑶ RST/VPD:复位/备用电源。
① RST(Reset)功能:复位信号输入端。
② VPD功能:在Vcc掉电情况下,接备用电源。
⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。
① EA功能:内外ROM选择端。
② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋ I/O线
80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)
5. P3口第二功能
P30 RXD 串行输入口
P31 TXD 串行输出口
P32 INT0 外部中断0(低电平有效)
P33 INT1 外部中断1(低电平有效)
P34 T0 定时计数器0
P35 T1 定时计数器1
P36 WR 外部数据存储器写选通(低电平有效)
P37 RD 外部数据存储器读选通(低电平有效)
[编辑本段]常用单片机芯片简介
STC单片机
STC公司的单片机主要是基于8051内核,是新一代增强型单片机,指令代码完全兼容传统8051,速度快8~12倍,带ADC,4路PWM,双串口,有全球唯一ID号,加密性好,抗干扰强.
PIC单片机:
是MICROCHIP公司的产品,其突出的特点是体积小,功耗低,精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片.
EMC单片机:
是台湾义隆公司的产品,有很大一部分与PIC 8位单片机兼容,且相兼容产品的资源相对比PIC的多,价格便宜,有很多系列可选,但抗干扰较差.
ATMEL单片机(51单片机):
ATMEl公司的8位单片机有AT89、AT90两个系列,AT89系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式;AT90系列单片机是增强RISC结构、全静态工作方式、内载在线可编程Flash的单片机,也叫AVR单片机.
PHLIPIS 51PLC系列单片机(51单片机):
PHILIPS公司的单片机是基于80C51内核的单片机,嵌入了掉电检测、模拟以及片内RC振荡器等功能,这使51LPC在高集成度、低成本、低功耗的应用设计中可以满足多方面的性能要求.
HOLTEK单片机:
台湾盛扬半导体的单片机,价格便宜,种类较多,但抗干扰较差,适用于消费类产品.
TI公司单片机(51单片机):
德州仪器提供了TMS370和MSP430两大系列通用单片机.TMS370系列单片机是8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复杂的实时控制场合;MSP430系列单片机是一种超低功耗、功能集成度较高的16位低功耗单片机,特别适用于要求功耗低的场合
松翰单片机(SONIX):
是台湾松翰公司的单片,大多为8位机,有一部分与PIC 8位单片机兼容,价格便宜,系统时钟分频可选项较多,有PMW ADC 内振 内部杂讯滤波。缺点RAM空间过小,抗干扰较好。
[编辑本段]从无线电世界到单片机世界
现代计算机技术的产业革命,将世界经济从资本经济带入到知识经济时代。在电子世界领域,从20世纪中的无线电时代也进入到21世纪以计算机技术为中心的智能化现代电子系统时代。现代电子系统的基本核心是嵌入式计算机系统(简称嵌入式系统),而单片机是最典型、最广泛、最普及的嵌入式系统。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快! 参考技术A :用C语言程序先输出序列:0.1.2.3.4,然后调用汇编程序输出:5.6.7.8.9。
要求:用两种方法传递参数(1,传值。2,传址)
1,源程序和注释:
ZJPRINT.ASM john01.c
.MODEL SMALL
.CODE
PUBLIC _ZJPRINT1
PUBLIC _ZJPRINT2
_ZJPRINT1 PROC NEAR
PUSH BP
MOV BP,SP
MOV AL,[BP+4]
ADD AL,48;将数字转换成字符
MOV AH,0EH
INT 10H;调用BIOS中断
POP BP
RET
_ZJPRINT1 ENDP
_ZJPRINT2 PROC NEAR
PUSH BP
MOV BP,SP
MOV AX,[BP+4]
MOV BP,AX;将地址放入基址寄存器
MOV AL,[BP];基址寻址
ADD AL,48;将数字转换成字符
MOV AH,0EH
INT 10H;调用BIOS中断
POP BP
RET
_ZJPRINT2 ENDP
END extern void ZJPRINT1(int num);
extern void ZJPRINT2(int *num);
main()
int i;
printf("\nTC output number:\n");
for(i=0;i<5;i++)
printf("%d,",i);
printf("\nASM output number(pass value):\n");
for(i=5;i<10;i++)
ZJPRINT1(i);
printf(",");
printf("\nASM output number(pass address):\n");
for(i=5;i<10;i++)
ZJPRINT2(&i);
printf(",");
getch();
2,说明:
Tc20中使用汇编语言的方法主要有内嵌汇编、中断函数和汇编函数调用三种方式。本作业使用的是调用汇编函数的方法。
ZJPRINT.ASM汇编程序通过MASM程序来编译。在MASM目录下用:MASM ZJPRINT.ASM命令。
john01.c程序在TC目录下用:Tcc –ms –c john01.c来编译。其中:,-ms表示以small内存模型编译(其它模型:-mt,-mm,-mc,-ml,mh), -c表示compile only。
然后将汇编的目标文件拷贝到TC的目录下。使用:tlink lib\c0s john01.obj ZJPRINT.obj,john01.exe, ,lib\cs连接生成可执行程序。以上的c0s.obj和cs.lib不在当前目录中(一般在LIB目录中),连接时,需指明其所在路径。
题目2:PC-PC通讯:实现两个PC机之间的文件的发送和接受。
要求:1,发送文件采用查询方式。
2,接受文件采用中断方式(查询方式),接受后以原文件名存储。
1,硬件连线图
计算机上的DB9串口都是针式(公的),所以连接两台计算机的串口电缆两个DB9必须是孔式的(母的)。简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连。但是考虑到做一个PC-PC的串口线就干脆做完整一点吧,方便以后其他高级应用也可以使用。
2,双机通信协议,原理
关于协议:
通过串行端口COM1,完成两台机器传送文件的功能。串口发送采用查询的方式,即每次发送之前都查询串口的发送状态位(LSR的第5位),当为1 ,表示发送寄存器是空的,那么就可以进行数据发送了。
串口接收采用中断的方式。接受的时候程序等待接收中断,如果产生了接受中断,中断处理程序就把接收的字符放到一个相应的存储位置,完成接受功能。
文件的发送和接收包括文件名和文件内容的发送和接收。而这两部分的发送和接收都需要相应的标志来标示,在程序中我简单的定义:发送ZJZJZJZJZJ为开始传送,而$为一个部分传送的完成。相应的接收就按照上面的定义和顺序来确定接受的是文件名和文件内容。文件名采用缓冲的方式一次全部接收后再处理,文件内容可能比较大,就采用追加存储的方式。
关于硬件:
当端口地址小于256采用直接寻址方式;当端口地址大于256,采用间接寻址方式,端口地址放在DX寄存器中。对端口操作使用IN和OUT指令。串口COM1的寄存器地址大于256,所以使用端口操作指令。使用2400的波特率,数据位8位,停止位1 位,无校验的串口格式。对于波特率寄存器,根据手册设置波特率寄存器:MSB为00H,LSB为30H。各端口的地址如下:
根据通信中断程序的特点,并结合一般中断处理的编程原则与方法,异步通信中断编程,包括: (1)通信中断初始化
修改中断向量表,使用的串口COM1,接管中断0CH,使新的中断向量指向自行编制的通信中断程序。修改中使用DOS调用,功能号为25H,35H。
确定8250操作方式,设置中断允许寄存器相应位的允许或禁止(选择中断源类型),并允许中断操作(置MODEM控制寄存器OUT2有效(D3=1))。
确定起止式通信协议,设置通信波特率及数据帧传输格式。
开放通信中断,对8259A-5中断控制器的屏蔽寄存器编程(OCW1),允许中断IRQ4或IRQ3。
(2)通信中断服务程序
进入中断,读取串口接受的字节,存放到变量中。
结束中断处理(通常发中断结束命令EOI到中断控制器),并以IRET返回被中断的通信子程序。
3,程序流程
共有3个程序文件:一个汇编接口程序,一个接收程序,一个发送程序。在汇编程序中完成寄存器设置,中断向量设置,串口工作方式的设置,中断服务程序的设置,中断控制器的设置。
发送函数:文件john02.c
接收函数:文件john03.c
汇编接口:文件ZJCOM.asm
两个函数公用一个汇编借口,其中发送为查询工作模式,而接收采用中断工作模式。流程图如下。
4,程序清单
汇编程序代码:文件ZJCOM.asm
.MODEL SMALL
.CODE
COMADDR DW 3F8H ;寄存器地址
COMLCR DW 3FBH
COMMCR DW 3FCH
COMIER DW 3F9H
COMLSR DW 3FDH
INTSEG DW ?;保存原来中断向量
INTOFF DW ?;保存原来中断向量
CONTRL DB 00H;中断标示变量
RCVBYT DB ? ;数据存放处
PUBLIC _ZJCOMSET
PUBLIC _ZJCOMSND
PUBLIC _ZJCOMIST
PUBLIC _ZJCOMRCV
;####################################################
_ZJCOMSET PROC NEAR
MOV DX,COMLCR
MOV AL,80H
OUT DX,AL ;使能波特率设置
MOV DX,COMADDR
MOV AL,30H
OUT DX,AL ;设置波特率低8位寄存器
INC DX
MOV AL,00H
OUT DX,AL ;设置波特率高8位寄存器
MOV DX,COMLCR
MOV AL,03H
OUT DX,AL ;设置数据8位,停止1位,无奇偶校验
MOV DX,COMMCR
MOV AL,00H
OUT DX,AL ;设置调制解调器控制寄存器
MOV DX,COMIER
MOV AL,00H
OUT DX,AL ;关闭中断功能
RET ;这个是不可以少的
_ZJCOMSET ENDP
;#################################################
_ZJCOMSND PROC NEAR ;发送一个字符的函数
PUSH BP
MOV BP,SP
L1: MOV DX,COMLSR
IN AL,DX
AND AL,20H ;取出第5位
SUB AL,20H ;检测第5位是否为1,为1可以发送
JNZ L1
MOV DX,COMADDR
MOV AL,[BP+4]
OUT DX,AL ;发送数据
POP BP
RET ;这个是不可以少的
_ZJCOMSND ENDP
;################################################
_ZJCOMIST PROC NEAR ;设置串口接收中断
;修改中断向量表
PUSH DS ;下面使用了这个段寄存器
PUSH ES ;所以要先保护
MOV AL,0CH ;指定中断号0CH(即COM1)
MOV AH,35H ;调用35H号功能获得中断向量
INT 21H ;
MOV INTOFF,BX ;将返回的向量ES:BX
MOV BX,ES ;保存在变量中
MOV INTSEG,BX
CLI ;修改前关中断
MOV AL,0CH;指定中断号0CH(即COM1)
MOV AH,25H;调用25H功能修改中断向量
MOV DX,SEG INTSEV;指向新的中断向量
MOV DS,DX ;DS指向新的段址
MOV DX,OFFSET INTSEV;DX指向偏移量
INT 21H
POP ES
POP DS
;8250重新设置成接受中断
MOV DX,COMMCR
MOV AL,08H ;OUT2位置"1",打开COM1中断
OUT DX,AL
MOV DX,COMIER
MOV AL,01H ;只允许接收中断
OUT DX,AL
;8259中断控制器的设置
IN AL,21H ;设置8259中断屏蔽寄存器IMR
AND AL,0EFH
OUT 21H,AL
STI
RET
_ZJCOMIST ENDP
;#################################################
_ZJCOMRCV PROC NEAR ;通过中断接受字符
STI
;等待中断
LW: MOV AL,CONTRL
SUB AL,01H
JNZ LW
MOV CONTRL,00H
MOV AL,RCVBYT
CLI
RET
_ZJCOMRCV ENDP
;################################################
INTSEV PROC NEAR
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
STI ;开中断
MOV CONTRL,01H ;
MOV DX,3F8H
IN AL,DX ;读入字节
MOV RCVBYT,AL ;
CLI ;关中断
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
MOV AL,21H
OUT 20H,AL
IRET;中断返回
INTSEV ENDP
;################################################
END
发送文件的源程序:文件john02.c
/* Set Com1 ***/
/** baud rate: 2400 ***/
/** farmat: 8,1,N ***/
#include <stdio.h>
#define DELAYTIME 200
extern void ZJCOMSET(void);
extern void ZJCOMSND(char c);
extern char ZJCOMRCV(void);
extern void ZJCOMIST(void);
/*public char recbuf[5000];*/
void delay(int i)
int j;
for(j=0;j<256;j++)
for(;i>0;i--);
main()
long int i;
char filename[50]='t';
char ch;
FILE *fp;
do /*打开一个要发送的文件。*/
printf("\nEnter file name(enter 0 to exit):");
scanf("%s",filename);
if( (fp=fopen(filename,"r"))==NULL )
printf("\nFile does not exist!!!");
while((fp==NULL) && filename[0]!='0');
printf("get file %s\n",filename);
ZJCOMSET();
for(i=0;i<5;i++)
delay(DELAYTIME);
ZJCOMSND('Z'); /*开始进行文件名传送的标志*/
delay(DELAYTIME);
ZJCOMSND('J');
printf("\nSending filename!!");
for(i=0;filename[i]!=NULL;i++)
ZJCOMSND(filename[i]);
delay(DELAYTIME);
printf("%c",filename[i]);
delay(DELAYTIME);
ZJCOMSND('$');
printf("\nSending filename OK!!");
for(i=0;i<5;i++)
delay(DELAYTIME);
ZJCOMSND('Z'); /*开始进行文件传送的标志*/
delay(DELAYTIME);
ZJCOMSND('J');
printf("\nSending file!");
while( (ch=fgetc(fp)) !=EOF )/*从文件读一字符*/
printf(".....");
delay(DELAYTIME);
ZJCOMSND(ch);
delay(DELAYTIME);
ZJCOMSND('$');
printf("\nSending OK!");
fclose(fp);
getch();
exit(0);
接收文件的源程序:文件john03.c
/* Set Com1 ***/
/** baud rate: 2400 ***/
/** farmat: 8,1,N ***/
#include "stdio.h"
#include "dos.h"
extern void ZJCOMSET(void);
extern void ZJCOMSND(char c);
extern char ZJCOMRCV(void);
extern void ZJCOMIST(void);
int gethead(void)
int i;
char ch;
for(i=0;i<5;i++)
if((ch=ZJCOMRCV())=='Z')
if((ch=ZJCOMRCV())=='J')
ch=ch;
else return(0);
else return(0);
return(1);
main(void)
int i;
char filename[50]='t';
char ch;
FILE *fp;
ZJCOMSET();/*串口设置*/
ZJCOMIST();/*中断设置*/
printf("\n\n\nGetting file!....\n");
if( gethead()!=0 )
i=0;
ch=ZJCOMRCV();
while(ch!='$')
filename[i]=ch;
ch=ZJCOMRCV();
i++;
printf("\nreceive filename OK!\n");
else
printf("\nreceive head error!");
if(gethead()!=0)
fp=fopen(filename,"w");
ch=ZJCOMRCV();
while(ch!=0X24)
fputc(ch,fp);
ch=ZJCOMRCV();
printf("\nreceive file OK!\n");
fclose(fp);
5,实验总结
开始的时候接受老是出错。后来使用串口调试工具不断地实验,才考虑到可能是发送速度的问题,是发送太快了,而接受来不及,所以丢失信息,导致接收文件失败。于是我在发送的时候,每个字符都进行一定的延时,这样来保证接受的速度匹配。
等待中断指令HLT来等待接收中断也是不行的。因为系统的其它中断也有可能触发处理器开始执行程序。所以我采用的是测试标志字节来判断中断是否发生了。
C语言的文件名也不能太长,否则也出现了不能编译的情况。
串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;此外还要注意不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。 参考技术B 在裸机下运行?DOS 也没有?
就算 TC 编 的,也得要有 DOS 的!
祝你顺利
以上是关于c语言怎么样编写一个时钟程序的主要内容,如果未能解决你的问题,请参考以下文章
C语言 用devc++编写一个模拟时钟,最简单那种就行,但要能在devc++上运行。