




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、闪烁灯#include / sbit gate=P20;/ 定义P2-0口void main(void)unsigned int i,j;while(1)for(i=500;i0;i-)for(j=500;j0;j-);/ 双重循环,延时约1秒gate=!gate;/ 对P-0口取反,控制小灯的亮灭#include #define uint unsigned intsbit gate1=P20; / 定义P2-0口sbit gate2=P21; / 定义P2-1口sbit gate3=P22; / 定义P2-2口sbit gate4=P23; / 定义P2-3口void main(void)uint i,j;while(1)for(i=250;i0;i-)for(j=250;j0;j-);/ 双重循环,延时约0.2秒 gate1=!gate1;/ 对P-0口取反,控制小灯的亮灭 gate2=!gate2;/ 对P-1口取反,控制小灯的亮灭 gate3=!gate3;/ 对P-2口取反,控制小灯的亮灭 gate4=!gate4;/ 对P-3口取反,控制小灯的亮灭#include #include #define unit unsigned int#define uchar unsigned charsbit L0=P20;sbit L1=P21;sbit L2=P22;sbit L3=P23;uchar data BUFFER1=0; /*定时器计数变量*/void main(void)P2=0x0f;/ 初始化端口EA=1; IT1=1; ET0=1;TMOD=0x01; /* T0方式1计时0.01秒 */TH0=-5000/256;TL0=-5000%256;TR0=1;/* 开中断,启动定时器 */for (;);/* 定时计数器0的中断服务子程序 */void intserv1(void) interrupt 1 using 1TH0=-5000/256;/ 定时器T0的高四位赋值TL0=-5000%256;BUFFER0=BUFFER0+1; / 定时器T0的低四位赋值if (BUFFER0=100)/ 百分秒进位L3=!L3;L2=!L2;L1=!L1;L0=!L0;二、串口的简单测试程序# include void main(void) unsigned char astring;/*在11.0592MHz晶振下,设置串行口9600数据传输率,方式3*/TMOD=0x20; TL1=0xfd;TH1=0xfd; SCON=0xd8;PCON=0x00; /*串口接收字符RI置位,允许串口接收*/TR1=1;while(1)while(RI=0);RI=0; /*串口接收标志位的软件清零*/astring=SBUF;三、行列键盘的输入例程#include #include #define uchar unsigned char#define uint unsigned intvoid delays(void);uchar kbscan(void);void main(void)uchar key;while(1) key=kbscan();/*键扫描函数*/delays();/*键消抖的延时函数*/ 键消抖的延时函数void delays(void)uchar i;for(i=300;i0;i-);/ kbscan(void) 键扫描函数uchar kbscan(void) uchar sccode,recode;P1=0xf0;/*发全0行扫描码,列线输入*/if(P1&0xf0)!=0xf0)/*若有键按下*/delays(); /*延时去抖动*/if(P1&0xf0)!=0xf0)sccode=0xfe;/*逐行扫描初值*/while(sccode&0x10)!=0)P1=sccode;/*输出行扫描码*/if(P1&0xf0)!=0xf0) /*本行有键按下*/recode=(P1&0xf0)|0x0f;return(sccode)+(recode); /*返回特征字节码*/else sccode=(sccode1)|0x01;/*行扫描码左移一位*/return(0);/*无键按下,返回值为0*/四、锁定键盘的程序#include #include #define uchar unsigned char#define uint unsigned intvoid delays(void);uchar kbscan(void);main()bit CRT; /*密码正确标志,=1密码正确*/bit PRT; /*密码部分输入标志,=1密码部分输入*/uchar COUNT; /*计数单元,存放密码正确的位数*/uchar KEY; /*被按下的键的编码*/CRT=0;PRT=0;COUNT=0;KEY=kbscan();/*键扫描函数*/delays();/*键消抖的延时函数*/switch (KEY)case 0xb7: /*0键*/if (CRT) else/*密码不正确时*/if (PRT) /*部分密码正确时*/COUNT=COUNT+1; /*密码正确的位数加1*/if (COUNT=3)/*密码所有位都正确*/CRT=1;PRT=0;COUNT=0; break;case 0x7e: /*1键*/if (CRT) /*密码正确时的操作内容*/else /*密码不正确时*/PRT=0;COUNT=0; break;case 0xbe: /*2键*/if (CRT) /*密码正确时的操作内容*/else /*密码不正确时*/if (PRT) /*部分密码正确时,说明密码错误*/ PRT=0;COUNT=0;else /*密码正确位数为0时,说明密码第一位正确*/PRT=1;COUNT=1; break;case 0xd7: /*#键*/if (CRT) /*密码正确时,锁定键盘*/CRT=0;PRT=0;COUNT=0; break;/ 键消抖的延时函数void delays(void)uchar i;for(i=300;i0;i-);/ kbscan(void) 键扫描函数uchar kbscan(void) uchar sccode,recode;P1=0xf0;/*发全0行扫描码,列线输入*/if(P1&0xf0)!=0xf0)/*若有键按下*/delays(); /*延时去抖动*/if(P1&0xf0)!=0xf0)sccode=0xfe;/*逐行扫描初值*/while(sccode&0x10)!=0)P1=sccode;/*输出行扫描码*/if(P1&0xf0)!=0xf0) /*本行有键按下*/recode=(P1&0xf0)|0x0f;return(sccode)+(recode); /*返回特征字节码*/else sccode=(sccode1)|0x01;/*行扫描码左移一位*/return(0);/*无键按下,返回值为0*/ 五、单片机中的多路模拟开关例程#include #include #include #include #define uchar unsigned char#define uint unsigned int#define adch0 XBYTE0x0000sbit P1_3=P13;sbit P1_2=P12;uint ch0datal,ch0datah,i,light;void main(void)EA=1; PT0=1;/ 开外中断,并设置定时器;ET0=1;IT0=1;IT1=1;EX0=1;EX1=1;ET2=1;T2CON=0x08;TMOD=0x21;TH0=0xB9;/ 设置定时器的初值;TL0=0xB0;TR0=1;TI=1;ch0datah=0;ch0datal=0;P1_3=0;/ 设置控制端口的初值;P1_2=0;while(1)/ 等待外部的控制信号;void intsvr1(void) interrupt 1/ 定时器1模拟外部控制信号的进入TH0=0xB9;TL0=0xB0;TR0=1;light=light+1;if (light1000) P1_3=!P1_3;/ MAX333的控制信号取反,工作方式变化; P1_2=!P1_2; light=0;/ 标志位显示当前的工作状态; 六、单片机控制的数码管显示#include #include #include #include #define DIGPORT XBYTE 0x8000/* 定义字位口 */#define WORDPORT XBYTE 0x4000/* 定义字型口 */#define uchar unsigned char/* 定义共阴极字型编码表(数字09)*/uchar code TABLE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示:得到字型和字位口的地址后,向不同的字位送数据,进行数据的显示。/ 数码管显示计数值个位uchar digit;uchar disp,delay; / 对计数值取余数main()TMOD=0x60; /* T0方式1计时0.01秒 */TH1=0;TL1=0;EA=1; ET1=0; TR1=1; /* 开中断,启动定时器 */for (;)/* 数码管显示计数值低位 */digit=0x08;disp=TL1%10;DIGPORT=digit;WORDPORT=TABLEdisp;for (delay=0;delay=200;delay+);/显示其它位的数据 七、单片机的数字时钟例程#include #include #define unit unsigned int#define uchar unsigned char/*定义字型字位口*/#define DIGPORT XBYTE 0x8000#define WORDPORT XBYTE 0x4000/*定义P1口各管脚*/sbit K0=P10;sbit K1=P11;sbit K2=P12;sbit BEEP=P13;sbit L0=P14;sbit L1=P15;sbit L2=P16;sbit L3=P17;uchar data BUFFER2=0,0; /*显示缓冲区(依次为低位,高位)*/uchar data CLOCK4=0,0,0,0;/*存放时钟时间(依次为百分秒,秒,分和时位)*/uchar data SECOND2=0,0;/*存放秒表时间(依次为百分秒,秒)*/uchar data REVERSE4=0,0,0,0;/*存放倒计时时间(依次为百分秒,秒,分和时位)*/*定义运行状态*/uchar data STATE=0;/*STATE=0,秒表*/*STATE=1,倒计时分调整*/*STATE=2,倒计时小时调整*/*STATE=3,倒计时运行*/*STATE=4 or 7,时钟运行*/*STATE=5,时钟分调整*/*STATE=6,时钟时调整*/bit bdata SND=0;/*秒表START*/bit bdata RST=0;/*秒表RESET*/bit bdata STP=0;/*倒计时STOP*/*数码管显示编码09,A,-*/uchar code TABLE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40;void display(void)uchar i; /*显示缓冲区首址*/uchar delay;/*显示延时*/uchar disp; /*显示内容*/uchar digit; /*定义数码管显示位*/digit=0x08;for (i=0;i100) disp=BUFFERi%10+10;else disp=BUFFERi%10;DIGPORT=digit;WORDPORT=TABLEdisp;for (delay=0;delay1;disp=BUFFERi/10;DIGPORT=digit;WORDPORT=TABLEdisp;for (delay=0;delay1;void timer0(void) interrupt 1 using 1/*重置定时初值*/TH0=-5000/256;TL0=-5000%256;/*时钟处理*/CLOCK0=CLOCK0+1;if (CLOCK0=50) & (STATE=4)L0=!L0;if (CLOCK0=100)if (STATE=4) L0=!L0;CLOCK0=0;CLOCK1=CLOCK1+1;if (CLOCK1=60) CLOCK1=0;CLOCK2=CLOCK2+1;if (CLOCK2=60)CLOCK2=0;CLOCK3=CLOCK3+1;if (CLOCK3=24)CLOCK3=0;void timer2(void) interrupt 5 using 3TF2=0;TH2=-5000/256; TL2=-5000%256;/*秒表处理*/if (STATE=0)SECOND0=SECOND0+1;if (SECOND0=50)L1=!L1;if (SECOND0=100)L1=!L1;SECOND0=0;SECOND1=SECOND1+1;if (SECOND1=100) SECOND1=0; /*倒计时处理*/if (STATE=3)REVERSE0=REVERSE0+1;if (REVERSE0=50)L2=!L2;if (REVERSE0=100)L2=!L2;REVERSE0=0;REVERSE1=REVERSE1+1;if (REVERSE1=60) REVERSE1=00;REVERSE2=REVERSE2-1;if (REVERSE2=0) & (REVERSE3=0) TR2=0;STP=1;BEEP=0;else if (REVERSE2=0xff)REVERSE2=59;REVERSE3=REVERSE3-1; void intsvr1(void) interrupt 2 using 2if (STATE=5)CLOCK2=CLOCK2+1;if (CLOCK2=60) CLOCK2=0; if (STATE=6)CLOCK3=CLOCK3+1;if (CLOCK3=24) CLOCK3=0; void timer1(void) interrupt 3 using 3if (STATE=0)if (RST)SECOND0=0;SECOND1=0;L1=1;RST=0;else if (SND) TR2=1;else L1=1;TR2=0;RST=1;SND=!SND;else if (STATE=1)REVERSE2=REVERSE2+1;if (REVERSE2=60) REVERSE2=0; else if (STATE=2)REVERSE3=REVERSE3+1;if (REVERSE3=24) REVERSE3=0;else if (STP) BEEP=1;L2=1;STP=0; else TR2=0;void main(void)uchar stabak;/*上一次程序运行的状态*/P1=0x0f;EA=1; IT1=1; ET0=1;TMOD=0x61;/*T1方式2计数,T0方式1计时*/TH0=-5000/256; TL0=-5000%256;TH1=0xff; TL1=0xff;T2CON=0; TH2=-5000/256; TL2=-5000%256;K0=1; K1=1; K2=1;STATE=P1&0x07;stabak=STATE;for (;)switch (STATE)case 0:/*STATE=0,秒表*/EX1=0; ET1=1; ET2=1; TR1=1; SND=1;L1=1; L0=0; L2=0;SECOND0=0;SECOND1=0; break;case 1:/*STATE=1,倒计时分调整*/EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;L2=1; L0=0; L1=0;REVERSE0=0;REVERSE1=0; break;case 2:/*STATE=2,倒计时小时调整*/EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;L2=1; L0=0; L1=0;REVERSE0=0;REVERSE1=0; break;case 3:/*STATE=3,倒计时运行*/EX1=0; ET1=1; ET2=1; TR1=1; if (REVERSE2=0)&(REVERSE3=0) L2=1;else TR2=1;L0=0; L1=0; break;case 5:/*STATE=5,时钟分调整*/IE1=0; EX1=1; ET1=0; ET2=1; TR0=0; L0=1; L1=0; L2=0; break;case 6:/*STATE=6,时钟时调整*/IE1=0; EX1=1; ET1=0; ET2=1; TR0=0; L0=1; L1=0; L2=0; break;default:/*STATE=4 or 7,时钟运行*/EX1=0; ET1=0; ET2=1; TR0=1;L1=0; L2=0;while (STATE=stabak) switch (STATE)case 0:/*STATE=0,秒表*/BUFFER0=SECOND0;BUFFER1=SECOND1; break;case 1:/*STATE=1,倒计时分调整*/BUFFER0=REVERSE2;BUFFER1=101;/*A-*/ break;case 2:/*STATE=2,倒计时小时调整*/BUFFER0=110;/*-A*/BUFFER1=REVERSE3; break;case 3:/*STATE=3,倒计时运行*/BUFFER0=REVERSE2;BUFFER1=REVERSE3; break;case 5:/*STATE=5,时钟分调整*/BUFFER0=CLOCK2;BUFFER1=101;/*A-*/ break;case 6:/*STATE=6,时钟时调整*/BUFFER0=110;/*-A*/BUFFER1=CLOCK3; break;default:/*STATE=4 or 7,时钟运行*/BUFFER0=CLOCK2;BUFFER1=CLOCK3;display();K0=1; K1=1; K2=1;STATE=P1&0x07;stabak=STATE;八、微型打印机和单片机的接口程序# include # include # define CW8155 0XEF00# define B8155 0XEF02# define C8155 0XEF03# define uchar unsigned charuchar datap;void pchar(uchar i)XBYTEB8155=i;XBYTEC8155=0X00;XBYTEC8155=0X01; main(void)EA=1; PT0=1;/ 开外中断,并设置定时器;ET0=1;IT0=1;IT1=1;EX0=1;EX1=1;ET2=1;T2CON=0x08;TMOD=0x21;datap=*;/ 输出打印字符pchar(datap); 九、DS1820温度测量程序#include #include #include #include #define uchar unsigned char#define uint unsigned intsbit P3_5=P35;uchar TEMP;/ 温度值的变量;uchar flag1;/ 结果为负和正的标志位。void delay (unsigned int count)unsigned int i;while (count)i =200;while (i0) i-;count-; void tmreset (void) / 发送复位和初始化unsigned int i;P3_5 = 0;i = 103;while (i0) i-; / 延时P3_5 = 1;i = 4;while (i0) i-;bit tmpread (void)/ 读取数据的一位 unsigned int i;bit dat;P3_5 = 0; i+;P3_5 = 1; i+; i+;/延时dat = P3_5;i = 8; while (i0) i-;/ 延时return (dat);unsigned char tmpread2 (void) /读一个字节unsigned char i,j,dat;dat = 0;for (i=1;i=8;i+)j = tmpread ();dat = (j 1);return (dat);void tmpwrite (unsigned char dat)/写一个字节 unsigned int i;unsigned char j;bit testb;for (j=1;j 1;if (testb)P3_5 = 0; / 写0 i+; i+; P3_5 = 1;i = 8; while (i0) i-; elseP3_5 = 0; / 写0 i = 8; while (i0) i-; P3_5 = 1;i+; i+; void tmpchange(void)/ ds1820 开始转换 tmreset ();/ 复位/tmpre ();/ 等待存在脉冲delay (1);/ 延时tmpwrite (0xcc);/ 跳过序列号命令tmpwrite (0x44); / 发转换命令 44H,void tmp (void)/ 读取温度 unsigned char a,b;tmreset ();/ 复位delay (1);/ 延时tmpwrite (0xcc); / 跳过序列号命令tmpwrite (0xbe); / 发送读取命令a = tmpread2 ();/ 读取低位温度b = tmpread2 (); /读取高位温度flag1=b;/若b为1则为负温if(flag1)TEMP=a+1;/如果为负温则去除其补码elseTEMP=a;rom()/ 读取器件序列号子程序tmreset ();/复位delay (1);/延时tmpwrite(0x33);/发送读序列号子程序 main()dotmpchange();/ 开始温度转换delay(200);/ 读取延时tmp();/读取温度while(1);十、单片机的电流检测程序#include #include #include #include #define uchar unsigned char#define uint unsigned int#define adch0 XBYTE0x0000sbit P1_6=P16;sbit P1_7=P17;uint ch0datal,ch0datah,i,light;void main(void)EA=1; PT0=1;/ 开外中断,并设置定时器;ET0=1;IT0=1;IT1=1;EX0=1;EX1=1;ET2=1;T2CON=0x08;TMOD=0x21;TH0=0xB9;/ 设置定时器的初值;TL0=0xB0;TR0=1;TI=1;ch0datah=0;ch0datal=0;P1_6=0;/ 设置控制端口的初值;P1_7=0;while(1)/ 等待外部的控制信号;void intsvr1(void) interrupt 1/ 定时器1模拟外部控制信号的进入TH0=0xB9;TL0=0xB0;TR0=1;light=light+1;if (light1000) P1_6=!P1_6;/ 控制信号取反,工作方式变化; P1_7=!P1_7; light=0;/ 标志位显示当前的工作状态; 十一、单片机驱动直流电机的例程#include #include #define uchar unsigned char#define uint unsigned intbit gate; / 定时标志位bit direct; /*设置电机正反转标志,0-正转;1-反转*/sbit motor1=P12;sbit motor2=P13;/*10-正转;01-反转*/uchar data BUFFER1=0; /*定时器计数变量*/ 主程序,定义中断源和串口工作方式。void main (void)P2=0x0f;/ 初始化端口EA=1; IT1=1; ET0=1;TMOD=0x01; /* T0方式1计时1秒 */TH0=-5000/256;TL0=-5000%256;TR0=1; /* 开中断,启动定时器 */gate=1; / 依据转向状态决定电机的动作for (;)if (gate) motor1=1;motor2=0;elsemotor1=0;motor2=1;/* 定时计数器0的中断服务子程序 */void timer0(void) interrupt 1 using 1TH0=-5000/256;/ 定时器T0的高四位赋值TL0=-5000%256;BUFFER0=BUFFER0+1; / 定时器T0的低四位赋值if (BUFFER0=100) / 百分秒进位gate=! gate;/ 转向标志取反 十二、单片机数模输出控制LED亮度的例程#include#include #define uchar unsigned char#define uint unsigned int#define addatal XBYTE0xBFFF#define addatah XBYTE0xDFFFuint datal,datah ;uchar data BUFFER1=0; /*定时器计数变量*/设置P1.1,查询MAX526的工作状态sbit P1_1=P11;main()EA=1; IT1=1; ET0=1;TMOD=0x01; /* T0方式1计时1秒 */TH0=-5000/256;TL0=-5000%256;TR0=1; /* 开中断,启动定时器 */for (;); /* 定时计数器0的中断服务子程序 */void timer0(void) interrupt 1 using 1TH0=-5000/256;/ 定时器T0的高四位赋值TL0=-5000%256;BUFFER0=BUFFER0+1; / 定时器T0的低四位赋值if (BUFFER0=100) / 百分秒进位/ 使用查询的方法读MAX526的LDAC,检测MAX526是否完成了信号的采集while(P1_1!=0)/ 当数据采集完成时,先读低位;P1_1=0;datal=addatal;/ 当数据采集完成时,再读高位;P1_1=1;datah=addatah;P1_1=0; 十三、基于单片机的信号发生器例程#include#include #define uchar unsigned char#define uint unsigned intvoid delays(void);uchar kbscan(void);sbit A0=P21;sbit A1=P22;uchar key;void delays(void)uchar i;for(i=300;i0;i-);/ kbscan(void) 键扫描函数uchar kbscan(void) uchar sccode,recode;P1=0xf0;/*发全0行扫描码,列线输入*/if(P1&0xf0)!=0xf0)/*若有键按下*/delays(); /*延时去抖动*/if(P1&0xf0)!=0xf0)sccode=0xfe;/*逐行扫描初值*/while(sccode&0x10)!=0)P1=sccode;/*输出行扫描码*/if(P1&0xf0)!=0xf0) /*本行有键按下*/recode=(P1&0xf0)|0x0f;return(sccode)+(recode); /*返回特征字节码*/else sccode=(sccode1)|0x01;/*行扫描码左移一位*/return(0);/*无键按下,返回值为0*/void main(void)uchar key;while(1) key=kbscan();/*键扫描函数*/delays();/*键消抖的延时函数*/if (key=0x7e)/ 正弦波A0=0;A1=1;if (key=0xbe)/ 矩形波A0=0;A1=0;if (key=0xbe)/ 三角波A0=1;A1=0; 十四、低频信号发生器的例程#include#include #define uchar unsigned char#define uint unsigned intuint FREQ; /*定时器计数变量*/uint FREQ_out; /*输出频率变量*/uint delay;sbit SEL0=P30;sbit SEL1=P31;sbit FSGN=P35;/设置P3.5,作为信号输出引脚;/* 定时计数器0的中断服务子程序 */void timer0(void) interrupt 1 using 1TH0=-1000/256;/ 定时器T0的高四位赋值TL0=-1000%256;FREQ=FREQ+1; / 定时器T0的低四位赋值if (FREQ=FREQ_out)/ 周期时间长短的判断FREQ=0;FSGN=!FSGN;/ 信号输出端口取反/* 外中断0的中断服务子程序 */void intsvr0(void) interrupt 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 珠宝专业知识试题及答案
- 煤矿提升专业试题及答案
- 湖南省邵阳市2025-2026学年高一上学期9月拔尖创新班联考生物试题(含答案)
- 广东省2025-2026学年高三上学期9月月考英语试题(含答案)
- 生化专业试题及答案
- 河北省唐山市路南区2024-2025学年三年级上学期期末数学试题
- 培训反馈路基施工方案
- 国际友谊庆祝演讲稿模板
- 2025年学情诊断高一年级物理试题(定稿)
- 轿厢装潢施工方案
- 炎症后色素沉着学习课件
- 发展汉语-初级读写-第一课-你好
- 韩国《寄生虫》电影鉴赏解读
- 人教版四年级数学上册《课堂作业设计》全套
- TTT系列课程-结构化思考力
- Cpk 计算标准模板
- 封起DE日子博文 2006
- 锂离子电池生产安全讲座
- 眼科学-眼科检查(课件)
- 产品碳足迹课件
- 部编人教版六年级道德与法治上册全册教学课件
评论
0/150
提交评论