单片机程序汇总大家参考一下.docx

上传人:b****5 文档编号:12149421 上传时间:2023-04-17 格式:DOCX 页数:22 大小:408.42KB
下载 相关 举报
单片机程序汇总大家参考一下.docx_第1页
第1页 / 共22页
单片机程序汇总大家参考一下.docx_第2页
第2页 / 共22页
单片机程序汇总大家参考一下.docx_第3页
第3页 / 共22页
单片机程序汇总大家参考一下.docx_第4页
第4页 / 共22页
单片机程序汇总大家参考一下.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

单片机程序汇总大家参考一下.docx

《单片机程序汇总大家参考一下.docx》由会员分享,可在线阅读,更多相关《单片机程序汇总大家参考一下.docx(22页珍藏版)》请在冰豆网上搜索。

单片机程序汇总大家参考一下.docx

单片机程序汇总大家参考一下

第八章4节支持手打!

#include

#include

#definePI3.1415

unsignedintnum;

voidmain(){

while

(1){

for(num=0;num<360;num++)

P2=127+127*sin((float)num/180*PI);

}

}

#include

#defineDAC0832XBYTE[0xfeff]//设置DAC0832的访问地址

unsignedcharnum;

voidmain(){

while

(1){

for(num=0;num<255;num++)//上升段波形

DAC0832=num;

for(num=255;num>0;num--)//下降段波形

DAC0832=num;

//DAC0832转换输出

}

}

#include

#include

#defineDAC1XBYTE[0xfeff]//设置1#DAC0832输入锁存器的访问地址

#defineDAC2XBYTE[0xfdff]//设置2#DAC0832输入锁存器的访问地址

#defineDAOUTXBYTE[0xefff]//两个DAC0832的DAC寄存器访问地址

voidmain(void){

unsignedcharnum;//需要转换的数据

while

(1){

for(num=0;num<=255;num++){

DAC1=num;//上锯齿送入1#DAC

DAC2=255-num;//下锯齿送入2#DAC

DAOUT=num;//两路同时进行D/A转换输出

}

}

}

/*发送程序*/

#include

#defineucharunsignedchar

