单片机课程设计.docx
- 文档编号:15447311
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:23
- 大小:136.46KB
单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(23页珍藏版)》请在冰点文库上搜索。
单片机课程设计
系别:
电气工程系
班级:
电气S2009-6
组长:
陈益
组员:
陈益、肖丹妮、
王特、安国辉
指导老师:
荆丽梅
2011年1月2日
目录
1、三位数码管显示秒表。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
1.1设计任务。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
1.2项目原理。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
1.3项目程序。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
2、1602液晶显示。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
7
2.1设计任务。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
7
2.2项目原理。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
7
2.3项目程序。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
7
3、按键显示。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
11
3.1设计任务。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
11
3.2项目原理。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
11
3.3项目程序。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
11
4、的士计价器。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
19
4.1设计任务。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
19
4.2项目原理。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
20
4.3项目程序。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
21
5.参考文献。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
29
6.心得体会。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
30
1、三位数码管显示秒表
1.1设计任务:
设时钟频率为12M用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即最后一位显示1%秒,一直循环下去设时钟频率为12MHZ。
1.2项目原理:
1.3项目程序设计
秒表的程序如下:
#include
#defineucharunsignedchar//两个宏定义
#defineuintunsignedint//数码管的段选
ucharcodeaa[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90};
ucharbb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管的位选
//sbits1=P1^7;
//sbits2=P1^6;
ucharshu,shu1=0,nuber=0;//定义变量
voiddelay(ucharz)//1毫秒延时子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay(uchard1,uchard2)//显示函数
{
P0=aa[d2];
P2=bb[d1];
delay
(1);
P0=0xff;//关显示
P1=0xff;
}
voidmain()
{
TMOD=0x01;//设置定时器工作方式
TH0=(65536-10000)/256;//装初值
TL0=(65536-10000)%256;
EA=1;//打开定时器总开关
ET0=1;//打开定时器分开关
TR0=1;//启动定时器0
while
(1)
{
display(2,shu%10);//个位
display(1,shu/10);//十位
display(0,shu1%10);//百位
//P0=aa[shu1%10]-0x80;
//P2=bb[0];
delay
(1);//调用延时程序
}
}
voidtim_0()interrupt1//中断服务子程序
{
TH0=(65536-10000)/256;//装初值
TL0=(65536-10000)%256;
nuber++;//设定10ms变量nuber加一次
if(nuber==1)
{
nuber=0;//nuber清零为下次计数做准备
shu++;//nuber为1时shu加一次
if(shu==100)
{
shu=0;//shu清零为下次计数做准备
shu1++;//设定1s变量shu1加一次
if(shu1==10)
{
shu1=0;//shu1清零为下次计数做准备
}
}
}
}
2、1602液晶显示
2.1设计任:
两行字符整屏移动。
2.2项目原理:
2.3项目程序设计:
整屏移动程序如下:
#include
#defineucharunsignedchar//两个宏定义
#defineuintunsignedint
sbitRS=P2^0;//定义数据选择端
sbitRW=P2^1;//定义读写选择端
sbitEN=P2^2;//使能端
ucharLCD_wangzhi[]="";//定义第一行数组
ucharLCD_xingm[]="chenyi";//定义第二行数组
voidDelayMS(uintx)//延时子程序
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//向LCD写数据
voidWrite_LCD_Data(uchardat)
{
DelayMS(10);
RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS
(1);EN=0;
}
//向LCD写命令
voidWrite_LCD_Command(ucharcmd)
{
DelayMS(10);
RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS
(1);EN=0;
}
//LCD初始化
voidInit_LCD()
{
Write_LCD_Command(0x38);DelayMS
(1);//设置1602液晶为2行16列,5*7的点阵
Write_LCD_Command(0x01);DelayMS
(1);//1602液晶初始化
Write_LCD_Command(0x06);DelayMS
(1);//设置显示地址加1
Write_LCD_Command(0x0c);DelayMS
(1);//开光标显示
}
//主函数
voidmain()
{
uchari;//定义变量
Init_LCD();//液晶LCD初始化
Write_LCD_Command(0x90);//写液晶LCD第一行的地址(在液晶外面)
for(i=0;i<13;i++)//第一行依次往左边移动一位
{
Write_LCD_Data(LCD_wangzhi[i]);//在指定的地址显示
DelayMS(200);//延时
}
Write_LCD_Command(0x80+0x50);//写液晶LCD第二行的地址(在液晶外面)
for(i=0;i<7;i++)//第二行依次往左边移动一位
{
Write_LCD_Data(LCD_xingm[i]);//在指定的地址显示chenyi
DelayMS(200);//延时
}
for(i=0;i<32;i++)//往左边移动32位
{Write_LCD_Command(0x1c);//显示器上字符全部右移一格,但光标不动
DelayMS(200);//延时一段时间
}
}
3、按键显示
3.1设计任:
将矩阵式键盘的键号显示在数码管上。
用线反转法和扫描法两种方法实现。
3.2项目原理:
3.3项目程序设计:
键盘扫描程序如下:
#include
#defineucharunsignedchar//两个宏定义
#defineuintunsignedint
ucharcodeaa[]={0xc0,0xf9,0xa4,//数码管段选
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};
ucharcmp,num;//定义两个变量
voiddelay(ucharz)//1ms的延时子程序
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmain()//主函数
{
P0=0xff;//关显示
//P2=0x01;
while
(1)
{
P1=0xfe;//第一行扫描
cmp=P1;
cmp=cmp&0xf0;//取当前值
while(cmp!
=0xf0)//判断是否有按键按下
{
delay(5);//延时消斗
cmp=P1;
cmp=cmp&0xf0;//再次取当前值
while(cmp!
=0xf0)//再次判断是否有键按下
{
cmp=P1;//把P1口的值读回来
switch(cmp)
{
case0xee:
num=1;//如果cmp的为0xee,num的值为1
break;//跳出switch语句
case0xde:
num=2;//如果cmp的为0xde,num的值为2
break;
case0xbe:
num=3;//如果cmp的为0xbe,num的值为3
break;
case0x7e:
num=4;//如果cmp的为0x7e,num的值为4
break;//跳出switch语句
}
delay(5);//延时消斗
while(cmp!
=0xf0)//松手检测
{
cmp=P1;
cmp=cmp&0xf0;
}
}
P0=aa[num-1];//把按下的值送到P1口去显示
//P2=0x01;
delay(50);//延时显示时间
}
P1=0xfd;//第二行扫描
cmp=P1;
cmp=cmp&0xf0;
while(cmp!
=0xf0)
{
delay(5);
cmp=P1;
cmp=cmp&0xf0;
while(cmp!
=0xf0)
{
cmp=P1;
switch(cmp)
{
case0xed:
num=5;
break;
case0xdd:
num=6;
break;
case0xbd:
num=7;
break;
case0x7d:
num=8;
break;
}
while(cmp!
=0xf0)
{
cmp=P1;
cmp=cmp&0xf0;
}
}
P0=aa[num-1];
//P2=0x01;
delay(50);
}
P1=0xfb;//第三行扫描
cmp=P1;
cmp=cmp&0xf0;
while(cmp!
=0xf0)
{
delay(5);
cmp=P1;
cmp=cmp&0xf0;
while(cmp!
=0xf0)
{
cmp=P1;
switch(cmp)
{
case0xeb:
num=9;
break;
case0xdb:
num=10;
break;
case0xbb:
num=11;
break;
case0x7b:
num=12;
break;
}
while(cmp!
=0xf0)
{
cmp=P1;
cmp=cmp&0xf0;
}
}
P0=aa[num-1];
//P2=0x01;
delay(50);
}
P1=0xf7;//第四行扫描
cmp=P1;
cmp=cmp&0xf0;
while(cmp!
=0xf0)
{
delay(5);
cmp=P1;
cmp=cmp&0xf0;
while(cmp!
=0xf0)
{
cmp=P1;
switch(cmp)
{
case0xe7:
num=13;
break;
case0xd7:
num=14;
break;
case0xb7:
num=15;
break;
case0x77:
num=16;
break;
}
while(cmp!
=0xf0)
{
cmp=P1;
cmp=cmp&0xf0;
}
}
P0=aa[num-1];
//P2=0x01;
delay(50);
}
}
}
4、的士计价器
4.1设计任务:
设计并制作一台出租车计价器,调试采用10赫兹脉冲信号,每个脉冲代表汽车进行10米
不同情况具有不同的收费
(1)白天1元/公里晚上2元/公里途中等待(〉30秒开始收费)1元/30秒
(2)数据输出(6位LED数码管显示)
单价(元)输出2位路程(公里)输出2位总金额(元)输出2位
(3)按键(3个)
启动计价开关数据复位白天/晚上转换
4.2项目原理:
4.3项目程序:
/*晶振:
11.0592M T1-250微秒溢出中断一次;P3.2(int0)-中断100次,查询IE0置位,
P1^0为启动键;P1^1为清除键;P1^2为白天/晚上的切换键
变量的定义:
key_val:
返回按键的值255-无键
T1_cnt:
定时器溢出数计数
cnt_30:
30秒钟的计时
cnt_distance:
计算路程
cnt_cost:
总金额
state_val:
状态:
0-白天1夜晚
cost_val[3]:
收费标准:
白天单价cost_val[0]=1元/公里;晚上单价cost_val[1]=2元/公里;
等待单价cost_val[2]=1元/30s
#include
unsignedchardatacnt_30,cnt_distance,cnt_cost;
unsignedintdataT1_cnt,D_cnt;
unsignedchardatakey_val,key_val_old;
unsignedchardatastate_val;
charcodecost_val[3]={1,2,1};
Charcodeled_seg_code[10]={0x3f,0x06,0x05b,
0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//led_seg_code[0-9]代表0-9
//-------延时-----------------
voiddelay(unsignedinti)//延时
{
while(--i);
}
//-------初始化变量------------------
voidinit_variant()//初始化一些变量的内容
{
//unsignedchari;
cnt_30=0;//30秒的计时
D_cnt=0;//脉冲的个数
cnt_distance=0;//距离的计数
cnt_cost=0;//保存总价格
}
//-------扫描键盘-----------------
unsignedcharscan_key()
{
unsignedchari,k;
i=P1;
if(i==0xff)
{
k=255;//无键按下
}
else//有键按下
{
delay(10);//延时去抖动
if(i!
=P1)
{
k=255;
}
else
{
switch(i)
{
case0xef:
k=0;break;//P1.0按下,启动键
case0xdf:
k=1;break;//P1.1按下,清除键
case0xbf:
k=2;break;//P1.2按下,切换键
}
}
}
returnk;
}
//-------数码管动态扫描-------------
voidled_show()
{
unsignedchari,k;//-----显示单价----
k=cost_val[state_val];
i=k%10;//暂存个位
P0=~led_seg_code[i];
P2=6;
delay(10);
i=k%100/10;
P0=~led_seg_code[i];
P2=7;
delay(10);//-----显示距离------
k=cnt_distance;
i=k%10;//暂存个位
P0=~led_seg_code[i];
P2=3;
delay(10);
i=k%100/10;
P0=~led_seg_code[i];
P2=4;
delay(10);//-----显示总价格-----------
k=cnt_cost;
i=k%10;//暂存个位
P0=~led_seg_code[i];
P2=0;
delay(10);
i=k%100/10;
P0=~led_seg_code[i];
P2=1;
delay(10);
}
//-------计时----------------
voidtimer1()interrupt2//T1中断
{
TH1=(65536-250)%256;
TL1=(65536-250)/256;
T1_cnt++;
if(T1_cnt>3999)//如果计数>3999,计时1s
{
T1_cnt=0;
if(cnt_30<30)//没有超过30秒,继续计时
{
cnt_30++;
}
else//超过30秒,途中等待计价
{
cnt_30=0;
cnt_cost=cnt_cost+cost_val[2];
}
}
}
//---------主程序----------------
main()
{//初始化各变量
T1_cnt=0;
state_val=0;
key_val_old=255;
init_variant();//初始化51的寄存器
TMOD=0x10;//用T1计时8位自动装载定时模式,不用T0
TH1=(65536-250)%256;//250微秒溢出一次;
TL1=(65536-250)/256;
EA=1;//开中断
ET1=1;
TR1=0;//定时器T0
TCON=0x01;//Int0中断取边沿触发模式
while
(1)
{
key_val=scan_key();//255;
if(key_val!
=key_val_old)
{
key_val_old=key_val;
if(key_val!
=255)
{
switch(key_val)
{
case0:
//启动键
TR1=1;//启动计时,TR1=1为启动了的标志
break;
case1:
init_variant();//清除变量
TR1=0;//关闭定时器
break;
case2:
//白天/黑夜的切换
if(state_val==0)
{
state_val=1;
}
else
{
state_val=0;
}
break;
}
}
}
if(IE0==1&&TR1==1)//每来1个脉冲,中断一次
{
IE0=0;
cnt_30=0;//30秒的计时清零
if(D_cnt<100)
{
D_cnt++;
}
else//计数100次,每次10米,表示一公里
{
D_cnt=0;
cnt_distance=cnt_distance+1;
cnt_cost=cnt_cost+cost_val[state_val];
}
}
led_show();
}
}
参考文献
肖洪兵.跟我学用单片机.北京:
北京航空航天大学出版社,2002.8
何立民.单片机高级教程.第1版.北京:
北京航空航天大学出版社,2001
赵晓安.MCS-51单片机原理及应用.天津:
天津大学出版社,2001.3
李广第.单片机基础.第1版.北京:
北京航空航天大学出版社,1999
徐惠民、安德宁.单片微型计算机原理接口与应用.第1版.北京:
北京邮电大学出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计