单片机程序汇总大家参考一下.docx
《单片机程序汇总大家参考一下.docx》由会员分享,可在线阅读,更多相关《单片机程序汇总大家参考一下.docx(22页珍藏版)》请在冰豆网上搜索。
单片机程序汇总大家参考一下
第八章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);//等待按键抬起,防止连续计数
}
}
}
}