charcodemap[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'

voiddelay(unsignedinttime){

unsignedintj=0;

for(;time>0;time--)

for(j=0;j<125;j++);

}

voidmain(void){

ucharcounter=0;//定义计数器

TMOD=0x20;//T1定时方式2

TH1=TL1=0xf4;//2400b/s

PCON=0;//波特率不加倍

SCON=0x50;//串口方式1,TI和RI清零,允许接收;

TR1=1;//启动T1

while

(1){

SBUF=counter;//发送联络信号

while(TI==0);//等待发送完成

TI=0;//清TI标志位

while(RI==0);//等待乙机回答

RI=0;

if(SBUF==counter){//若返回值与发送值相同,组织新数据

P2=map[counter];//显示已发送值

if(++counter>9)counter=0;//修正计数器值

delay(500);

}

}

}

/*接收程序*/

#include

#defineucharunsignedchar

charcodemap[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'

voidmain(void){

ucharreceiv;//定义接收缓冲

TMOD=0x20;//T1定时方式2

TH1=TL1=0xf4;//2400b/s

PCON=0;//波特率不加倍

SCON=0x50;//串口方式1,TI和RI清零,允许接收;

TR1=1;//启动T1

while

(1){

while(RI==1){//等待接收完成

RI=0;//清RI标志位

receiv=SBUF;//取得接收值

SBUF=receiv;//结果返送主机

while(TI==0);//等待发送结束

TI=0;//清TI标志位

P2=map[receiv];//显示接收值

}

}

}

第六章

方式一。

查询方式:

#include

sbitP2_0=P2^0;

voidmain(void){

TMOD=0x01;//T0定时方式1

TR0=1;//启动T0

for(;;){

TH0=0xfc;//装载计数初值

TL0=0x18;

do{}while(!

TF0);//查询等待TF0复位

P2_0=!

P2_0;//定时时间到P1.0反相

TF0=0;//软件清TF0

}

}

中断方式:

#include

sbitP2_0=P2^0;

voidtimer0(void)interrupt1{

P2_0=!

P2_0;//P1.0取反

TH0=0xfc;//计数初值重装载

TL0=0x18;

}

voidmain(void){

TMOD=0x01;//T0定时方式1

P2_0=0;

TH0=0xfc;//预置计数初值

TL0=0x18;

EA=1;

ET0=1;

TR0=1;

do{}while

(1);

}

方式2

中断方式

#include

sbitP2_0=P2^0;

timer0()interrupt1{//T0定时中断

P2_0=!

P2_0;//P1.0取反

}

main(){

TMOD=0x02;//T0定时方式2

TH0=TL0=0x06;

EA=ET0=1;

TR0=1;

while

(1);

}

#include

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharcount=0;//计数器赋初值

int0_srv()interrupt1{//T0中断函数

if(++count==100)count=0;//判断循环是否超限

P0=table[count/10];//显示十位数

P2=table[count%10];//显示个位数

}

main(){

P0=P2=table[0];//显示初值“00”

TMOD=0x06;//T0计数方式2

TH0=TL0=0xff;//计数初值

ET0=1;//开中断

EA=1;

TR0=1;//启动T0

while

(1);

}

计数

#include

sbitP3_0=P3^0;

voidmain(){

TMOD=0x06;//设置为T0计数方式2

TL0=0xff;//初值0xff可使1个外来脉冲即产生溢出

TR0=1;//启动计数器

while

(1){

while(!

TF0);//等待首次溢出

TF0=0;//清TF0溢出标志

TMOD=0x02;//设置为T0定时方式2

TL0=0x06;//500微秒定时初值

P3_0=0;

while(!

TF0);//等待再次溢出

TF0=0;//清TF0溢出标志

P3_0=1;

TMOD=0x06;//设置为T0计数方式2

TL0=0xff;//1次溢出计数初值

}

}

#include

#defineucharunsignedchar

uchartime;//中断次数

ucharperiod=250;//1个周期的次数

ucharhigh=50;//20%高电平的次数

timer0()interrupt1{//T0中断函数

TH0=0xd1;//重装载计数初值

TL0=0x20;

if(++time==high)P2=0;//高电平时间到,P2变低

elseif(time==period)

{time=0;P2=1;}//周期时间到,P2变高

}

voidmain(){

TMOD=0x01;//T0定时方式1

TH0=0xd1;//首次装入计数初值

TL0=0x20;

EA=ET0=1;

TR0=1;//启动计数器

do{}while

(1);

}

#include

#defineucharunsignedchar

bitldelay=0;//长定时溢出标记

uchart=0;//定时溢出次数

voidmain(void){

ucharcodeledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharledi;//指示显示顺序

TMOD=0x01;//定义T0定时方式1

TH0=0x3c;TL0=0xb0;//溢出20次=1秒(12M晶振)

TR0=1;

EA=ET0=1;

while

(1){

if(ldelay){//发现有时间溢出标记,进入处理

ldelay=0;//清除标记

P2=ledp[ledi];//读出一个值送到P2口

ledi++;//指向下一个

if(ledi==8)ledi=0;//到了最后一个灯就换到第一个

}}}

timer0()interrupt1{//T0中断函数

if(++t==20){t=0;ldelay=1;}//刷新长定时溢出标记

TH0=0x3c;TL0=0xb0;//重置T0初值

}

第五章

#include

charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//led字模

0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};

charkey_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,//键值

0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};

voidgetKey()interrupt0{//中断函数

charkey_scan[]={0xef,0xdf,0xbf,0x7f};//键扫描码

chari=0,j=0;

for(i=0;i<4;i++){

P2=key_scan[i];//输出扫描码

for(j=0;j<16;j++){

if(key_buf[j]==P2){//读键值,并判断键号

P0=led_mod[j];//显示闭合键键号

break;

}

}

}

P2=0x0f;//为下次中断做准备

}

voidmain(void){

P0=0x00;//开机黑屏

IT0=1;//脉冲触发

EX0=1;//INT0允许

EA=1;//总中断允许

P2=0x0f;//为首次中断做准备,列线全为0,行线全为1

while

(1);//模拟其他程序功能

}

