单片机C语言程序设计实训99例Word文档格式.doc
- 文档编号:8452194
- 上传时间:2023-05-11
- 格式:DOC
- 页数:77
- 大小:1.92MB
单片机C语言程序设计实训99例Word文档格式.doc
《单片机C语言程序设计实训99例Word文档格式.doc》由会员分享,可在线阅读,更多相关《单片机C语言程序设计实训99例Word文档格式.doc(77页珍藏版)》请在冰点文库上搜索。
//数码管位码
ucharcodeDSY_Index[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//待显示数字(10为不显示)
ucharcodeBCD_CODE[]={2,0,1,0,10,3,10,5};
uchark;
for(k=0;
k<
8;
k++)
P2=DSY_Index[k];
P1=BCD_CODE[k];
DelayMS
(1);
11MAX7221控制数码管动态显示
MAX7221控制数码管动态显示
本例用MAX7221控制8只数码管动态显示,这样大大减少了单片机引脚和机器时间的占用。
intrins.h>
sbitDIN=P2^0;
sbitCSB=P2^1;
sbitCLK=P2^2;
ucharDisp_Buffer[]={2,0,1,5,10,5,10,9};
//显示缓冲,10为“-”
//写数据
voidWrite(ucharAddr,ucharDat)
CSB=0;
for(i=0;
i++)
CLK=0;
Addr<
<
=1;
DIN=CY;
CLK=1;
_nop_();
CLK=0;
Dat<
CSB=1;
//MAX7221初始化
voidInitialise()
Write(0x09,0xff);
//编码模式地址0x090x00~0xff,为1的则位选通
Write(0x0a,0x07);
//亮度地址0x0a0x00~0x0f,0x0f最亮
Write(0x0b,0x07);
//扫描数码管个数地址0x0b,最多扫描8只数码管
Write(0x0c,0x01);
//工作模式地址0x0c0x00:
关闭;
0x01:
正常
Initialise();
//初始化
DelayMS
(1);
i++) //显示8个数码管
Write(i+1,Disp_Buffer[i]);
while
(1);
12LCD1602字符液晶滚动演示程序
//main.c
LCD1602字符液晶滚动演示程序
K1~K3按钮分别实现液晶垂直或水平滚动显示及暂停与继续控制。
string.h>
#defineucharunsignedchar
voidInitialize_LCD();
voidDelayMS(uintms);
voidShowString(uchar,uchar,uchar*);
sbitK1=P3^0;
sbitK2=P3^1;
sbitK3=P3^2;
ucharcodePrompt[]="
PressK1-K3ToStartDemoProg"
;
//待滚动显示的信息段落,每行不超过80个字符,共6行
ucharconstLine_Count=6;
ucharcodeMsg[][80]=
"
ManyCADusersdismissschematiccaptureasanecessaryevilinthe"
processofcreatingPCBlayoutbutwehavealwaysdisputedthispoint"
ofview.WithPCBlayoutnowofferingautomationofbothcomponent"
canoftenbethemosttimeconsumingelementoftheexercise."
Andifyouusecircuitsimulationtodevelopyourideas,"
youaregoingtospendevenmoretimeworkingontheschematic."
};
//显示缓冲(2行)
ucharDisp_Buffer[32];
//垂直滚动显示
voidV_Scroll_Display()
uchari,j,k=0;
uchar*p=Msg[0];
uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);
//以下仅使用显示缓冲的前16字节空间
while(p<
q)
for(i=0;
16&
&
p<
q;
{ //消除显示缓冲中待显示行首尾可能出现的空格
if((i==0||i==15)&
*p=='
'
)p++;
if(*p!
='
\0'
)
{
Disp_Buffer[i]=*p++;
}
else
if(++k>
Line_Count)break;
p=Msg[k];
//p指向下一串的首地址
//不足16个字符时空格补充
for(j=i;
j<
16;
j++)Disp_Buffer[j]='
//垂直滚动显示
while(F0)DelayMS(5);
ShowString(0,0,"
"
);
DelayMS(150);
ShowString(0,1,Disp_Buffer);
ShowString(0,0,Disp_Buffer);
ShowString(0,1,"
//最后清屏
ShowString(0,0,"
ShowString(0,1,"
//水平滚动显示
voidH_Scroll_Display()
uchari,j,k=0,L=0;
//将32个字符的显示缓冲前16个字符设为空格
i++)Disp_Buffer[i]='
//忽略缓冲中首尾可能出现的空格
if((i==16||i==31)&
for(i=16;
32&
{
//不足32个字符时空格补充
32;
//水平滚动显示
=16;
while(F0)DelayMS(5);
ShowString(0,L,Disp_Buffer+i);
DelayMS(20);
L=(L==0)?
1:
0;
//行号在0,1间交替
DelayMS(300);
//如果显示结束时停留在第0行,则清除第1行的内容
if(L==1)ShowString(0,1,"
//外部中断0,由K3控制暂停与继续显示
voidEX_INT0()interrupt0
F0=!
F0;
//暂停与继续显示控制标志位
uintCount=0;
IE=0x81;
//允许外部中断0
IT0=1;
//下降沿触发
F0=0;
//暂停与继续显示控制标志位
Initialize_LCD();
ShowString(0,0,Prompt);
ShowString(0,1,Prompt+16);
if(K1==0)
V_Scroll_Display();
DelayMS(300);
else
if(K2==0)
H_Scroll_Display();
//LCD1602.c
液晶控制与显示程序
本程序是通用的1602液晶控制程序。
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
//忙检查
ucharBusy_Check()
ucharLCD_Status;
RS=0;
//寄存器选择
RW=1;
//读状态寄存器
EN=1;
//开始读
LCD_Status=P0;
EN=0;
returnLCD_Status;
//写LCD命令
voidWrite_LCD_Command(ucharcmd)
while((Busy_Check()&
0x80)==0x80);
//忙等待
//选择命令寄存器
RW=0;
//写
P0=cmd;
EN=1;
DelayMS
(1);
EN=0;
//发送数据
voidWrite_LCD_Data(uchardat)
RS=1;
RW=0;
P0=dat;
//LCD初始化
voidInitialize_LCD()
Write_LCD_Command(0x38);
Write_LCD_Command(0x01);
//清屏
Write_LCD_Command(0x06);
//字符进入模式:
屏幕不动,字符后移
Write_LCD_Command(0x0c);
//显示开,光标关
//显示字符串
voidShowString(ucharx,uchary,uchar*str)
uchari=0;
if(y==0)Write_LCD_Command(0x80|x);
//设置显示起始位置
if(y==1)Write_LCD_Command(0xc0|x);
i++) //输出字符串
Write_LCD_Data(str[i]);
13
19用ADC0808控制PWM输出
用ADC0808控制PWM输出
使用数模转换芯片ADC0808,通过调节可变电阻RV1来调节脉冲宽度,
运行程序时,通过虚拟示波器观察占空比的变化。
sbitCLK=P2^4;
//时钟信号
sbitST=P2^5;
//启动信号
sbitEOC=P2^6;
//转换结束信号
sbitOE=P2^7;
//输出使能
sbitPWM=P3^0;
//PWM输出
40;
ucharVal;
TMOD=0x02;
//T1工作模式2
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
ST=0;
ST=1;
ST=0;
//启动A/D转换
while(!
EOC);
//等待转换完成
OE=1;
Val=P1;
//读转换值
OE=0;
if(Val==0) //PWM输出(占空比为0%)
PWM=0;
DelayMS(0xff);
continue;
if(Val==0xff) //PWM输出(占空比为100%)
PWM=1;
PWM=1;
//PWM输出(占空比为0%~100%)
DelayMS(Val);
PWM=0;
DelayMS(0xff-Val);
//T0定时器中断给ADC0808提供时钟信号
voidTimer0_INT()interrupt1
CLK=~CLK;
20ADC0809数模转换与显示
ADC0809数模转换与显示
ADC0809采样通道3输入的模拟量,转换后的结果显示在数码管上。
//各数字的数码管段码(共阴)
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbitCLK=P1^3;
sbitST=P1^2;
sbitEOC=P1^1;
sbitOE=P1^0;
//显示转换结果
voidDisplay_Result(uchard)
P2=0xf7;
//第4个数码管显示个位数
P0=DSY_CODE[d%10];
DelayMS(5);
P2=0xfb;
//第3个数码管显示十位数
P0=DSY_CODE[d%100/10];
P2=0xfd;
//第2个数码管显示百位数
P0=DSY_CODE[d/100];
P1=0x3f;
//选择ADC0809的通道3(0111)(P1.4~P1.6)
while(EOC==0);
Display_Result(P3);
01 闪烁的LED
/* 名称:
闪烁的LED
LED按设定的时间间隔闪烁
sbitLED=P1^0;
voidDelayMS(uintx)
while(x--)
LED=~LED;
02从左到右的流水灯
从左到右的流水灯
接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果
P0=0xfe;
P0=_crol_(P0,1);
//P0的值向左循环移动
038只LED左右来回点亮
8只LED左右来回点亮
程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
P2=0x01;
7;
P2=_crol_(P2,1);
//P2的值向左循环移动
DelayMS(150);
P2=_cror_(P2,1);
//P2的值向右循环移动
04花样流水灯
花样流水灯
16只LED分两组按预设的多种花样变换显示
ucharcodePattern_P0[]=
0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言程序设计 99