单片机程序.docx

上传人:b****0 文档编号:9754413 上传时间:2023-05-21 格式:DOCX 页数:52 大小:3.45MB
下载 相关 举报
单片机程序.docx_第1页
第1页 / 共52页
单片机程序.docx_第2页
第2页 / 共52页
单片机程序.docx_第3页
第3页 / 共52页
单片机程序.docx_第4页
第4页 / 共52页
单片机程序.docx_第5页
第5页 / 共52页
单片机程序.docx_第6页
第6页 / 共52页
单片机程序.docx_第7页
第7页 / 共52页
单片机程序.docx_第8页
第8页 / 共52页
单片机程序.docx_第9页
第9页 / 共52页
单片机程序.docx_第10页
第10页 / 共52页
单片机程序.docx_第11页
第11页 / 共52页
单片机程序.docx_第12页
第12页 / 共52页
单片机程序.docx_第13页
第13页 / 共52页
单片机程序.docx_第14页
第14页 / 共52页
单片机程序.docx_第15页
第15页 / 共52页
单片机程序.docx_第16页
第16页 / 共52页
单片机程序.docx_第17页
第17页 / 共52页
单片机程序.docx_第18页
第18页 / 共52页
单片机程序.docx_第19页
第19页 / 共52页
单片机程序.docx_第20页
第20页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机程序.docx

《单片机程序.docx》由会员分享,可在线阅读,更多相关《单片机程序.docx(52页珍藏版)》请在冰点文库上搜索。

单片机程序.docx

单片机程序

//实验一

#include

voidinterruptintb()

{

PORTC++;

PORTB=PORTB;

RBIF=0;

}

main()

{

TRISB=0B00010000;

OPTION=0B01000000;

GIE=1;RBIE=1;PORTB=PORTB;

TRISC=0;PORTC=0;

loop:

gotoloop;

}

 

//实验二单键触发8位累加器

实验电路图:

实验程序:

#include

/*voiddelay()

{

unsignedinti;

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

}

*/

voidinterruptINTb()

{

if(RBIF==1)

{

PORTC++;

//delay();

PORTB=PORTB;

RBIF=0;

}

elseif(INTF==1)

{PORTC--;

//delay();

INTF=0;

}

elseif(T0IF==1)

{PORTC=PORTC+3;

TMR0=0XFF;

T0IF=0;

}

}

main()

{

TRISB=0B00010001;//RB4,RB0为输入

TRISA=0B00010000;

//初始化

TMR0=0XFF;

//开中断

GIE=1;

RBIE=1;//开中断GIE,RBIE

INTE=1;

T0IE=1;

//初始化C口

TRISC=0;//C口为输出

PORTC=0;//赋初值

//设置INTF=0

OPTION=0B01101000;//设置D6=1上跳变触发

PORTB=PORTB;//RB口读操作使RD=1从而使INTF=0

loop:

gotoloop;

}

 

//实验三车辆里程表

实验电路图:

实验程序:

//动态数码管显示0-F,显示顺序1-RA1,2-RA0,3-RA3,4-RA2,5-RA5,6-RA4

//按电路板上6只数码管从左到右的顺序显示,RC口送笔段码,是共阳极的

//TMR0工作在计数状态以十进制(中断方式),显示在5只led上

//第6只led不用,因为RA4需作为TMR0计数输入端

#include

__EEPROM_DATA(1,2,3,0,0,0,0,0);

charm,a,b,c,d,e,f;

unsignedlongcount,buf,x,y;

staticvolatileunsignedcharca@0x2b;

staticvolatileunsignedcharcb@0x2c;

staticvolatileunsignedcharcd@0x2d;

staticvolatileunsignedcharce@0x2e;

staticvolatilecharra0_5[6]={0xFD,0xFE,0xF7,0xFB,0xDF,0xEF};

