#define uchar unsigned char
*/
#define uint unsigned int #define outk P1 #define out1 P0 #define out2 P2
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar key,send,rec; uchar scan(void); void delay(unit); void main(void) {
TMOD=0X20;
/* 设置定时器 T1 为方式 2*/ TH1=0XF2;
/* 给定时器 T1 赋初值 */
TH1=0XF2;
TR1=1;
/* 接通定时器
T1*/ SCON=0X50;
/* 串行口方式 1, REN=1 允许接收PCON=0X00;
/* SMOD=0*/
EA=1; ES=1; EX1=1; EX0=1; while(1) {
outk=0x07; out1=seg[send]; out2=seg[rec]; } }
uchar scan(void) {
uchar k=10,m,n,in; delay(10); outk=0x07;
if((outk&0x07)!=0x07) {
for(m=0;m<3;m++) {
outk=~(0x01<<(m+3)); for(n=0;n<3;n++) {
in=outk; in=in>>n;
if((in&0x01)==0) {
if((in&0x01)==0)
*/
{
k=n+m*3;
break; } } }
if(k!=10)break; } }
return(k); }
void delay(uint j) {
uchar i; for(;j>0;j--) {
i=250; while(--i); i=249; while(--i); } }
void ext0()interrupt 0 {
EX0=0; key=scan();
if(key!=10)send=key+1; EX0=1; }
void ext1()interrupt 2 {
ES=0;
SBUF=send; while(!TI); TI=0; ES=1; }
void com()interrupt 4 {
RI=0; rec=SBUF; }
5、单片机与 PC 串行通信
#include void send(unsigned char dat) {
SBUF=dat; while(TI==0); ; TI=0;
}
void init_tx() {
EA=1; EX0=1;
}
void delay(void) {
unsigned char m,n; for(m=0;m<250;m++) for(n=0;n<250;n++) ;
}
void main(void) {
init_tx(); TMOD=0x20; SCON=0x40; PCON=0x00; TH1=0xfd; TL1=0xfd; TR1=1; while(1);
}
void tx0() interrupt 0 {
unsigned char i=0; send(0x01); delay(); i++;
}
6、扩展 82c55 并行 IO 接口 #include #include#define uchar unsigned char #define uint unsigned int
sbit rst_8255=P3^5; #define con_8255 #define pa_8255 #define pb_8255 void delay(uint); void main(void) {
uchar temp; rst_8255=1; delay(1); rst_8255=0;
con_8255=0x82;
XBYTE[0x7003] XBYTE[0x7000] XBYTE[0x7001]
/*0x7003 为 82C55 的控制寄存器地址
*/
/* 以下定义 pa、pb 的端口地址 */
void reset_8255(void);
/* 复位 */
while(1) {
temp=pb_8255; pa_8255=temp;
}
/* 锁存 */
}
void delay(uint j)
/* 延时函数 */
{
uchar i; for(;j>0;j--) {
i=250; while(--i); i=249; while(--i); } }
7、矩阵键盘
#include unsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay() {
unsigned char i,j; for(i=0;i<=25;i++)
for(j=0;j<=25;j++);
}
unsigned char key_scan() {
unsigned char key0,key1; unsigned char key_num=0;
(延时)
P1=0x0f; key0=P1;
先将 p1.0~P1.3 置高
if(key0!=0x0f) 如果 P1.4~P1.7 不全为 1,可能有键按下 {
delay(); key0=P1; if(key0!=0x0f) {
P1=0xf0; key1=P1; if(key0==0x0e) {
switch(key1) {
case 0xe0: key_num=0;break; case 0xd0: key_num=1;break; case 0xb0: key_num=2;break; case 0x70: key_num=3;break; default: key_num=0;break; } }
else if(key0==0x0d) {
switch(key1) {
case 0xe0: key_num=4;break;
case 0xd0: key_num=5;break; ( 处理 5 号键 ) case 0xb0: key_num=6;break; case 0x70: key_num=7;break; default: key_num=0;break; } }
else if(key0==0x0b) {
switch(key1) {
case 0xe0: key_num=8;break; case 0xd0: key_num=9;break; case 0xb0: key_num=10;break; case 0x70: key_num=11;break; default: key_num=0;break;
} }
else if(key0==0x07)
(无效按键,如多个键同时按下)
{
switch(key1) {
case 0xe0: key_num=12;break; case 0xd0: key_num=13;break; case 0xb0: key_num=14;break; case 0x70: key_num=15;break; default: key_num=0;break;
} } } }
return key_num; }
void main() {
unsigned char key_num; do{
key_num=key_scan(); P2=table[key_num]; }while(1); }
8、 1602 液晶显示 #include #include#define uchar unsigned char #define uint unsigned int #define out P0 sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2;
void lcd_initial(void); void check_busy(void);
void write_command(uchar com); void write_data(uchar dat); void string(uchar ad,uchar *s); void lcd_test(void); void delay(uint); void main(void) {
lcd_initial(); while(1)
{
string(0x82,\"Hello Welcome\");
string(0xC2,\"To China\"); delay(100);
write_command(0x01); delay(100); } }
void delay(uint j) {
uchar i=250; for(;j>0;j--) {
while(--i); i=249; while(--i); i=250; } }
void check_busy(void) {
uchar dt; do {
dt=0xff; E=0; RS=0; RW=1; E=1; dt=out; }while(dt&0x80); E=0; }
void write_command(uchar com) {
check_busy(); E=0; RS=0; RW=0; out=com; E=1;
_nop_(); E=0; delay(1); }
void write_data(uchar dat) {
check_busy(); E=0; RS=1; RW=0; out=dat; E=1; _nop_(); E=0; delay(1); }
void lcd_initial(void) {
write_command(0x3c); write_command(0x0C); write_command(0x14); write_command(0x01); delay(1); }
void string(uchar ad,uchar *s) {
write_command(ad); while(*s>0) {
write_data(*s++); delay(100); } }
9、 DA 转换
#include#define uchar unsigned char #define uint unsigned int #define out P1 sbit DAC_cs=P2^0; sbit DAC_wr=P2^1; void main(void)
{
uchar temp,i=255; while(1) {
{
out=temp;
DAC_cs=0;
DAC_wr=0; DAC_cs=1;
/* 片选端,芯片被选中
*/
/* 选通,并被锁存 */
/* 以下开始转换 */
DAC_wr=1;
temp++; while(--i);
/* 延时函数!!,老师帮改的}
} }
10、 AD 转换 #include#define uchar unsigned char
#define uint unsigned int #define LED P0 #define out P1 sbit start=P2^1; sbit OE=P2^7; sbit EOC=P2^3; sbit CLOCK=P2^0; sbit add_a=P2^4; sbit add_b=P2^5; sbit add_c=P2^6; void main(void) {
uchar temp; add_a=0; add_b=0; add_c=0; while(1) {
start=0; start=1; start=0; while(1) {
CLOCK=!CLOCK; if(EOC==1) {
*/
break;} OE=1; temp=out; OE=0;
LED=temp;
} } }