单片机程序.docx
- 文档编号:23813602
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:52
- 大小:3.45MB
单片机程序.docx
《单片机程序.docx》由会员分享,可在线阅读,更多相关《单片机程序.docx(52页珍藏版)》请在冰豆网上搜索。
单片机程序
//实验一
#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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 程序