staticvolatilechartable[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

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

voiddelay1()

{intj;

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

}

//---------------------

voiddisplay()//动态显示子程序

{PORTC=table[a];PORTA=0X02;//PORTA=ra0_5[0];//显示左数第1位

delay1();

PORTC=table[b];PORTA=0X01;//PORTA=ra0_5[1];//显示第2位

delay1();

PORTC=table[c];PORTA=0X08;//PORTA=ra0_5[2];//显示第3位

delay1();

PORTC=table[d];PORTA=0X04;//PORTA=ra0_5[3];//显示第4位

delay1();

PORTC=table[e];PORTA=0X20;//PORTA=ra0_5[4];//显示第5位

}

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

voidinterrupttmr0_serve()

{

count++;

eeprom_write(0x00,ca);

eeprom_write(0x01,cb);

eeprom_write(0x02,cd);

eeprom_write(0x03,ce);

if(count>0x000fffff)count=0;

T0IF=0;TMR0=256-185;}

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

voiddiv()

{a=count/100000;x=count-a*100000;//求余数

b=x/10000;y=x-b*10000;//求余数

c=y/1000;x=y-c*1000;//求余数

d=x/100;y=x-d*100;//求余数

e=y/10;f=y-e*10;//求余数

}

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

main()

{

TRISC=0;TRISA=0B00010000;ADCON1=7;

OPTION=0X01;//count=0X12345678;

ca=eeprom_read(0x00);

cb=eeprom_read(0x01);

cd=eeprom_read(0x02);

ce=eeprom_read(0x03);

GIE=1;T0IE=1;

T0IF=0;TMR0=256-185;

while

(1){

PORTC=table[a];PORTA=0X02;//PORTA=ra0_5[0];//显示左数第1位

a=count/100000;x=count-a*100000;//求余数

PORTC=table[b];PORTA=0X01;//PORTA=ra0_5[1];//显示第2位

b=x/10000;y=x-b*10000;//求余数

PORTC=table[c];PORTA=0X08;//PORTA=ra0_5[2];//显示第3位

c=y/1000;x=y-c*1000;//求余数

PORTC=table[d];PORTA=0X04;//PORTA=ra0_5[3];//显示第4位

d=x/100;y=x-d*100;//求余数

PORTC=table[e];PORTA=0X20;//PORTA=ra0_5[4];//显示第5位}

e=y/10;f=y-e*10;//求余数

}

}

实验3修改

RA4除了B口作出入,都要上拉電阻

修改:

從RC2輸入

從RC2輸入程序修改

//实验四简易4路抢答器

实验电路图:

实验程序:

#include

charx,y;

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

voiddelay1ms()//1MS软件延时子程序

{chari1,i2;

for(i1=3;i1>0;i1--){for(i2=0x19;i2>0;i2--);};}

voiddelayms()//MS软件延时子程序

{chari1,i2;

for(i1=2;i1>0;i1--){for(i2=0x18;i2>0;i2--);};}

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

voidsound_delay()

{unsignedinti,j;

for(i=300;i>0;i--){RC6=!

RC6;delay1ms();};

for(i=100;i>0;i--){RC6=!

RC6;delayms();};

}

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

voidinterruptint_serve()//中断入口程序,保护现场,判断中断类型

{if(TMR1IF==1){PORTC=0B10000000;TMR1IF=0;TMR1H=TMR1L=0XFF;

x=0;sound_delay();}

else{{if(x==1)gotoexit;}

{x=1;y=y^PORTB;

if(y==0x80)PORTC=0B00010000;

if(y==0x40)PORTC=0B00001000;

if(y==0x20)PORTC=0B00000100;

if(y==0x10)PORTC=0B00000010;};

{

chari1;

for(i1=8;i1>0;i1--)sound_delay();}

exit:

y=PORTB;//RB电平锁定

RBIF=0;

}}

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

main()

{TRISC=1;TRISB=0XFF;OPTION=0X40;//启用RB口弱上拉功能

PORTC=0;x=1;T1C0N=7;TMR1H=TMR1L=0XFF;

GIE=1;RBIE=1;TMR1IE=1;//初始化

y=PORTB;//RB电平锁定

SLEEP();

loop:

SLEEP();

gotoloop;}

 

//实验五两个PIC之间的通信

实验程序:

一.同步主控发送与接收

//USART的双机通信同步主控发送PICC编程

#include

charX;

//voiddelay(X)//晶体振荡器频率=4mhz

//{unsignedinti;for(i=X;i>0;i--);}

voidinterruptusart_seve()

{

TXREG=0X69;//从USART发送出去

TXIF=0;

}

main()

{

TRISC=0xff;//断开RC模块与USART的TX,RX的联系

SPBRG=12;//转载波特率发生器,为19.2kbd

TXSTA=0;SYNC=1;CSRC=1;//使能USART发送,波特率发生器为高速方式

RCSTA=0;SPEN=1;//工作于同步主控方式

INTCON=0;PIR1=0;PIR2=0;PIE1=0;PIE2=0;

GIE=1;PEIE=1;TXIE=1;//开放USART发送中断

TXEN=1;//工作于发送器方式

TXREG=0X69;

loop:

gotoloop;

}

 

//USART的双机通信同步从动接收PICC编程

#include

charX;

//voiddelay(X)//晶体振荡器频率=4mhz

//{unsignedinti;for(i=X;i>0;i--);}

voidinterruptusart_seve()

{

PORTB=RCREG;//从USART接收

RCIF=0;

}

main()

{TRISB=0;

TRISC=0xff;//断开RC模块与USART的TX,RX的联系

SPBRG=12;//转载波特率发生器,为19.2kbd

TXSTA=0;SYNC=1;CSRC=0;//使能USART发送,波特率发生器为高速方式

RCSTA=0;SPEN=1;//工作于同步主控方式

INTCON=0;PIR1=0;PIR2=0;PIE1=0;PIE2=0;

GIE=1;PEIE=1;RCIE=1;//开放USART发送中断

CREN=1;//工作于接收器方式

RCIF=0;

loop:

gotoloop;

}

二.加A/D转换后的发送

//USART的双机通信同步主控发送PICC编程

#include

charX;

//voiddelay(X)//晶体振荡器频率=4mhz

//{unsignedinti;for(i=X;i>0;i--);}

voidinterruptusart_seve()

{T0IF=0;TMR0=0;

ADGO=1;

wait:

if(ADIF==0)gotowait;//等待AD转换完,PIR1.6

TXREG=ADRESH;ADIF=0;

//TXREG=0X69;//从USART发送出去

//TXIF=0;

}

main()

{

TRISC=0xc0;//断开RC模块与USART的TX,RX的联系

SPBRG=12;//转载波特率发生器,为19.2kbd

TXSTA=0;SYNC=1;CSRC=1;//使能USART发送,波特率发生器为高速方式

RCSTA=0;SPEN=1;//工作于同步主控方式

INTCON=0;PIR1=0;PIR2=0;PIE1=0;PIE2=0;

GIE=1;PEIE=1;//TXIE=1;//开放USART发送中断

TXEN=1;//工作于发送器方式

//TXREG=0X69;

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

TRISA=1;

//PORTC=0;//输出口

ADCON0=0X41;//设置RC时钟源,暂不打开ADC,选中AN0

OPTION=0X87;TMR0=0;T0IE=1;//不用RB口弱上拉,分频器给tmr0,分频比=1:

256

ADCON1=0X0E;//只选AN0引脚为模拟通道,结果左对齐,VDD和VSS为

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

loop:

gotoloop;

}

 

实验电路图:

双机通信+AD+PORTB仿真

//CCP2触发的单通道模拟采集器的PICC程序从USART异步发送

#include

voidinterruptccp1_int()//中断服务程序

{

CCP2IF=0;//清CCP2中断

wait:

if(ADIF==0)gotowait;//等待AD转换结束

TXREG=ADRESH;//转换完毕,将结果的高8位送PORTC显示

ADIF=0;//PIR1.6

return;

}

voidmain()

{TRISC=0xff;//断开RC模块与USART的TX,RX的联系

SPBRG=12;//转载波特率发生器,为19.2kbd

TXSTA=0;SYNC=0;//使能异步USART发送,

RCSTA=0;SPEN=1;//使能RC6,7

//INTCON=0;PIR1=0;PIR2=0;PIE1=0;PIE2=0;

//GIE=1;PEIE=1;TXIE=1;//开放USART发送中断

TXEN=1;//工作于发送器方式

TXREG=0;//发送字符

//----------------------

CCP2IE=1;//PIE2.0

CCPR2L=0XFF;CCPR2H=0XFF;//用最大值作周期寄存器

PEIE=1;GIE=1;

T1CON=0X30;//预分频器=1:

8,内部时钟源,同步,禁止振荡器

CCP2CON=0X0B;//设定CCP2为特殊事件模式

TMR1ON=1;//开启TMR1,T1CON.0

TRISC=0;

PORTC=0;//输出口

ADCON0=0X41;//设置RC时钟源,暂不打开ADC,选中AN0

ADCON1=0X0E;//只选AN0引脚为模拟通道,结果左对齐,VDD和VSS为参考电源

loop:

gotoloop;

}

//USART的双机通信异步接收PICC编程

#include

charX;

voidinterruptusart_seve()

{PORTB=RCREG;//从USART接收

RCIF=0;

}

main()

{TRISB=0;

TRISC=0xff;//断开RC模块与USART的TX,RX的联系

SPBRG=12;//转载波特率发生器,为19.2kbd

TXSTA=0;SYNC=0;//使能USART发送,波特率发生器为高速方式

RCSTA=0;SPEN=1;//工作于同步主控方式

INTCON=0;PIR1=0;PIR2=0;PIE1=0;PIE2=0;

GIE=1;PEIE=1;RCIE=1;//开放USART发送中断

CREN=1;//工作于接收器方式

RCIF=0;

loop:

gotoloop;

}

双机通信+AD+LCD仿真

//CCP2触发的单通道模拟采集器的PICC程序,USART发送采集结果

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

RSEQU1;LCD寄存器选择信号脚定义在RA.1脚

RWEQU2;LCD读/写信号脚定义在RA.2脚

EEQU3;LCD片选信号脚定义在RA.3脚

;**********************/

#include

charadh,adl,a,b;

staticvolatileconstchartable[16]={0x30,0x31,0x32,0x33,0x34,0x35,

0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};

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

voidDELAY()

{unsignedinti;

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

}

voidENABLE()

{RA1=0;RA2=0;RA3=0;//写入控制命令的子程序

DELAY();

RA3=1;

}

voidENABLE1()

{RA1=1;RA2=0;RA3=0;//写入字的子程序

DELAY();

RA3=1;

}

voidinterruptccp1_int()//中断服务程序

{CCP2IF=0;//清CCP2中断

wait:

if(ADIF==0)gotowait;//等待AD转换结束

adh=ADRESH;adl=ADRESL;

//TXREG=ADRESL;

ADIF=0;//PIR1.6

}

voidmain()

{TRISC=0xff;//断开RC模块与USART的TX,RX的联系

SPBRG=12;//转载波特率发生器,为19.2kbd

TXSTA=0;SYNC=1;CSRC=1;//使能异步USART发送,

TX9=1;

RCSTA=0;SPEN=1;//使能RC6,7

INTCON=0;PIR1=0;PIR2=0;PIE1=0;PIE2=0;

//GIE=1;PEIE=1;TXIE=0;//开放USART发送中断

TXEN=1;//工作于发送器方式

TXREG=0;//发送字符

//---------------------------------

TRISA=0X01;TRISD=0;

PORTD=0;//输出口

ADCON1=0X8E;//只选AN0引脚为模拟通道,结果右对齐,VDD和VSS为参考电源

DELAY();//调用廷时,刚上电LCD复位不一定有PIC快

PORTD=1;//清屏

ENABLE();

PORTD=0x38;//8位2行5x7点阵

ENABLE();

PORTD=0x0C;//显示器开、光标开、闪烁开

ENABLE();

PORTD=0x06;//文字不动,光标自动右移

ENABLE();

CCP2IE=1;//PIE2.0

CCPR2L=0XFF;CCPR2H=0XFF;//用最大值作周期寄存器

PEIE=1;GIE=1;

T1CON=0X30;//预分频器=1:

8,内部时钟源,同步,禁止振荡器

CCP2CON=0X0B;//设定CCP2为特殊事件模式

TMR1ON=1;//开启TMR1,T1CON.0

ADCON0=0X41;//设置RC时钟源,暂不打开ADC,选中AN0

loop:

PORTD=0x80;//光标指向第1行的位置

ENABLE();

PORTD=table[0];//转换完毕,将结果的高2位送PORTC显示

ENABLE1();

PORTD=table[adh];//转换完毕,将结果的高2位送PORTC显示

ENABLE1();

//------发送AD转换的高2位---------

if(TRMT==1)

{TX9D=1;TXREG=adh;}

//-----------------------

a=adl>>4;

PORTD=table[a];//转换完毕,将结果的低8位送PORTC显示

ENABLE1();

a=adl&0x0f;

PORTD=table[a];//转换完毕,将结果的低8位送PORTC显示

ENABLE1();

//----发送AD转换的高低8位-----

if(TRMT==1)

{TX9D=0;TXREG=adl;}

//-----------------------------

gotoloop;

}

 

//实验六PIC和PC之间的通信

#include

charx,Y,addr;

staticvolatilechartable[21]={"mynameispic16f877"};

voiddelay(Y)//晶体的振荡频率=4MHZ

{unsignedinti;for(i=Y;i>0;i--);}

voiddelay1(Y)

{unsignedinti;for(i=Y;i>0;i--);}

voidinterruptusart_seve()

{

TXREG=RCREG;//从USART接受数据并从USART转送出去

EEPROM_WRITE(addr,RCREG);delay1(1000);

addr++;

}

main()

{

addr=0;

TRISC=0XFF;

SPBRG=12;

TXSTA=0B00100100;

RCSTA=0B10010000;

GIE=1;PEIE=1;RCIE=1;

for(x=0;x<21;x++)

{

TXREG=table[x];

delay(500);

}

for(x=0;x<100;x++)

{

TXREG=EEPROM_READ(x);

delay(500);

}

addr=0;

loop:

gotoloop;

}

 

//实验七频率测量

一、频率测量

1.实验电路图:

2.实验程序:

#include

charcapt_new_l,capt_new_h;

intx;//x是延时程序的延时参数

voiddelay10ms()//晶体振荡器频率=4mhz

{

unsignedinti;

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

}

voiddelay()//可调延时参数的延时程序

{

unsignedcharj;

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

delay

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2