#include"reg51.h"

charled[]={0xfe,0xfd,0xfb,0xf7};//LED花样数据

bitdir=0,run=0;//全局变量

voiddelay(unsignedinttime);

key()interrupt0{//键控中断函数

switch(P0&0x0f){//修改标志位状态

case0x0e:

run=1;break;

case0x0d:

run=0,dir=0;break;

case0x0b:

dir=1;break;

case0x07:

dir=0;break;

}}

voidmain(){

chari;

IT0=1;EX0=1;EA=1;//边沿触发、INT0允许、总中断允许

while

(1){

if(run)

if(dir)//若run=dir=1,自上而下流动

for(i=0;i<=3;i++){

P2=led[i];

delay(200);

}

else//若run=1,dir=0,自下而上流动

for(i=3;i>=0;i--){

P2=led[i];

delay(200);

}

elseP2=0xff;//若run=0,灯全灭

}}

voiddelay(unsignedinttime){

unsignedintj=0;

for(;time>0;time--)

for(j=0;j<125;j++);

}

#include"reg51.h"

charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//led字模

0x7f,0x6f};//显示字模

sbitD1=P3^0;

voiddelay(unsignedinttime){//延时

unsignedcharj=255;

for(;time>0;time--)

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

}

key0()interrupt0{//K0中断函数

unsignedchari;

D1=IE0;//IE0状态输出

for(i=0;i<=9;i++){//字符0-9循环1圈

P2=led_mod[i];

delay(35000);

}P2=0x40;//结束符“-”

}

key1()interrupt2{//K1中断函数

unsignedchari;

for(i=0;i<=9;i++){//字符0-9循环1圈

D1=IE0;//IE0状态输出

P1=led_mod[i];

delay(35000);

}P1=0x40;//结束符“-”

}

voidmain(){

unsignedchari;

TCON=0x05;//脉冲触发方式

PX0=0;PX1=1;//INT1优先

D1=0;P1=P2=0x40;//输出初值

IE=0x85;//开中断

while

(1){

for(i=0;i<=9;i++){//字符0-9无限循环

P0=led_mod[i];

delay(35000);

}

}

}

第四章

//实例1独立按键识别

#include

voidmain(){

charkey=0;

while

(1){

key=P0&0x0f;//读取按键状态

if(key!

=0x0f)P2=key;//显示到led

}

}

#include"reg51.h"

unsignedcharled[]={0xfe,0xfd,0xfb,0xf7};//LED灯的花样数据

voiddelay(unsignedchartime){//延时函数

unsignedintj=15000;

for(;time>0;time--)

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

}

voidmain(){

bitdir=0,run=0;//标志位定义及初始化

chari;

while

(1){

switch(P0&0x0f){//读取键值

case0x0e:

run=1;break;//K1动作,设run=1

case0x0d:

run=0,dir=0;break;//K2动作,设run=dir=0

case0x0b:

dir=1;break;//K3动作,设dir=1

case0x07:

dir=0;break;//K4动作,设dir=0

}

if(run)//若run=dir=1,自上而下流动

if(dir)

for(i=0;i<=3;i++){

P2=led[i];

delay(200);

}

else//若run=1,dir=0,自下而上流动

for(i=3;i>=0;i--){

P2=led[i];

delay(200);

}

elseP2=0xff;//若run=0,灯全灭

}

}

#include

sbitP3_7=P3^7;//定义计数器端口

unsignedcharcount=0;//定义计数器

unsignedcharcodetable[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voiddelay(unsignedinttime){

unsignedintj=0;

for(;time>0;time--)

for(j=0;j<125;j++);

}

voidmain(void){

P0=P2=table[0];//显示初值00

while

(1){

if(P3_7==0){//检测按键是否压下

delay(10);

if(P3_7==0){

count++;//计数器增1

if(count==100)count=0;//判断循环是否超限

P0=table[count/10];//十位输出显示

P2=table[count%10];//个位输出显示

while(P3_7==0);//等待按键抬起,防止连续计数

}

}

}

}

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

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1