单片机程序汇总,大家参考一下剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第八章4节支持手打!!
#include<reg51.h>
#include <math.h>
#define PI 3.1415
unsigned int num;
void main() {
while (1) {
for (num = 0 ; num < 360 ; num++)
P2= 127 +127 * sin((float)num / 180 * PI);
}
}
#include<absacc.h>
#define DAC0832 XBYTE[0xfeff] //设置DAC0832的访问地址unsigned char num;
void main() {
while (1) {
for (num = 0 ; num < 255 ; num++) //上升段波形
DAC0832=num;
for (num = 255 ; num > 0 ; num--) //下降段波形
DAC0832=num;
//DAC0832转换输出
}
}
#include<absacc.h>
#include<reg51.h>
#define DAC1 XBYTE[0xfeff] //设置1#DAC0832输入锁存器的访问地址#define DAC2 XBYTE[0xfdff] //设置2#DAC0832输入锁存器的访问地址#define DAOUT XBYTE[0xefff] //两个DAC0832的DAC寄存器访问地址void main (void){
unsigned char num; //需要转换的数据
while(1){
for(num =0; num <=255; num++){
DAC1 = num; //上锯齿送入1#DAC
DAC2 = 255-num; //下锯齿送入2#DAC
DAOUT = num; //两路同时进行D/A转换输出
}
}
}
/*发送程序*/
#include<reg51.h>
#define uchar unsigned char
char code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'
void delay(unsigned int time){
unsigned int j = 0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void main(void){
uchar counter=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);
}
}
}
/*接收程序*/
#include<reg51.h>
#define uchar unsigned char
char code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'
void main(void){
uchar receiv; //定义接收缓冲
TMOD=0x20; //T1定时方式2
TH1=TL1=0xf4; //2400b/s
PCON=0; //波特率不加倍
SCON=0x50; //串口方式1,TI和RI清零,允许接收;
TR1=1; //启动T1
while(1){
while(RI==1){ //等待接收完成
RI = 0; //清RI标志位
receiv = SBUF; //取得接收值
SBUF = receiv; //结果返送主机
while(TI==0); //等待发送结束
TI = 0; //清TI标志位
P2 = map[receiv];//显示接收值
}
}
}
第六章
方式一。
查询方式:#include <reg51.h>
sbit P2_0=P2^0;
void main (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
}
}
中断方式:#include <reg51.h>
sbit P2_0=P2^0;
void timer0 (void) interrupt 1 {
P2_0 = !P2_0; //P1.0取反
TH0 = 0xfc; //计数初值重装载
TL0 = 0x18;
}
void main (void) {
TMOD = 0x01; //T0定时方式1
P2_0=0;
TH0=0xfc; //预置计数初值
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
do { } while (1);
}
方式2
中断方式
#include <reg51.h>
sbit P2_0=P2^0;
timer0 () interrupt 1 { //T0定时中断
P2_0 = !P2_0; //P1.0取反
}
main(){
TMOD = 0x02; //T0定时方式2
TH0 = TL0 = 0x06;
EA= ET0 = 1;
TR0=1;
while(1);
}
#include <reg51.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char count=0; //计数器赋初值
int0_srv () interrupt 1{ //T0中断函数
if(++count==100) count=0; //判断循环是否超限
P0=table[count/10]; //显示十位数
P2=table[count%10]; //显示个位数
}
main(){
P0=P2=table[0]; //显示初值“00”
TMOD=0x06; //T0计数方式2
TH0=TL0=0xff; //计数初值
ET0=1; //开中断
EA=1;
TR0=1; //启动T0
while(1);
}
计数
#include <reg51.h>
sbit P3_0=P3^0;
void main (){
TMOD = 0x06; //设置为T0计数方式2
TL0 = 0xff; //初值0xff可使1个外来脉冲即产生溢出TR0 = 1; //启动计数器
while (1){
while (!TF0); //等待首次溢出
TF0 = 0; //清TF0溢出标志
TMOD = 0x02; //设置为T0定时方式2
TL0=0x06; //500微秒定时初值
P3_0 = 0;
while (!TF0); //等待再次溢出
TF0 = 0; //清TF0溢出标志
P3_0 = 1;
TMOD = 0x06; //设置为T0计数方式2
TL0 = 0xff; //1次溢出计数初值
}
}
#include <reg51.h>
#define uchar unsigned char
uchar time; //中断次数
uchar period=250; //1个周期的次数
uchar high=50; //20%高电平的次数
timer0() interrupt 1{//T0中断函数
TH0=0xd1; //重装载计数初值
TL0=0x20;
if (++time==high) P2=0;//高电平时间到,P2变低else if (time==period)
{time=0;P2=1;}//周期时间到,P2变高
}
void main (){
TMOD = 0x01; //T0定时方式1
TH0 = 0xd1; //首次装入计数初值
TL0 = 0x20;
EA=ET0=1;
TR0 = 1; //启动计数器
do { }while (1);
}
#include <reg51.h>
#define uchar unsigned char
bit ldelay=0; //长定时溢出标记
uchar t=0; //定时溢出次数
void main(void) {
uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar ledi; //指示显示顺序
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() interrupt 1 { //T0中断函数
if(++t==20){t=0; ldelay=1;}//刷新长定时溢出标记
TH0 =0x3c;TL0 =0xb0; //重置T0初值
}
第五章
#include <reg51.h>
char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //led字模
0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
char key_buf[] = {0xee, 0xde, 0xbe, 0x7e,0xed, 0xdd, 0xbd, 0x7d,//键值
0xeb, 0xdb, 0xbb, 0x7b,0xe7, 0xd7, 0xb7, 0x77};
void getKey () interrupt 0{ //中断函数char key_scan[] = {0xef, 0xdf, 0xbf, 0x7f}; //键扫描码
char i = 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; //为下次中断做准备
}
void main(void) {
P0 = 0x00; //开机黑屏
IT0=1; //脉冲触发
EX0=1; //INT0允许
EA=1; //总中断允许
P2 = 0x0f; //为首次中断做准备,列线全为0,行线全为1
while(1); //模拟其他程序功能
}
#include "reg51.h"
char led[]={0xfe,0xfd,0xfb,0xf7};//LED花样数据
bit dir=0,run=0; //全局变量
void delay(unsigned int time);
key() interrupt 0{ //键控中断函数
switch (P0 & 0x0f){ //修改标志位状态
case 0x0e:run=1;break;
case 0x0d:run=0,dir=0;break;
case 0x0b:dir=1;break;
case 0x07:dir=0;break;
}}
void main(){
char i;
IT0=1;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--){
P2=led[i];
delay(200);
}
else P2=0xff; //若run=0,灯全灭
}}
void delay(unsigned int time){
unsigned int j = 0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
#include "reg51.h"
char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //led字模
0x7f,0x6f}; //显示字模
sbit D1=P3^0;
void delay(unsigned int time){//延时
unsigned char j=255;
for(;time>0;time--)
for(;j>0;j--);
}
key0() interrupt 0 { //K0中断函数
unsigned char i;
D1=IE0; //IE0状态输出
for(i=0;i<=9;i++){ //字符0-9循环1圈
P2=led_mod[i];
delay(35000);
}P2=0x40; //结束符“-”
}
key1() interrupt 2 { //K1中断函数
unsigned char i;
for(i=0;i<=9;i++){ //字符0-9循环1圈
D1=IE0; //IE0状态输出
P1=led_mod[i];
delay(35000);
}P1=0x40; //结束符“-”
}
void main(){
unsigned char i;
TCON = 0x05; //脉冲触发方式
PX0=0;PX1=1; //INT1优先
D1=0;P1=P2=0x40; //输出初值
IE=0x85; //开中断
while(1){
for(i=0;i<=9;i++){ //字符0-9无限循环
P0=led_mod[i];
delay(35000);
}
}
}
第四章
//实例1 独立按键识别
#include <REG51.H>
void main() {
char key = 0;
while(1){
key = P0 & 0x0f; //读取按键状态
if (key != 0x0f) P2 = key; //显示到led }
}
#include "reg51.h"
unsigned char led[]={0xfe,0xfd,0xfb,0xf7}; //LED灯的花样数据
void delay(unsigned char time){ //延时函数
unsigned int j=15000;
for(;time>0;time--)
for(;j>0;j--);
}
void main(){
bit dir=0,run=0; //标志位定义及初始化
char i;
while(1){
switch (P0 & 0x0f){ //读取键值
case 0x0e:run=1;break; //K1动作,设run=1
case 0x0d:run=0,dir=0;break;//K2动作,设run=dir=0
case 0x0b:dir=1;break; //K3动作,设dir=1
case 0x07:dir=0;break; //K4动作,设dir=0
}
if (run) //若run=dir=1, 自上而下流动if(dir)
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else //若run=1,dir=0, 自下而上流动
for(i=3;i>=0;i--){
P2=led[i];
delay(200);
}
else P2=0xff; //若run=0,灯全灭}
}
#include <reg51.H>
sbit P3_7=P3^7; //定义计数器端口
unsigned char count =0; //定义计数器
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int time){
unsigned int j = 0;
for (;time>0;time --)
for(j = 0;j<125;j++);
}
void main(void) {
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); //等待按键抬起,防止连续计数}
}
}
}。