PIC实例程序.doc

上传人:豆**** 文档编号:33468819 上传时间:2022-08-11 格式:DOC 页数:51 大小:295KB
返回 下载 相关 举报
PIC实例程序.doc_第1页
第1页 / 共51页
PIC实例程序.doc_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《PIC实例程序.doc》由会员分享,可在线阅读,更多相关《PIC实例程序.doc(51页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、如有侵权,请联系网站删除,仅供学习与交流PIC实例程序【精品文档】第 51 页MCD-DEMO2A/D转换程序实例PIC16F877A+PICC/实验目的:熟悉A/D转换/软件思路:选择RA0做为模拟输入通道;/ 结果只取低8位/ 连续转换5次再求平均值做为转换结果/ 结果送数码管的高低3位显示/硬件要求:跳线J18接通/ 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF/ 为不影响结果,其他拨码开关置OFF。#include /包含单片机内部资源预定义_CONFIG(0x1832); /芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡const

2、 char TABLE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90; /定义常数0-9的数据表格void DELAY(); /delay函数申明void init(); /I/O口初始化函数申明void display(int x); /显示函数申明/- /主程序开始void main() int result=0x00; /定义转换结果寄存器 while(1) /死循环 int i; /定义循环次数控制寄存器 result=0x00; /转换结果清0 for(i=5;i0;i-) /求5次转换结果的平均值 init(); /调用初始化函

3、数 ADGO=0X1; /开启转换过程 while(ADGO); /等待转换完成 result=result+ADRESL; /累计转换结果 result=result/5; /求5次结果的平均值 display(result); /调用显示函数 /-/初始化函数void init() PORTA=0XFF; PORTD=0XFF; /熄灭所有显示 TRISA=0X1; /设置RA0为输入,其他为输出 TRISD=0X00; /设置D口全为输出 ADCON1=0X8E; /转换结果左对齐,RA0做模拟输入口,其它做普通I/O ADCON0=0X41; /系统时钟Fosc/8,选择RA0通道,允

4、许ADC工作 DELAY(); /保证采样延时 /-/显示函数void display(int x) int bai,shi,ge,temp; /定义4个临时变量 temp=x; /暂存AD转换的结果 bai=temp/0x64; /求显示的百位 shi=(temp%0x64)/0xa; /求显示的十位 ge=(temp%0x64)%0xa; /求显示的个位 PORTD=TABLEbai; /查表得百位显示的代码 PORTA=0x1f; /RA3输出低电平,点亮百位显示 DELAY(); /延时一定时间,保证显示亮度 PORTD=TABLEshi; /查表得十位显示的代码 PORTA=0x2F

5、; /RA4输出低电平,点亮十位显示 DELAY(); /延时一定时间,保证亮度 PORTD=TABLEge; /求个位显示的代码 PORTA=0x37; /RA5输出低电平,点亮个位显示 DELAY(); /延时一定时间,保证亮度 /-/延时程序void DELAY() /延时程序 int i; /定义整形变量 for(i=0x100;i-;); /延时 2008-3-21 11:47:00flash607等级:小学三年级文章:10积分:432门派:无门无派注册:2008年5月7日第 2 楼学习学习!很好的东西加很好的程序!2008-5-22 10:35:00libozero等级:初中一年级

6、文章:37积分:1204门派:无门无派注册:2008年5月14日第 3 楼求汇编的AD转换程序实例2008-5-28 10:15:00zhongruntian头衔:丐帮帮主等级:老师(版主)文章:8684积分:178421门派:丐帮注册:2005年3月13日第 4 楼坎坷不平,艰难重重,若无耐心,难望有成.PIC16技术支持QQ:443935535 2008-5-28 11:03:00slaoliu等级:高中一年级文章:85积分:2142门派:无门无派注册:2006年11月7日第 5 楼此程序为什么用 PROTEUS7.1 仿真不能正常工作呢.2008-8-15 12:09:00charles

7、_ccw等级:小学三年级文章:9积分:392门派:无门无派注册:2007年1月16日第 6 楼为什麽當我跑程式时转动电位器,不是出现一次0-255,而是0-255 四次呢? 请指教!2008-9-28 14:08:00zhongruntian头衔:丐帮帮主等级:老师(版主)文章:8684积分:178421门派:丐帮注册:2005年3月13日第 7 楼以下是引用charles_ccw在2008-9-28 14:08:00的发言:为什麽當我跑程式时转动电位器,不是出现一次0-255,而是0-255 四次呢? 请指教!这样就对了!877A的A/D转换是10位的,而这个程序只取了低8位。实际转换结果应

8、该是:00 000 - 00 255 - 01 000 - 01 - 01 255 - 10 000 - 10 255 - 11 000 - 11 255 (高两位是二进制,后面三位是十进制,这样写主要是为了方便。如 00 2555 其中00是两位二进制,255是三位十进制)坎坷不平,艰难重重,若无耐心,难望有成.PIC16技术支持QQ:443935535 2008-9-28 15:44:00charles_ccw等级:小学三年级文章:9积分:392门派:无门无派注册:2007年1月16日第 8 楼请问一下,如何才可以变回一组数字呢,即 000-255 或 000-1024 呢? 谢谢!200

9、8-9-28 16:46:00wangjingcan等级:小学二年级文章:7积分:361门派:无门无派注册:2009年2月23日第 9 楼result=result+ADRESL; /累计转换结果?当ADRESL值较大时(如0XFE)数据不会溢出?2009-4-29 10:37:00zhongruntian头衔:丐帮帮主等级:老师(版主)文章:8684积分:178421门派:丐帮注册:2005年3月13日第 10 楼以下是引用wangjingcan在2009-4-29 10:37:00的发言:result=result+ADRESL; /累计转换结果?当ADRESL值较大时(如0XFE)数据不

10、会溢出?result是int型啊。楼主MCD-DEMO2PIC单片机红外线遥控接收解码实例PIC16F877A+PICC/实验目的:熟悉遥控接码解码的方法/数码管显示解码结果:高四位为用户码,低2位为按键码/硬件要求:跳线J19接通,其他跳线断开/ 拨码开关S5、S6全部置ON/ 其他拨码开关全部置OFF#include_CONFIG(0x1832); /芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uchar unsigned char#define uint unsigned intvoid delay(char x,char y);#de

11、fine bitset(var,bitno)(var)|=1(bitno)#define bitclr(var,bitno)(var)&=(1(bitno)union struct unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; oneBit; unsigned char allBits; myFlag;#define CNT2_1 myFlag.oneBit.b1 #define CNT2_2 myFl

12、ag.oneBit.b2 #define CNT2_3 myFlag.oneBit.b3 #define CNT2 myFlag .allBitsstatic bit FLAGS ; static bit Bitin; union Csr unsigned long i; unsigned char Csra4; myCsra;#define RMT RA1 / ;遥控接收输入脚位地址(RA。1)#define BITIN 7 /遥控接收数据位位标志uchar CNT0, CNT3,CNT4; /用户临时寄存器1-4uint CNT1;uchar TABADD; /数码管显示码取码用寄存器uc

13、har CSR0; /;遥控键码反码寄存器uchar CSR1; /;遥控器键码寄存器uchar CSR2; /;遥控器用户码高8位寄存器uchar CSR3; /;遥控器用户码低8位寄存器uchar FLAGS2; /;临时寄存器uchar CSR2A ; /遥控接收32位数据暂存寄存器const uchar table=0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0a1,0x86,0x8e,;/0x00 / 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d,

14、 e, f,/-系统初始化子程序-void initial (void) PORTA=0; ADCON1=7; / 设置RA口全部为普通数字IO口 TRISA=0x02; / 将RMT设置为输入,其它所有IO口设置为输出 TRISD=0; / ;RC口全部为输出 PORTD=0xFF; /先让数码管全部不显示/-void RCV() if(!RMT) CNT1=640; /4*256*10us 640*16=10。24ms CNT2=0; /RCV1 do / ;先检测引导码的9MS低电平_ / ;每一个循环16US if(RMT) CNT2=CNT2+; if(!RMT) CNT2=0; i

15、f(CNT2_2) /高电平大于8*10US=80US则为有效高电平, break; /否则是一些干扰信号16*4=64us while (CNT1-); /低电平大于4*256*10US=10.24MS则是错误脉冲 /RCV2 if(CNT2_2&(0CNT1)&(CNT1320) /;低电平小于2*256*10US=5.12MS_ /320*16=5。12ms则是错误脉冲 CNT1=480; /;3*256*10us 480*16=7.68 CNT2=0; /RCV3 /;每一个循环16US do if(!RMT) CNT2=CNT2+; if (RMT) CNT2=0; if(CNT2_

16、2) / 低电平大于8*10US=80US则为有效低电平,否则是一些干扰信号 break; /RCV4,否则是一些干扰信号16*4=64us / 高电平大于3*256*10US=7.68MS则是错误的 while (CNT1-); /RCV4 if(CNT2_2 & (0CNT1)&(CNT1320) /高电平小于1*256*10US=2.56MS则是错误的 /480-320=160 *16= 2.56ms CNT3 =32; /接收数据共32位,16位用户码,8位控制码加8位控制码的反码 /RCV5 do CNT2=0; CNT0=86; /低电平大于256-170=86*10US=860U

17、S错误 86*10 _ CNT4=200; /高电平大于256-56=200*10US=2MS错误 200*10 /RCV5_HI do /;每一个循环10US if(RMT) CNT2=CNT2+; if(!RMT) CNT2=0; if(CNT2_3) /;高电平大于8*10US=80US则为有效高电平 break; /RCV6否则是一些干扰信号16*4=64us /;低电平大于860US则是错误的 while (CNT0-); /CV6 if(CNT0=0)|(CNT2_3=0) break; CNT2=0; /RCV6_LO do /_ if(!RMT) CNT2=CNT2+; if(

18、RMT) CNT2=0; if(CNT2_3) /低电平大于10*8US=80US则是有效低电平 break ; / COMPARE 否则是一些干扰信号16*4=64us while (CNT4-);/高电平大于256-56=200*10US=2MS错误 if(CNT4=0)|(CNT2_3=0) break; /OMPARE CNT0=(86-CNT0)+(200-CNT4) ; /;减CNT0的值 等于实际低电平计数值 / ;减CNT4的值 等于实际高电平计数值 / ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0 / ;总的值大于255(即时间大于255

19、*10US=2.55MS)则错误 255*10=2.55 / ;总的时间小于70*10US=700US则是错误的 70*10=700 if( (70CNT0)&(CNT0130)|(160CNT0)&(CNT0230) ) ) / ;130*10=1.3MS if(70CNT0)&(CNT0130) /COMPARE_H / ;时间大于1.3MS转去确定是否1 Bitin=0; /;时间在700US-1.3MS之间则是0 else/ if (160CNT01; /;将每一位移入相应寄存器 if(Bitin) bitset ( myCsra. Csra3,7); else bitclr ( my

20、Csra. Csra3,7); else break; while (CNT3-); /;是否接收完32位 CSR3=myCsra. Csra0; CSR2=myCsra. Csra1; CSR1=myCsra. Csra2; CSR0=myCsra. Csra3; CSR2A= CSR0; /;比较键码的反码取反后是否等于键码 /;不等于则接收到的是错误的信息 / 将键码送显示 /-void display() int i; /定义查表变量 i=CSR3&0x0f; /求秒的个位 PORTD=tablei; /送D口显示 PORTA=0x3e; /点亮秒的个位 delay(5,70); /延

21、长一段时间,保证亮度 i=CSR3&0xf0; /求秒的十位 i=i4; /右移4位 PORTD=tablei; /送D口显示 PORTA=0x3d; /点亮秒的十位 delay(5,70); /延长一段时间,保证亮度 i=CSR2&0x0f; /求分的个位 PORTD=tablei; /送D口显示,并显示小数点 PORTA=0x37; /点亮分的个位 delay(5,70); /延长一段时间,保证亮度 i=CSR2&0xf0; /求分的十位 i=i4; PORTD=tablei; /送D口显示 PORTA=0x3b; /点亮分的十位 delay(5,70); /延长一段时间,保证亮度 i=C

22、SR1&0x0f; /求时的个位 PORTD=tablei; /送D口显示,并加上小数点 PORTA=0x2f; /点亮时的个位 delay(5,70); /延长一段时间,保证亮度 i=CSR1&0xf0; /求时的十位 i=i4; PORTD=tablei; /送D口显示 PORTA=0x1f; /点亮时的十位 delay(5,70); /延长一段时间,保证亮度 /-主程序-void main(void) initial (); /系统初始化子程序 while(1) RCV(); /遥控接收程序 display(); /解码显示程序 /-/延时函数void delay(char x,char

23、 y) char z; do z=y; do;while(-z); while(-x);/其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。/则是:14+(3*(Y-1)+7)*(#include_CONFIG(0x1832); /芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uch unsigned char /给unsigned char起别名 uch# define DQ RA0 /定义18B20数据端口 # define DQ_DIR TRISA0 /定义18B2

24、0D口方向寄存器 # define DQ_HIGH() DQ_DIR =1 /设置数据口为输入# define DQ_LOW() DQ = 0; DQ_DIR = 0 /设置数据口为输出unsigned char TLV=0 ; /采集到的温度高8位unsigned char THV=0; /采集到的温度低8位unsigned char TZ=0; /转换后的温度值整数部分unsigned char TX=0; /转换后的温度值小数部分unsigned int wd; /转换后的温度值BCD码形式unsigned char shi; /整数十位unsigned char ge; /整数个位unsigned char shifen; /十分位unsigned char baifen; /百分位unsigned char qianfen; /千分位unsigned char wanfen; /万分位unsigned char table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /0-9的显示代码/-/延时函数void delay(char x,char y) char z; do z=y; do;while(-z); while(-x)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com