单片机程序汇总大家参考一下Word格式.docx
《单片机程序汇总大家参考一下Word格式.docx》由会员分享,可在线阅读,更多相关《单片机程序汇总大家参考一下Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
//下锯齿送入2#DAC
DAOUT=num;
//两路同时进行D/A转换输出
}
/*发送程序*/
#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);
/*接收程序*/
ucharreceiv;
//定义接收缓冲
TH1=TL1=0xf4;
//2400b/s
SCON=0x50;
//串口方式1,TI和RI清零,允许接收;
//启动T1
while
(1){
while(RI==1){//等待接收完成
RI=0;
//清RI标志位
receiv=SBUF;
//取得接收值
SBUF=receiv;
//结果返送主机
while(TI==0);
//等待发送结束
TI=0;
//清TI标志位
P2=map[receiv];
//显示接收值
第六章
方式一。
查询方式:
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
中断方式:
voidtimer0(void)interrupt1{
P2_0=!
//P1.0取反
//计数初值重装载
P2_0=0;
TH0=0xfc;
//预置计数初值
TL0=0x18;
EA=1;
ET0=1;
do{}while
(1);
方式2
中断方式
timer0()interrupt1{//T0定时中断
//P1.0取反
main(){
TMOD=0x02;
//T0定时方式2
TH0=TL0=0x06;
EA=ET0=1;
while
(1);
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];
//显示个位数
}
P0=P2=table[0];
//显示初值“00”
TMOD=0x06;
//T0计数方式2
TH0=TL0=0xff;
//计数初值
//开中断
//启动T0
计数
sbitP3_0=P3^0;
voidmain(){
TMOD=0x06;
//设置为T0计数方式2
TL0=0xff;
//初值0xff可使1个外来脉冲即产生溢出
TR0=1;
//启动计数器
while
(1){
while(!
//等待首次溢出
//清TF0溢出标志
//设置为T0定时方式2
TL0=0x06;
//500微秒定时初值
P3_0=0;
//等待再次溢出
P3_0=1;
//设置为T0计数方式2
//1次溢出计数初值
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变高
//T0定时方式1
TH0=0xd1;
//首次装入计数初值
TL0=0x20;
EA=ET0=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;
}//刷新长定时溢出标记
//重置T0初值
}
第五章
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允许
//总中断允许
P2=0x0f;
//为首次中断做准备,列线全为0,行线全为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;
case0x0b:
dir=1;
case0x07:
dir=0;
}}
voidmain(){
chari;
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--){
elseP2=0xff;
//若run=0,灯全灭
}}
0x7f,0x6f};
//显示字模
sbitD1=P3^0;
voiddelay(unsignedinttime){//延时
unsignedcharj=255;
for(;
j>
j--);
key0()interrupt0{//K0中断函数
unsignedchari;
D1=IE0;
//IE0状态输出
for(i=0;
=9;
i++){//字符0-9循环1圈
P2=led_mod[i];
delay(35000);
}P2=0x40;
//结束符“-”
key1()interrupt2{//K1中断函数
D1=IE0;
//IE0状态输出
P1=led_mod[i];
}P1=0x40;
voidmain(){
TCON=0x05;
//脉冲触发方式
PX0=0;
PX1=1;
//INT1优先
D1=0;
P1=P2=0x40;
//输出初值
IE=0x85;
//开中断
i++){//字符0-9无限循环
P0=led_mod[i];
第四章
//实例1独立按键识别
REG51.H>
charkey=0;
key=P0&
0x0f;
//读取按键状态
if(key!
=0x0f)P2=key;
//显示到led
#include"
unsignedcharled[]={0xfe,0xfd,0xfb,0xf7};
//LED灯的花样数据
voiddelay(unsignedchartime){//延时函数
unsignedintj=15000;
bitdir=0,run=0;
//标志位定义及初始化
switch(P0&
0x0f){//读取键值
case0x0e:
//K1动作,设run=1
case0x0d:
//K2动作,设run=dir=0
case0x0b:
//K3动作,设dir=1
case0x07:
//K4动作,设dir=0
if(run)//若run=dir=1,自上而下流动
if(dir)
else//若run=1,dir=0,自下而上流动
//若run=0,灯全灭
reg51.H>
sbitP3_7=P3^7;
//定义计数器端口
unsignedcharcount=0;
//定义计数器
unsignedcharcodetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voiddelay(unsignedinttime){
for(;
time--)
for(j=0;
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);
//等待按键抬起,防止连续计数