单片机程序源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机程序源代码
第二章
任务一:闪烁广告灯的设计
利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。

#include<>
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P0^0;
sbit LED2=P0^1;
void delayms(uint ms)
{
uint i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void main()
{
while(1)
{
LED1=0;
LED2=1;
delayms(500);
LED1=1;
LED2=0;
delayms(500);
}
}
任务二:流水广告灯的设计
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。

#include<>
#include <>
#define uint unsigned int
#define uchar unsigned char
uint i;
uchar temp;
uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delayms(uint ms)
{
while(ms--)
{ uint j;
for(j=0;j<120;j++);
}
}
void main()
{
while(1)
{
P0=0xfe;
while(P0!=0x7f)
{
7f89c89c0f89c0a0f7f0f0f0f7f7f2L3f4f7f6f7fDelay==0) break;
else
{
sound(&music[n]);
n++ ;
}
}
}
void main()
{
init();
while(1)
{
if(key==0)
{
delayms(5);
play(table1);
}
SPEAKER=1;
}
}
void inter() interrupt 1
{
TH0 = ReloadH;
TL0 = ReloadL;
SPEAKER = !SPEAKER; //音乐声频的半个波}
(3)
#include<>//头文件
#define uint unsigned int
#define uchar unsigned char//宏定义sbit beep=P1^0;//按键位声明
void Beep() //“叮咚”子函数
{
uint i,j;
for(i=300;i;i--)//持续时间
{
beep=~beep;
for(j=240;j;j--);//频率
}
for(i=200;i;i--)//持续时间
{
beep=~beep;
for(j=180;j;j--);//频率
}
}
void init() //初始化子函数
{
EA=1; //打开总中断
TMOD=0x05;//设置计数器0 工作方式1
ET0=1; //打开计数器0中断
TR0=1;//启动定时器0
TH0=0xff;
TL0=0xff;//计数器赋初值
}
void beep_interrupt() interrupt 1 //计数器0中断服务子程序{
TH0=0xff;
TL0=0xff;//计数器初值
Beep();//调用“叮咚”子函数
}
void main()//主函数
{
init();//调用初始化函数
while(1);//等待按键按下
}
任务七:速度可调流水灯控制
假设单片机晶振频率为12MHz,单片机P0口外接8只LED,外接按键K1,外接按键K2。

编写程序,每次按下按键K1时,加快8只LED的流水显示速度;每次按下按键K2时,降低8只LED的流水显示速度。

#include<>
#define uint unsigned int
#define uchar unsigned char
uchar table[15]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,
0xbf,0xdf,0xef,0xf7,
0xfb,0xfd,0xfe};
uint count,i,num;
void int_int()
{
EA=1;
EX0=1;//允许外部中断
EX1=1;
IT0=1;//下降沿有效
IT1=1;
TL0=(65535-50000)%256;
TH0=(65535-50000)/256;
TMOD=0X01;//方式
TR0=1;
ET0=1;
num=10000;
void key1_1() interrupt 0 {
num=num-2000;
if(num<=2000)num=2000; } void key2_2() interrupt 2 {
num=num+2000;
if(num>=60000)num=60000; }
void timer_0() interrupt 1 { TL0=(65535-num)%256;
TH0=(65535-num)/256; count++;
if(count==20)
{
count=0;
if(i!=15)
{
P0=table[i];
i++;
}
else
i=1;
}
}
void main()
{
int_int();
while(1);
(2)
#include<>
//#define uint unsigned int
#include<>
int num=0;
int time=0;
int aa=0xfe;
void init()
{
EA=1; //打开总中断
ET0=1;//打开定时器0中断
TR0=1; //启动定时器0
TMOD=0x01;//设置定时器0工作方式1
TH0=(65536-50000)/256;//高8位赋初值TL0=(65536-50000)%256;//低8位赋初值num=0;
//num=58;
}
void Incre_time() interrupt 0
{
time+=2;
}
void Decre_time() interrupt 2
{
time-=2;
}
void timer0() interrupt 1
{
num++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void main()
{
init();
P0=aa ;
while (1)
{ P0=0xfd ;
//P0=aa;
if(num==(10+time))
{aa=_crol_(aa,1);num=0;}
}
}
任务八:PWM调光
假设单片机晶振频率为12MHz,单片机P0,P2口作为输出口,外接一个2位LED数码管,外接LED,外接按键K1,外接按键K2,外接蜂鸣器。

编写程序,每次按下按键K1时,LED 数码管显示加1,LED变暗;每次按下按键K2时,LED数码管显示数据减1,LED变亮;当LED数码管显示为0A时,再次按下按键K1时,则蜂鸣器发出报警声。

任务九:简单电子频率计
假设单片机晶振频率为12MHz,单片机P0,P2端口作为输出口,外接4位LED数码管。

编写程序,测量由输入脉冲的频率。

#include<>
#define uint unsigned int
#define uchar unsigned char
uchar table[]={
0XC0,0XF9,0XA4,0XB0,
0X99,0X92,0X82,0XF8,
0X80,0X90};
uint
num=0,num0=0;num1=0,num2=0,num3=0,count=0,new_num= 0;
void delayms(uint ms)
{
uint i;
while(ms--)
for(i=0;i<120;i++);
}
void int_int()
{
EA=1;
EX1=1;
IT1=1;
TMOD=0X01;
ET0=1;
TL0=(65535-62500)%256;
TH0=(65535-62500)/256;
}
void display()
{
num3=new_num/1000;
num2=(new_num%1000)/100;
num1=(new_num%100)/10;
num0=new_num%10;
P2=0x08;
P0=table[num0];
delayms(1);
P2=0X04;
P0=table[num1];
delayms(1);
P2=0X02;
P0=table[num2]; delayms(1);
P2=0X01;
P0=table[num3]; delayms(1);
}
void key_key() interrupt 2 {
num++;
if(num==1)
TR0=1;
}
void timer() interrupt 1 {
TL0=(65535-62500)%256; TH0=(65535-62500)/256; count++;
if(count==16)//定时时间1s {
count=0;
new_num=num;
num=0;
TR0=0;
}
}
void main()
{
int_int();
while(1)
{
display();
}
}
第七章
任务一:甲机通过串口控制乙机LED显示状态
单片机甲机P1端口外接8位拨码开关;乙机P0外接8只LED。

要求使用单片机串行通信,
在查询状态下使单片机乙机8只LED能够显示单片机甲机8位拨码开关的状态。

任务二:甲机通过串口控制乙机计时
单片机甲机的外接按键K1,外接按键;单片机乙机P0、P2端口作为输出口,外接一个2位LED数码管。

要求使用单片机串行通信,使甲机的按键K1作为乙机计时的“开始/暂停”控制按键,甲机的按键K2作为乙机计时的“复位”控制按键。

任务三:单片机双机通信
单片机甲机的外接按键K2,P0、P2端口作为输出口,外接一个2位LED数码管;乙机外接按键K1,P0端口外接8位LED。

要求使用单片机串行通信,甲机按键K2每按下1次,乙机的LED移位1次;乙机K1每按下1次,甲机的LED数码管加1显示。

任务四:单片机与PC通信
单片机通过串行口向PC发送字符串,且能接收由PC发送过来的0~9的数字,并将接受的数字通过LED数码管显示出来。

相关文档
最新文档