stc12c5a60s2中文手册这款单片机的ad功能,测5v电压的话理论上十位ad可以达到1/1024精度,问一下如何编程实现呢?

常见GSM模块介绍
常见GSM模块介绍 ――刊登于《无线电》2008年10期
&&&&GSM是Global System for Mobile Communications的缩写,意为全球移动通信系统,是世界上主要的蜂窝系统之一。GSM是基于窄带TDMA制式,允许在一个射频同时进行8组通话。GSM80年代兴起于欧洲,1991年投入使用。到1997年底,已经在100多个国家运营,成为欧洲和亚洲实际上的标准,到了2001年,在全世界的162个国家已经建设了400个GSM通信网络。但GSM系统的容量是有限的,在网络用户过载时,就不得不构建更多的网络设施。值得欣慰的是GSM在其他方面性能优异,它除了提供标准化的列表和信令系统外,还开放了一些比较智能的业务如国际漫游等。GSM手机的方便之处在于它提供了一个智能卡,人们称之为SIM卡,并且机卡可以分离,这样用户更换手机并且定制个人信息这方面都十分便利了。
&&&&GSM网络经过多年的发展完善,现在已经非常成熟,盲区少,信号稳定,自动漫游,并且通讯距离不受周围环境影响。尤其是GSM短信息,灵活方便,可以跨市、跨省、甚至跨国传送,而且每发送一条短信息只要1毛钱,非常可靠廉价。此外,目前手机SIM卡近年来可以0元申请办理,某些套餐使用费用比固话还低。因此利用手机短信来实现报警、超远程遥控工业设备、传输数据是一个非常不错的选择。
&&&&GSM模块,是一个类似于手机的通讯模块,集成了手机的若干功能于一块小电路板上,它可以发送短消息,通话等等,模块虽小,但它具备了很多手机的功能,拥有它等于就是拥有了手机的核心部分了,它在很多应用领域中都有着广泛的应用,GSM模块通过使用AT指令才能控制它,模块可以与电脑RS232串口相连,也可以用单片机来进行控制。下面我们例举一些典型的应用:
1、 手机控制的门禁系统:
&&&&用GSM控制门禁系统的电控锁,如果你需要进门,只要用手机拨打GSM模块内手机卡号,门就会自动打开,并且只有你设置的手机号码才能开门,而且没有任何费用产生。
2、 三翻广告牌的灾害天气紧急关闭:
&&&&三翻广告牌是通过电机实现不断翻转显示多个广告内容,因为安装在室外,当出现大风、冰雹等灾害天气时,广告牌很容易被吹坏或者卡死损坏,这时需要紧急关闭,你可以通过继电器常闭接点来控制广告牌的电源,这时你只要发送“关闭”控制短信后,广告牌就会自动关闭,并且自动延时一定时间后自动恢复正常工作(一般灾害性天气不会持续很长时间)如果你想提前打开广告牌,可以发送“打开”控制短信。
3、 工程系统的余款催交:
&&&&一些工程都是安全完成后正常运行一段时间后才把余款结清,如果碰到客户恶意拖欠货款,往往安装方非常头疼,因为设备已经安装了,如果拆回来损失很大,尤其是外地客户非常劳民伤财,这时可以在客户系统中先安装的GSM模块,用它进行一路或多路控制系统的一些关键点,当客户恶意拖欠货款时可以通过短信关闭一些功能,迫使客户付清货款然后立即短信开通,如果已经顺利回收货款还可以借系统维护的名义把GSM模块从客户系统中拆除。
4、 监控系统或者网站服务器的报警及复位:
&&&&监控系统或者网站服务器经过长时间运行后可能会出错死机,这时候断电复位是少有的解决方法,这时可以通过GSM模块控制系统的电源,并设置成打开3秒后自动关闭模式,可以实现断电复位,此外,GSM模块在一些特殊应用领域也起到了非常大的作用,如:主电源消失、内存错误、散热风扇停机、燃油耗尽、有人入侵等各种信息,是无人机房监控的理想选择。
5、 家电的远程控制:
&&&&通过短信控制可以轻松实现远程打开电饭煲、热水器等家电,通过控制遥控器或切换到维修模式也能控制空调。
&&&&看完了GSM模块的一些应用举例,相信你一定对它有了非常大的兴趣了吧,由于当前市场上GSM模块产品型号众多,很多国外产品可用的资料却比较少,特别是中文开发文档比较少,所以,在此我们例举一些技术成熟,文档资料易找,购买起来方便的几款GSM模块产品。它们分别是西门子的TC35i,明基BENQ M22,傻瓜式GSM模块JB35GD等,下面我们就一起来看一下市面上常见的几款GSM模块。
&&&&TC35i模块是一款支持中文短信息的工业级的新版GSM模块,工作在EGSM900和GSM1800双频段,电源范围为直流3.3~4.8V ,休眠状态电流消耗为3.5mA,空闲状态为25mA,发射状态为300mA(平均),峰值为2.5A;可传输语音和数据信号, 功耗在EGSM900(4类)和GSM1800(1类)分别为2W和1W ,通过接口连接器和天线连接器分别连接SIM卡读卡器和天线。SIM电压为3V/1.8V,TC35i通过AT命令可双向传输指令和数据,可选波特率为300b/s~115kb/s , 自动波特率为1.2kb/s~115kb/s。它支持Text和PDU格式的SMS(Short Message Service,短消息),可通过AT命令或关断信号实现重启和故障恢复。
&&&&TC35i由供电模块(ASIC)、闪存、ZIF连接器、天线接口等6部分组成。作为TC35i的核心基带处理器主要处理GSM终端内的语音和数据信号,并涵盖了蜂窝射频设备中的所有模拟和数字功能。
TC35i硬件设计:
&&&&TC35i模块有40个引脚,通过一个ZIF(Zero Insertion Force,零阻力插座)连接器引出。这40个引脚可以划分为5类,即电源、数据输入/输出、SIM卡、音频接口和控制。
&&&&TC35i的第1~5引脚是正电源输入脚通常推荐值4.2V,第6~10引脚是电源地。11、12为充电引脚,可以外接锂电池,13为对外输出电压(共外电路使用),14为ACCU-TEMP接负温度系数的热敏电阻,用于锂电池充电保护控制。
&&&&15脚是启动脚IGT,系统加电后为使TC35i进入工作状态,必须给IGT加一个大于100ms的低脉冲,电平下降持续时间不可超过1ms。
&&&&16~23为数据输入/输出,分别为DSR0、RING0、RxD0、TxD0、CTS0、RTS0、DTR0 和DCD0。tc35i模块的数据输入/输出接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准。它有固定的参数:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600。硬件握手信号用RTS0/CTS0,软件流量控制用XON/XOFF,CMOS电平,支持标准的AT命令集。
&&&&其中18脚RXD、19脚TXD为TTL的串口通讯脚,可以方便和单片机进行通讯。
&&&&TC35i使用外接式SIM卡, 24~29为SIM卡引脚,SIM卡同TC35i是这样连接的:SIM上的CCRST、CCIO、CCCL、CCVCC和CCGND通过SIM卡阅读器与TC35i的同名端直接相连,ZIF连接座的CCIN引脚用来检测SIM卡是否插好,如果连接正确,则CCIN引脚输出高电平,否则为低电平。
&&&&TC35i的第32脚SYNC引脚有两种工作模式,一种是指示发射状态时的功率增长情况,另一种是指示TC35i的工作状态,可用AT命令AT+SYNC进行切换,本模块使用的是后一种。当LED熄灭时,表明TC35i处于关闭或睡眠状态;当LED为600 ms亮/600ms灭时,表明SIM卡没有插入或TC35i正在进行网络登录;当LED为75 ms亮/3s熄时,表明TC35i已登录进网络,处于待机状态。
&&&&30、31、32脚为控制脚,其中30为RTC backup,31为Power down,32 为SYNC。
&&&&35~38为语音接口,35、36接扬声器放音。37、38可以直接接驻极体话筒来采集声音(37是话筒正端,39是话筒负端)
&&&&TC35I开发技巧:
&&&&模块的供电电压如果低于3.3V会自动关机。同时模块在在发射时,电流峰值可高达2A。同时在此电流峰值时,电源电压(送入模块的电压)下降值不能超过0.4V。所以该模块对电源的要求较高,电源的内阻+FFC联接线的电阻必需小于200mΩ。
&&&&单片机通过两根I/O口控制TC35的开关机、复位等,通过串口与TC35进行数据通信,通信速率为9600Kbps,采用8位异步通讯方式,1位起始位,8位数据位,1位停止位。
&&&&TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,因此必要时加端口保护。
&&&&M22是BENQ推出的一款内置TCP/IP over PPP的GPRS模块,价钱比较便宜。在设计结构上,它采用插槽代替排线,这样就可以将其悬空放置,不占用PCB面积,它的下面可以放置SIM卡槽和其他芯片和电路。通过AT指令完成GPRS拨号,PPP连接,TCP/IP应用,使用较方便。但是,它的缺点也很明显:稳定性不够,麦克风和听筒接口需要比较麻烦的滤波电路。TCP/IP部分功能有限,只能实现标准的TCP/UDP通信,只能作为客户端,不支持侦听,也就不能作服务器。但即使能提供侦听功能模块,在大多数GPRS环境下也不能使用,因为通常,中国移动分配给GPRS终端用户的IP地址并非INTERNET上的公网IP,而是移动内部地址,通过NAT方式访问INTERNET。这样,公网IP用户就无法连接上移动内部IP。这里多说几句,需要实现类服务器功能的用户,在这种情况下可以自己编写代码,通过识别特定短信号码或内容信息来主动连接到INTERNET公网IP地址用户,从而实现类似的伪服务器的功能。如果采用某些DTU,甚至可以不用写该短信识别程序,一般DTU都内置短信-〉连上GPRS的功能,只需要简单设置几个参数。
关于拨号:如果您拨号后显示的是PPP协议信息,请用 AT*97#
&&&&关于TCP/IP使用:拨号成功后,数据实现透明传输。发送+++后等待一段时间后返回AT指令模式,此时如果需要再次返回数据模式,使用ATO;需要断开TCP(UDP不存在持续连接)持续连接,使用ATH。
&&&&一些关于M22的问题(主要谈软件方面,不涉及硬件特性问题):
1、在使用TCP协议时,数据帧长度超过1200个字节,TCP连接会断掉;在使用UDP协议时,数据帧长度超过1024,模块会直接复位。
2、有时候提示连上GPRS之后,却无法发送和接收任何数据。
3、有时候在拨号后,模块会自动重新启动,过程中不响应任何AT指令,通常等待15秒后模块重启,此时可重新拨号。
4、发送数据长度超过1024后自动发送该1024部分;不及1024而需要发送,可以在向串口发送数据后,等待2-3秒,数据会自动发送出去。
5、有些时候,模块一旦断掉后,就无法自动重启,而必须先手动断开电源,再打开的方式重新启动。察看硬件手册,可以通过设置相关硬件引脚并且通过AT指令感应该引脚电压来实现软件重启功能,这样也许可以解决我们遇到的问题,但因为条件限制,没有最终测试。
&&&&常见的家庭防盗报警器都是通过电话线拨号报警的,然而固定电话配线箱一般都集中放置在居民楼的楼道里,如果小偷入室以前先打开配线箱把电话线破坏了,系统就不可能报警了。如果用JB35GD开发的家庭GSM防盗报警器,就完全可以避免被破坏的可能,大大增加了报警器的可靠性和安全性。
&&&&用JB35GD开发汽车GSM报警器,直接把车辆报警短信发到用户的手机里,可以在全球任何一个角落监控你的汽车,有效解决你在高层住宅楼上或商场内听不到车辆报警声音的矛盾。还能用手机远程遥控被盗汽车断油、断电。利用手机SIM卡的基站定位功能还能大至确定被盗汽车的位置。利用JB35GD向外发短信或拨打电话报警,可以做到现场无任何声音,有效解决汽车停在住宅小区内报警噪音扰民的问题,真正做到绿色环保。
JB35GD系列短信模块有着以下一些特点:
1.模块可以直接驱动8路继电器。8路继电器可以用短信遥控、短信定时遥控、DTMF遥控、振铃遥控来控制。
2.具有短信遥控结果回传功能。模块在收到遥控短信后,能把控制结果仍以短信的形式回传。
3.设有来电号码过滤器,拒绝非法手机遥控模块继电器,使你的手机具有遥控“身份证”的作用。
4.模块的设计思路以人性化为本,以直观的中文作为短信遥控指令和报警短信内容,且用户可自定义。
5.模块内可以预先存入20条报警短信内容和发送手机号,可以在有线或无线传感器的触发下对应发送。
6.12个无线报警防区(需在JB35G的扩展管脚上增配315M解码接收板)。
7.8个有线报警防区,采用上下沿跳变触发报警,适合接任何形式的传感器。
8.每路有线和无线报警防区触发后,能同时向6个手机发送报警短信、向6个手机拨打报警电话。
9.报警短信内容和号码的设置可以用电脑软件改写,也可以用手机发短信来改写。
10.设防/解防控制脚,通过外接高低电平来控制12个无线防区和8个有线防区的设防、解防。
11.可以通过手持遥控器对模块进行设防、解防、半设防、禁止解防(需增配315M接收板和遥控器)。
12.可以通过短信和电话控制模块进行设防、解防。
13.可以通过短信定时遥控功能,实现每天几点几分自动设防,几点几分自动解防。
14.支持语音通话功能,可以用模块开发车载电话。
15.报警后可以监听环境声音。
16.智能化RS232、TTL串口,既能传送数据,又能把计算机文本发送给普通手机阅读。
17.来电显示号码可以通过串口输出。
18.工作电压采用12V直流供电,兼容汽车供电系统。
19.具有免话费的振铃遥控功能。通过拨打电话时的来电显示和振铃声的触发下,使继电器的状态翻转。
20.JB35GD增配了短信测量A/D转换板,就能把现场采集测量到的5路温度数据和8路电压量数据以短信的形式发到你的手机上,实现远程漫游监测。
&&&&JB35GD短信模块是一个由GSM模块加上单片机组成的一个控制系统。GSM或CDMA手机模块主要是用来建立无线信道,并接收和发出短消息。单片机系统用来控制手机模块,并且对收到的短消息信息进行解释并执行。单片机控制板采用双CPU模式,使系统能同时处理多项任务,采用独立时钟的看门狗电路,防止软件死机。由MT8870负责双音频解码,完成DTMF通话遥控,MAX232完成和计算机的RS232通讯,CD4094完成输出串行转并行的八路隔离驱动继电器。
&&&&该模块机体积非常小巧,没有设计话筒插座,但是板上预留了接口,模块上21~25引脚的含义是:21、22接驻极体话筒,23、24接32欧姆左右的喇叭,25是地。
管脚描述:
1脚: 接地 GND
2脚: 正电源 VCC +12V
3脚: 第八路三极管集电极开路输出,可直接驱动继电器。
4脚: 第七路三极管集电极开路输出,可直接驱动继电器。
5脚: 第六路三极管集电极开路输出,可直接驱动继电器。
6脚: 第五路三极管集电极开路输出,可直接驱动继电器。
7脚: 第四路三极管集电极开路输出,可直接驱动继电器。
8脚: 第三路三极管集电极开路输出,可直接驱动继电器。
9脚: 第二路三极管集电极开路输出,可直接驱动继电器。
10脚: 一路三极管集电极开路输出,可直接驱动继电器。
11脚: 有线报警传感器S1输入,下降沿触发,受20脚设防、解防控制。
12脚: 有线报警传感器S2输入,下降沿触发,受20脚设防、解防控制,对应报警设置(一)短信。
13脚: 忙闲状态输出(低电平0V:表示JB35GD处于空闲待机状态;高电平5V:表示JB35GD处于忙的状态)
14脚: 有线报警传感器S3输入,下降沿触发,受20脚设防、解防控制。
15脚: 有线报警传感器S4输入,上升沿触发,受20脚设防、解防控制。
16脚: 有线报警传感器S5输入,上升沿触发,受20脚设防、解防控制。
17脚: 有线报警传感器S6输入,上升沿触发,受20脚设防、解防控制。
18脚: 有线火灾烟雾传感器S7输入,下降沿触发,24小时永远设防。
19脚: 有线紧急按钮S8输入,下降沿触发,24小时永远设防。
20脚: 设防/解防控制脚,通过外接高低电平来控制系统的无线报警输入和有线报警输入的设防、解防。
JB35GD右侧扩展管脚描述:
21脚: 连接315M解码接收板上的PT2272的VT脚。
22脚: 连接315M解码接收板上的PT2272的13脚。
23脚: 连接315M解码接收板上的PT2272的12脚。
24脚: 连接315M解码接收板上的PT2272的11脚。
25脚: 连接315M解码接收板上的PT2272的10脚。
26脚: 给外部的315M解码接收板提供+5V的工作电源。
27脚: 接地 GND,连接315M解码接收板上的接地 GND。
使用时一步,接通12V稳压直流电源。(如果驱动8只继电器,则必须保证稳压电源的输出电流≥1000mA,变压器功率≥10W。)
&&&&如果是一次接通电源,须等待20秒~10分钟,LED光才亮,进入待机状态。如果是第二次以后接通电源,则只须等待20~30秒,LED发光管亮,进入待机状态。(在此等待时间内JB35先进行GSM网络搜寻,再进行SIM卡格式化过程。GSM网络搜寻大约须要20~30秒时间。SIM卡格式化过程大约须要1秒~10分钟不等。格式化SIM卡的目的是删除SIM卡内的电话簿和短信箱中的内容,因为这些存储空间是JB35以后用来存储运行中一些重要数据的。格式化时间的长短取决于电话簿里的内容多少,如果电话簿内容本身为空,则只须10秒就完成格式化。)登陆网络成功以后LED会变成常亮,而且手机模块上的一个绿色贴片LED也会以0.5HZ的频率闪光,表示网络连接成功。
&&&&除了上述几款GSM模块,我们还可以看到的模块有:Wavecom 的GSM(Mo3、Mo2),爱立信的DM10/DM20, GM22/GM25,GM47/48等,中兴的ZXGM18,ZXGM28。Motorola 的d10、d15。有兴趣的读者,可以从网络上了解一下相关信息。
&&&&BenQ是较便宜的GPRS模块而且带TCP/IP协议栈。工业及车载的高可靠性应用西门子是一选择,一般工业及车载应用但对成本较敏感的话,可以用Wavecom的。普通环境及成本高度敏感的,建议用BenQ的。另外要清楚的是:在选择GPRS数据通讯时要注意是否需要内嵌TCP/IP协议栈,这亦影响品牌及型号的选择GPRS外置Modem一般仅是GPRS模块+SIM卡+电源变换+RS232接口及简单的控制电路组成,嵌入式应用较好直接用模块,桌面应用可以考虑采用成品外“猫”,原装进口价也就1千多。嵌入式应用选模块时,若仅使用SMS及语音的话,西门子的TC35i是不错的选择,若使用GPRS数据通讯的话,较好选带协议栈的模块,低端则可选BenQ的模块如M22。
以上部分内容转载于网上,如有涉及到版权问题,请即通知本人删除 浙ICP备号
联系地址:浙江省杭州市西湖科技园西园七路3号4层
邮政编码:310011&Email:
电话总机:0
技术QQ熊工:
技术QQ徐工:
杭州晶控电子有限公司 版权所有
COPYRIGHT2003――2011 HANGZHOU KinCony ELECTRONICS CO.,LTD All
rights reserved关于单片机的生产实习-海文库
全站搜索:
您现在的位置:&>&&>&电子/电路
关于单片机的生产实习
(生产实习)
起止日期:
2013 年 6 月 24 日 至
2013 年 7 月 19 日
学班成生姓名 级 绩 闵金涛 10电信科2班指导教师(签字)
计算机与信息工程学院2013年 7 月 19 日
目录第一章 系统开发 .............................................................. 21.1 生产实习介绍 ........................................................... 21.1.1生产实习的目的 .................................................... 21.1.2生产实习的意义 .................................................... 21.2单片机开发系统介绍 ..................................................... 21.2.1单片机简介及功能介绍 .............................................. 21.2.2开发系统总的原理图 ................................................ 41.2.3开发系统的组成 .................................................... 51.3单片机开发板的焊接 ..................................................... 81.3.1焊接原则: ........................................................ 81.3.2焊接前准备: ...................................................... 81.3.3焊接前知识准备: .................................................. 81.3.4焊接步骤: ........................................................ 8第二章
程序下载 ............................................................. 102.1程序生成 .............................................................. 102.2具体操作 .............................................................. 102.2.1第一步:建立工程项目文件 ......................................... 102.2.2第二步:建立源文件 ............................................... 132.2.3第三步:将源程序文件添加到工程项目中 ............................. 152.2.4第四步:为添加到工程项目的程序文件进行编译和链接 ................. 16第三章 基于单片机的片外开发 .................................................. 183.1前向通道的组成及其特点 ................................................ 18第四章 主要相关程序 .......................................................... 204.1 1602的相关程序 ....................................................... 204.2 A/D的相关程序 ........................................................ 234.3按键控制数码管 ........................................................ 294.4 串口发送 .............................................................. 294.5串口接收 .............................................................. 314.6 蜂鸣器唱歌 ............................................................ 334.7流水灯 ................................................................ 36第五章 开发过程遇到的问题及解决办法 .......................................... 38第六章 实习体会 .............................................................. 39
第一章 系统开发1.1 生产实习介绍1.1.1生产实习的目的1.联系电路板焊接技术,熟悉STC12C5A60S2单片机的电路图;2. 学习Keil uVision2集成开发工具的操作及调试程序的方法;3.熟悉STC12C5A60S2单片机系统版及试验系统的结构及使用;4.进行STC12C5A60S21单片机指令系统软件编程设计与硬件接口功能设计;5.独立完成STC12C5A60S2单片机有关的相关作业;6.完成STC12C5A60S21单片机有关的片外扩展;7.独立完成实习报告;1.1.2生产实习的意义生产实习是本科教学计划中非常重要的实践性教学环节,是理论教学的完善和补充;生产实习也将理论知识和实际应用联系起来,增强学生的感性认识;了解电子信息产品组成、生产工艺过程及信息网络的构成。此次生产实习是将理论知识与实际应用结合起来,从实际出发分析、研究和解决问题,将单片机的知识系统化,而且能对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、纠错、调试、焊接技术相关仪器设备的使用技能方面得到全面的锻炼和提高,为今后独立进行某些单片机应用系统的开发设计打下坚实基础。1.2单片机开发系统介绍1.2.1单片机简介及功能介绍1.单片机简介STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。2.功能特性:1)为一般控制应用的 8 位单芯片;2)晶片内部具时钟振荡器(传统最高工作频率可至 12MHz);3)内部程式存储器(ROM)为 4KB;4)内部数据存储器(RAM)为 128B;5)外部程序存储器可扩充至 64KB;2
6)外部数据存储器可扩充至 64KB;7)32 条双向输入输出线,且每条均可以单独做 I/O 的控制;8)5 个中断向量源;9)2 组独立的 16 位定时器;10)1 个全多工串行通信端口;11)8751 及 8752 单芯片具有数据保密的功能;12)单芯片提供位逻辑运算指令;
STC12C5A60S2各引脚VCC:STC12C5A60S2 电源正端输入,接+5V。VSS:电源地端。XTAL1:单芯片系统时钟的反相放大器输入端。XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。RESET:STC12C5A60S2的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。EA/Vpp:&EA&为英文&External Access&的缩写,表示存取外部程序代码之意,低电平动作,也就 3
是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。ALE/PROG:ALE是英文&Address Latch Enable&的缩写,表示地址锁存器启用信号。STC12C5A60S2可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为STC12C5A60S2是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。PSEN:此为&Program Store Enable&的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。AT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。PORT0(P0.0~P0.7):端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。设计者必须外加一锁存器将端口0送出的地址栓锁住成为A0~A7,再配合端口2所送出的A8~A15合成一完整的16位地址总线,而定址到64K的外部存储器空间。 PORT2(P2.0~P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当做一般I/O端口使用外,若是在STC12C5A60S2扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当做定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发脚位。PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。其引脚分配如下:P3.0:RXD,串行通信输入。P3.1:TXD,串行通信输出。P3.2:INT0,外部中断0输入。P3.3:INT1,外部中断1输入。P3.4:T0,计时计数器0输入。P3.5:T1,计时计数器1输入。P3.6:WR:外部数据存储器的写入信号。P3.7:RD,外部数据存储器的读取信号。4
1.2.2开发系统总的原理图
图1-2 开发板原理图
1.2.3开发系统的组成1.电源模块STC12C5A60S21单片机芯片的第40脚为正电源引脚VCC,一般外接+5V电压,第20脚为接地引脚GND。5
图1-3 电源模块
2.串口通信模块串行通信模块传送可靠性高,并行传输速率高。在串行通信中按照数据传送方向,串行通信可分为单工、半双工和全双工三种制式。在进行串行通信接口设计时,必须根据需要确定选择标准接口、传输介质及电平转换等问题。和并行传送一样,现在已经有很多种串行标准总线,如RS-232C,RS-422、RS-485和20mA电流环等。采用标准接口后,能够方便地把单片机和外设、测量仪器等有机地连接起来,从而构成一个测控系统。此次开发板采用的是MAX232芯片提供由电脑串口到开发板的+10V到+5V的电平转换。MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。主要特点为符合所有的RS-232C技术标准,只需要单一 +5V电源供电,片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V- 功耗低,典型供电电流5mA 内部集成2个RS-232C驱动器,内部集成两个RS-232C接收器。
图 1-4 串口通信电路
3.时钟电路设计单片机是一种时序电路,必须要有时钟信号才能正常工作。芯片的18脚(XTAL2)、19脚(XTAL1)分别为片内反向放大器的输出端和输入端,只要在18脚(XTAL2)和19脚(XTAL1)之间接上
一个晶振,再加上2个30PF的瓷片电容即可构成单片机所需的时钟电路。注意,当采用外部时钟时,19脚(XTAL1)接地,18脚(XTAL2)接外部时钟信号
图1-5 时钟电路设计
4.复位电路的设计单片机芯片的第9脚RST(Reset)是复位信号输入端。在开机或工作中因干扰而使程序失控,或工作中程序处于某种死循环状态等情况下都需要复位。MCS-51系列单片机的复位靠外部电路实现,信号从RST引脚输入,高电平有效,只要保持RST引脚高电平2个机器周期,单片机就能正常复位。常见的复位电路有上电复位电路和按键复位电路二种。4.程序存储器选择电路单片机芯片的第31脚(EA)为内部与外部程序存储器选择输入端。当EA引脚接高电平时,CPU先访问片内4KB的程序存储器,执行内部程序存储器中的指令,当程序计数器超过0FFFH时,将自动转向片外程序存储器,既是从1000H地址单元开始执行指令;当EA引脚接低电平时,不管片内是否有程序存储器,CPU只访问片外程序存储器。AT89S51内部有4KB的程序存储器,所以根据该脚的引脚功能,只有将该脚接上高电平,才能先从片内程序存储器开始取指令。常见的程序存储器选择电路就是将第31脚直接接到正电源上。5.定时中断电路两个外部中断(INT0 和INT1),三个定时中断(定时器0、1、2)和一个串行中断。每个中断源都可以通过置位或清除特殊寄存器IE 中的相关中断允许控制位分别使得中断源有效或无效。对于AT89S52,IE.5位也是不能用的。用户软件不应给这些位写1。定时器2可以被寄存器T2CON中的TF2和EXF2的或逻辑触发。程序进入中断服务后,这些标志位都可以由硬件清0。中断服务程序必须判定是否是TF2 或EXF2激活中断,标志位也必须由软件清0。定时器0和定时器1标志位TF0 和TF1在计数溢出的那个周期的S5P2被置位。定时器2 的标志位TF2 在计数溢出的那个周期的S2P2被置位,在同一个周期被电路捕捉下来。中断允许控制位=1,允许中断;中断允许控制位=0,禁止中断。7
1.3单片机开发板的焊接1.3.1焊接原则:1.熟练使用电烙铁等焊接工具焊接贴片等元器件2.熟练掌握单片机最小系统工作原理并学会运用3.此次焊接训练不是为了焊接而焊接,是为了让大家从理论到实践的一个过渡,也是为了让大家更好地掌握单片机的工作原理。1.3.2焊接前准备:1.旧毛巾一块(自带):用来抨放电路板;2.电烙铁一个(提供):焊接最重要的工具,用来焊接元器件;3.镊子一个(提供):用来夹取贴片元件;4.元器件盒(提供):用来盛放元器件;5.模仿板一块(提供)1.3.3焊接前知识准备:1.认识学习板上的每一个元器件(包括每一个贴片电阻、电容、、、)2.会区分LED(发光二极管)的正负3.知道芯片座的方向(注意缺口)1.3.4焊接步骤:1.注意事项:拿到练习板之后先不要焊接,把板子上的电路看清楚,知道什么元器件放在什么位置上在进行焊接(检测板子有无短路现象)。1)电源模块:(1)领取电源模块所需的元器件(2)焊接贴片元件(3)焊接插件(先焊小的再焊大的):依次焊LED→拨动开关→DC座(4)检测环节:用万用表检测贴片元件有无短路、断路;检查LED的方向有没有焊反,以上都没问题的话进入下一步(5)通电检测,给DC座供上5V电源,拨动开关,观察指示灯是否正常发光,用万用表检测其供电电压是多少,检测LED的压降是多少。2)复位电路(1)领取复位电路所需的元器件(2)焊接贴片元件8
(3)焊接复位按键(4)检测环节:用万用表检测贴片元件有无短路、断路;以上都没问题的话进入下一步(5)通电检测,给DC座供上5V电源,用万用表的20V电压档检测,红表笔接在复位(RST)9号引脚上黑表笔接地,拨动开关观察电压表示数变化(6)测试手动复位:红黑表笔仍然不动,按下复位键不松观察万用表的示数为多少,松开按键又为多少?3)晶振电路(1)领取晶振电路所需的元器件(2)焊接贴片元件(3)焊接晶振(4)检测环节:用万用表检测贴片元件有无短路、断路;(5)通电检测检测晶振电路工作是否正常;4)单片机模块(1)领取单片机模块所需的元器件(2)焊接贴片元件(3)焊接40脚芯片座(注意芯片座方向)(4)检测环节:用万用表检测贴片元件有无短路、断路;(注意:这里不焊排阻和排针)4)串行通信电路:
、(1)领取串行通信电路所需的元器件(2)焊接贴片元件(3)焊接16脚芯片座(注意芯片座方向),焊接串口座等元件(4)检测环节:用万用表检测贴片元件有无短路、断路;检查芯片座方向有没有焊反。
程序下载2.1程序生成2.1.1步骤:1.首先建立工程项目文件;2.为工程选择目标器件(如TA89S52);3.工程项目设置软硬件调试环境;4.创建源程序文件并输入程序代码;5.保存创建的源程序项目文件;6.把源程序文件添加到项目中;2.2具体操作2.2.1第一步:建立工程项目文件1.
Keil uVision3.LNK快捷图标2.
3.打开工程下拉菜单,选择点击“新建工程“,首先在这里要新建一个工程项目文件。10
图2-24.为工程文件取一个名称,确定选择存放的路径(事先为每一个工程单独建立一个目录),在建立工程时形成的所有文件全部存放在这个目录下,如起工程名y2(此时不加后缀),保存类型选择
Project Files(*.uv2)点保存
选择新建工
5.接下来选择CPU驱动芯片,如AT89S52芯片,然后点确定。
图2-46.这时提示:复制标准的8051开始代码到工程项目文件夹或添加文件到工程项目文件夹?(如果选择Y之后将会产生一个STARTUP文件,对我们实验是一个无用的文件,会在个别计算机上会导致不能创建目标文件,同时会产生一个空白的工程项目文件),选择N之后只建立一个空白的工程项目文件,我们选N便于操作。
至此用户就完成了建立一个空白的工程项目文件,并为工程选好了目标器件,但却是空白的工程项目文件。2.2.2第二步:建立源文件1.在界面中打开文件下拉菜单,在打开的选项中点“新建”,产生一个新建空白文件。
图2-62.在新建空白文件中输入源程序文件13
3.在确认源程序无错时点保存,这时界面上弹出提示“另存为”菜单,选择好保存路径,也就是刚才保存建立工程项目文件的目录路径,输入文件名,如y2.asm(要有后缀,汇编程序是*.asm),然后点击保存。
这时仅仅是完成了汇编程序的建立而已,但y2.asm汇编程序与y2.Uv2工程项目文件现
在还没建立任何关系,此时应把y2.asm源程序文件添加到y2.Uv2工程中,构成一个完整的工程项目。2.2.3第三步:将源程序文件添加到工程项目中1. 在左侧Project
Windows窗口内右击
Source Group1,在弹出下拉菜单中选种 AddFiles to Group‘Source Group1’(向工程中添加源文件)命令,
2.在弹出的菜单栏中点文件类型一栏下拉菜单,选Asm Source Files(*.a*:*.src:*.a*)即(汇编程序),文件框中选择将刚才创建的源程序文件y2.asm然后点Add,这时在文件名框后出现刚才选中y2.asm文件,在点击CLOSE完成源程序文件向工程项目的添加。
2.2.4第四步:为添加到工程项目的程序文件进行编译和链接1.在界面上点工程(Project)选项,在下拉菜单中选择(Options For Target ‘Target ‘),命令为目标设置工具选项。
2.在“目标”(Target)选项卡片外代码内存,片外Xdata内存都为空白。
3.在“输出”选项卡中选择创建HEX文件。
第三章 基于单片机的片外开发单片机主要用于实时控制,因此具有一般计算机控制系统的普遍特征。其典型应用系统应包括单片机系统、用于测控目的前向传感器输入通道,后向伺服控制输出通道以及基本的人机对话通道。大型复杂的测控系统是一个多机系统,还包括机与机之间进行通信的互相通道。图3.1是一个典型单片机应用系统的结构框图。3.1前向通道的组成及其特点前向通道是单片机与测控对象相连的部分,是应用系统的数据采集的输入通道。来自被控对象的现场信息有多种多样。按物理量的特征可分为模拟量和数字、开关量两图3-1典型单片机应用系统结构
种。对于数字量(频率、周期、相位、计数)的采集,输入比较简单。它们可直接作为计数输入、测试输入、I/O口输入或中断源输入进行事件计数、定时计数,实现脉冲的频率、周期、相位及记数测量。对于开关量采集,一般通过I/O口线或扩展I/O口线直接输入。一般被控对象都是交变电流、交变电压、大电流系统。而单片机属于数字弱电系统,因此在数字量和开关量采集通道中,要用隔离器件进行隔离(如光电耦合器件)。模拟量输入通道结构比较复杂,一般包括变换器、隔离放大器、滤波、采样保持器、
多路开关、A/D转换器及其接口电路,如图11.2所示。变换器:变换器是各种传感器的总称,它采集现场的各种信号,并变换成电信号(电压信号或电流信号),以满足单片机的输入要求。现场信号各种各样,有电信号,如电压、电流、电磁量等;也有非电信号,如温度、湿度、压力、流量、位移量等,对于不同物理量应选择相应的传感器。18
隔离放大与滤波:传感器的输出信号一般是比较微弱的,不能满足单片机系统的输入要图3-2 模拟信号的采集通道结构求。要经过放大处理后才能作为单片机系统的采集输入信号。还有,现场信息来自各种工业现场,夹带大量的噪音干扰信号。为提高单片机应用系统的可靠性,必须隔离或削减干扰信号,这是整个系统抗干扰设计的重点部位。采样保持器:前向通道中的采样保持器有两个作用。一是实现多路模拟信号的同时采集;二是消除A/D转换器的“孔径误差”。一般的单片机应用系统都是用一个A/D转换器分时对多路模拟信号进行转换并输入给单片机,而控制系统又要求单片机对同一时刻的现场采样值进行处理,否则将产生很大误差。用一个A/D转换器同时对多路模拟信号进行采样是由采样保持器来实现的。采样保持器在单片机的控制下,在某一个时刻可同时采样它所接电路的模拟信号的值,并能保持该瞬时值,直到下一次重新采样。A/D转换器把一个模拟量转换成数字量总要经历一个时间过程。A/D转换器从接通模拟信号开始转换,到转换结束输出稳定的数字量,这一段时间称为孔径时间。对于一个动态模拟信号,在A/D转换器接通的孔径时间里,输入模拟信号值是不确定的,从而会引起输出的不确定性误差。在A/D转换器前加设采集保持器;在孔径时间里,使模拟信号保持某一个瞬时值不变,从而可消除孔径误差。多路开关:用多路开关实现一个A/D转换器分时对多路模拟信号进行转换。多路开关 是受单片机控制的多路模拟电子开关,某一时刻需要对某路模拟信号进行转换,由单片机向多路开关发出路地址信息,使多路开关把该路模拟信号与A/D转换器接通,其它路模拟信号与A/D转换器不接通,实现有选择的转换。A/D转换器:是前向通道中模拟系统与数字系统连接的核心部件。
第四章 主要相关程序4.1 1602的相关程序#include &reg51.h&#include&absacc.h&
typedef unsigned char BYTE;typedef unsigned int
液晶1602口地址
XBYTE[0xC000]
//写命令#define
XBYTE[0xC100]
//写数据#define
XBYTE[0xC200]
//读命令#define
XBYTE[0xC300]
void lcd_init(void);
// lcd初始化
void write_cmd(BYTE cmd);
// lcd写命令//void write_string(unsigned char *s);
// 写字符串
void write_data(BYTE dat) ;
// 写数据void set_display_place(BYTE line,column);void write_string_lcd(BYTE line,column,unsigned char *string);//void write_data_lcd(BYTE line,column,dat);//void crti(unsigned long dat);//void crt_r(float x,BYTE N);
void Delay(WORD n){WORDwhile(n--){x=500;while(x--);}}/*void Delay2(WORD n){WORDwhile(n--){20
x=5000;while(x--);}}*/
/************************************************************************ Function name:
write_cmdDescriptions:
向lcd输入指令************************************************************************/ void write_cmd(BYTE cmd){BYTEdo {dl=rd_} while((dl&0x80)!=0); //判忙wr_com=Delay(1);}
/********************************************************************** Function name:
write_dataDescriptions:
写入数据**********************************************************************/ void write_data(BYTE dat){BYTEdo {dl=rd_} while((dl&0x80)!=0); //判忙wr_data=Delay(1);}
/*********************************************************************** Function name:
write_stringDescriptions:
写入字符串***********************************************************************/ void write_string(BYTE *s)
{while(*s != '\0')
//'\0'为字符串结束标志{write_data(*s);s++;}21
/********************************************************************** Function name:
set_display_placeDescriptions:
设置字符的显示位置**********************************************************************/ void set_display_place(BYTE line,column){BYTEif(line == 1){address = 0x80 +}else if(line == 2){address = 0xc0 +}write_cmd(address);}
/******************************************************************* Function name:
将字符串写到指定的位置Descriptions:
将字符串显示在lcd的特定位置*******************************************************************/ void write_string_lcd(BYTE line,column,unsigned char *string){set_display_place(line,column);write_string(string);Delay(1);}
/****************************************************************** Function name:
将字符写到指定的位置Descriptions:
将字符串显示在lcd的特定位置*******************************************************************/ /*void write_data_lcd(BYTE line,column,dat){set_display_place(line,column);write_data(dat);Delay(1);}*//***************************************************************液晶模块初始化******************************22
****************************************************/ void lcd_init(void){write_cmd(0x38);//write_cmd(0x38);//write_cmd(0x06);//write_cmd(0x0c);//write_cmd(0x01);//}
/*****************LED显示位置********************/
void main(){//SP=0x60;lcd_init();
while(1){write_string_lcd(1,1,&
&);write_string_lcd(2,1,&
ABCDEDGHIJ
4.2 A/D的相关程序#include &reg51.h&#include &intrins.h&#include&absacc.h&#include&math.h&typedef unsigned char BYTE;
typedef unsigned int WORD;/* AD .......... */sfr P1ASF = 0x9D; //P1 ................sfr ADC_CONTR = 0xBC; //AD ..........sfr ADC_RES = 0xBD; //AD ............sfr ADC_RESL = 0xBE; //AD ............sfr AUXR1 = 0xA2; //AD ..............23
#define ADC_POWER 0x80 //AD ............#define ADC_FLAG 0x10 //AD ..........#define ADC_START 0x08 //AD ..........#define ADRJ1 0x40 //AD ............ 2 ..+.. 8 ..#define ADC_SPEEDLL 0x00 //AD ..............540 ..........
#define ADC_SPEEDL 0x20 //AD ..............360 ..........#define ADC_SPEEDH 0x40 //AD ..............180 ..........
#define ADC_SPEEDHH 0x60 //AD ..............90 ..........
/* .... 1602 ...... */#define wr_com XBYTE[0xC000] //......#define wr_data XBYTE[0xC100] //......#define rd_com XBYTE[0xC200] //......#define rd_data XBYTE[0xC300] //......unsigned char AD_val_h; //AD ............unsigned char AD_val_l; //AD ............unsigned long AD_float AD_void InitADC();void SendData(BYTE dat);//void GetADCResult(BYTE ch);void Delay(WORD n);void Delay2(WORD n);void ShowResult(BYTE ch);void lcd_init(void); // lcd ......void write_cmd(BYTE cmd); // lcd ......//void write_string(unsigned char *s); // ........void write_data(BYTE dat) ; // ......void set_display_place(BYTE line,column);void write_string_lcd(BYTE line,column,unsigned char *string);/******************************************************************** Function name: write_cmdDescriptions: .. lcd ........********************************************************************/ void write_cmd(BYTE cmd){BYTEdo {dl=rd_} while((dl&0x80)!=0); //....wr_com=Delay(1);}24
/******************************************************************* Function name: write_dataDescriptions: ........*******************************************************************/ void write_data(BYTE dat){BYTEdo {dl=rd_} while((dl&0x80)!=0); //....wr_data=Delay(1);}/******************************************************************** Function name: write_stringDescriptions: ..........********************************************************************/ void write_string(BYTE *s){while(*s != '\0') //'\0'................{write_data(*s);s++;}}/*************************************************************** Function name: set_display_placeDescriptions: ..................**************************************************************/ void set_display_place(BYTE line,column){BYTEif(line == 1){address = 0x80 +}else if(line == 2){address = 0xc0 +}write_cmd(address);}/***************************************************************** Function name: ......................Descriptions: .............. lcd ..........*****************************************************************/
void write_string_lcd(BYTE line,column,unsigned char *string) {set_display_place(line,column);write_string(string);Delay(1);}/*************************************************** ************..............**********************************************************************************/ void lcd_init(void){write_cmd(0x38);//write_cmd(0x38);//write_cmd(0x06);//write_cmd(0x0c);//write_cmd(0x01);//}void crti(unsigned long dat){datah=dhi=0;if (datah&=10){do{datah/=10;dhi++;}while(datah&=10);datah=ddi=for (dli=0;dli&dli++){datal=1;for (dei=0;dei&dei++){datal*=10;}datah=dat/dat=dat%datah+=0x30;26
write_data(datah);ddi--;}dat+=0x30;write_data(dat);}else{dat=dat+0x30;write_data(dat);}}/*****************..........****************/ void crt_r(float x,unsigned char N){
if (x&0.0){dat=0x2d;write_data(dat);Delay(1);x=fabs(x);}dath=(int)x;crti(dath);if (N&0){dat=0x2e;write_data(dat);Delay(1);dat=1;for (dli=0;dli&N;dli++){dat*=10;}dath=(int)(x*dat)-dath*crti(dath);}}void crt_U(){write_string_lcd(2,0, &U:&);set_display_place(2,3);27
crt_r(AD_float,3);}void GetADCResult(BYTE ch) //AD ....{AUXR1 &=~ADRJ1;ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START; _nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR & ADC_FLAG));ADC_CONTR &=~ADC_FLAG;AD_val_h=ADC_RES;AD_val_l=ADC_RESL;AD_val=AD_val_h*4+AD_val_l;}void InitADC(){P1ASF=0ADC_RES=0;ADC_CONTR=ADC_POWER|ADC_SPEEDLL;Delay(1);}void Delay(WORD n){WORDwhile(n--){x=500;while(x--);}}void Delay2(WORD n){WORDwhile(n--){x=5000;while(x--);}}void main(){SP=0x60;InitADC();lcd_init();28
AUXR1 &=~ADRJ1; while(1){write_string_lcd(1,2, &P1.7&); GetADCResult(7);AD_float=AD_val*5.0/1024.0; crt_U();Delay2(10);}}
4.3按键控制数码管 #ifndef _ANJIAN_H_ #define _ANJIAN_H_typedef unsigned char uint8;
typedef unsigned int uint16;
typedef char int8;typedef int int16;sbit K0=P1^0;sbit K1=P1^1;sbit K2=P1^2;sbit K3=P1^3;sbit K4=P1^4;sbit K5=P1^5;sbit K6=P1^6;sbit K7=P1^7;sbit WL1=P2^3;sbit WL2=P2^2;sbit WL3=P2^1;sbit WL4=P2^0;#endif4.4 串口发送 /*串行发送*/#include&reg52.h&#define uchar unsigned char #define uint unsigned int sbit LED1=P1^1;sbit LED2=P1^2;sbit K0=P1^0;sbit K4=P1^4;29
uchar Operation_No=0; //操作代码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//数码管代码void delay(uint ms){while(ms--);for(i=0;i&120;i++);}//向串口发送字符void Putc_to_SerialPort(uchar c)
{SBUF=c;while(TI==0); //收到时中断TI=0;
//清除中断}
void uart_init(){SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2PCON=0x00; //波特率不倍增TH1=0
//设置计数初值TL1=0TI=RI=0;TR1=1;
//启动定时器IE=0x90; //允许串口中断
}main(){uart_init();K4=0;LED1=LED2=1;while(1){delay(100);if(K0==0){while(K0==0)Operation_No=(Operation_No+1)%4;switch(Operation_No) //根据操作代码发送A/B/C或停止发送{case 0: Putc_to_SerialPort('X');30
LED1=LED2=1;case 1: Putc_to_SerialPort('A');LED1=~LED1;LED2=1;case 2: Putc_to_SerialPort('B');
LED2=~LED2;LED1=1; case 3: Putc_to_SerialPort('C');
LED1=~LED1;LED2=LED1;
}}}}void uart_interrupt() interrupt 4{if(RI){RI=0;if(SBUF&=0&&SBUF&=10)P0=DSY_CODE[SBUF];elseP0=0x00;}}
4.5串口接收/*串行接收*/#include&reg52.h&#define uchar unsigned char#define uint unsigned intsbit LED1=P1^1;sbit LED2=P1^2;sbit K0=P1^0;sbit K4=P1^4;uchar numx=-1;
void delay(uint ms){while(ms--);31
for(i=0;i&120;i++);}void uart_init(){SCON=0x50; //串口模式1,允许接收 TMOD=0x20; //T1工作模式2
TH1=0 //波特率9600TL1=0PCON=0x00; //波特率不倍增RI=0;TI=0;TR1=1;
//启动定时器IE=0x90;
//允许中断
main(){uart_init();K4=0;while(1){delay(100);if(K0==0){while(K0==0);numx=(numx+1)%11;SBUF=while(TI==0);TI=0;}}}
void uart_interrupt() interrupt 4{if(RI){RI=0;switch(SBUF){case 'X':LED1=LED2=1;
case 'A':LED1=0;LED2=1;
case 'B':LED2=0;LED1=1;
case 'C':LED1=LED2=0;32
}}4.6 蜂鸣器唱歌/******************************************************************** * 文件名
: 蜂鸣器唱歌.c* 描述
该程序实现控制蜂鸣器演奏音乐。* 创建人
: 东流,日* 版本号
: 2.0***********************************************************************/ #include&reg52.h&#define uchar unsigned char#define uint
unsigned intuchar C
sbit Speak =P1^2;
//蜂鸣器器控制脚
sbit P36=P3^6;sbit RS=P2^5;unsigned char code LED[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};/*以下数组是音符编码*/unsigned char code SONG[] ={
//祝你平安0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10, 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10, 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80, 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20, 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10, 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,//路边的野华不要采0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C, 0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20, 0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20, 0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26, 0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F, 0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20, 0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B, 0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20, 0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,
/******************************************************************** * 名称 : Time0_Init()* 功能 : 定时器的初始化,定时时间可用光碟中软件计算,11.0592MZ晶振,10ms * 输入 : 无* 输出 : 无***********************************************************************/ void Time0_Init(){TMOD = 0x01;IE
= 0x82;TH0
= 0xDC;TL0
/******************************************************************** * 名称 : Time0_Int()* 功能 : 定时器中断,中断中实现 Count 加一* 输入 : 无* 输出 : 无***********************************************************************/ void Time0_Int() interrupt 1{TH0 = 0xDC;TL0 = 0x00;Count++;
//长度加1}
/******************************************************************** * 名称 : Delay_xMs()* 功能 : 延时子程序,经过软件调试,测得延时程序大概为55us.* 输入 : x* 输出 : 无***********************************************************************/ void Delay_xMs(uint x){uint i,j;for(i=0; i&x; i++){34
for(j=0; j&3; j++);}}
/********************************************************************* 名称 : Play_Song()* 功能 : 播放蜂鸣器控制程序* 输入 : i (选择播放哪首歌曲,0为“祝你平安”,1为“路边的野花你不要采”* 输出 : 无***********************************************************************/void Play_Song(uchar i){uchar Temp1,Temp2;uint ACount = 0;
//中断计数器清0Addr = i * 217;while(1){Temp1 = SONG[Addr++];
//音符地址加一if (Temp1 == 0xFF)
//休止符{TR0 = 0;Delay_xMs(100);}else if (Temp1 == 0x00)
//歌曲结束符{}else{Temp2 = SONG[Addr++];
//街拍地址加一
注释: 音符地址始终是偶数是奇数TR0 = 1;while(1){Speak = ~S
这两句话是确定音符的a=(int)(Temp1/8);
有音符判断LED亮多少if(a&=0&&a&8)P0=LED[a];
让LED亮相应的个数else (P0=0xfc);Delay_xMs(Temp1);
一二组合确定音符if(Temp2 == Count)
判断节拍{Count = 0;35 节拍地址
}}}}}/********************************************************************* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无***********************************************************************/void Main(){RS=1;P36=0;Time0_Init();
//定时器0中断初始化while(1){Play_Song(0);
//Play_Song(0)为祝你平安
Play_Song(1)为路边的野花你不要裁
Play_Song(1);}4.7流水灯#include&reg51.h&typedef unsigned int uint16;//#define time 100/*void ms (unsigned int x){while(x--){for(i=0;i&200;i++);}}*/main(){int j,a1;uint16//for(i=0;i&2;i++)while(1){a1=0for(j=0;j&8;j++){36
P1=a1;//ms(time);for(x=0;x&50000;x++);
P1=0for(x=0;x&50000;x++);
P1=a1;for(x=0;x&60000;x++);
a1=(a1&&1)|0x01;
第五章 开发过程遇到的问题及解决办法今天遇到个问题。自己做的一个单片机开发板的测试版串口无法工作。并且通电一会后芯片就很热。本着从简到繁的思想。第一步,排除是计算机到单片机的线路有问题,还是单片机部分电路有问题。用串口工具自动发送一段数据。短接串口线的2(Rx接受),3(Tx发送) 管脚,串口说明是单片机部分的电路有问题,也就是芯片的接线问题。第二步:排除接线错误。检查电容,连线是否有虚焊,漏焊的情况,用烙铁又焊了焊。 由于我用的是104的电解电容,所以没有极性接错的问题。虽然芯片手册上注明的是电解电容,但是我看到很多人用电解电容也可以实现通信功能,所以估计我的也应该没问题。先留着这个问题。最后再换。(因为换太麻烦啦)还有就是怀疑电容容量小。我以前用过的电解电容做过,可以通信。因为芯片还伴有发热的现象,听说电容接的不恰当就容易引起芯片发热。所以初步判断是电容问题。实在没辙就换了。正在这思考还有没有其他可能的时候,突然想把串口线和芯片接口的发送接收互换一下。碰碰运气。换过来后,哈哈,一切正常。可以通信,而且芯片也不发热了。
工具可以接受的数据。再短接经过芯片后的发送接收管脚,串口工具无法接收数据。
第六章 实习体会时光飞逝,一转眼,一个学期又进尾声了,本学期的单片机实习课题也在一周内完成了。俗话说“好的开始是成功的一半”。说这次实习,我认为最重要的就是做好程序调试,认真的研究老师给的题目。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起产品就会事半功倍,如果没弄明白,就迷迷糊糊的去做,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。
虽然这次的实习算起来在实验室的时间只有几天,不过因为我们都有自己的实验板,所以在宿舍里做实验的时间一定不止三天。 硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来。
当然,这其中也有很多问题,第一、不够细心比如由于粗心大意焊错了线,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课设是对我的学习态度的一次检验。对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。这个设计过程中,我们通过在原有的计数器系统进行了改进,使之增添了暂停、计数、清零等的三个控制功能,使之成为一个更加适用,功能更加完备的属于自己的一个系统。设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。作为一名自动化专业的快大三学生,我觉得做单片机实习是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似实习就为我们提供了良好的实践平台。首先在做本次实习的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片 39
机实习,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,在实习之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。
上一篇: 下一篇:
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 stc12c5a60s2 的文章

 

随机推荐